Three.js css2d Css3D的利用

[复制链接]
发表于 2025-12-8 10:21:33 | 显示全部楼层 |阅读模式
Three.js css2d Css3D的利用
  1. import * as THREE from 'three'
  2. import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
  3. import { CSS2DRenderer, CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js'
  4. import { CSS3DRenderer, CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.js'
  5. const DOM = document.getElementById('box')
  6. const scene = new THREE.Scene()
  7. const camera = new THREE.PerspectiveCamera(75, DOM.clientWidth / DOM.clientHeight, 0.1, 1000)
  8. camera.position.set(10, 10, 10)
  9. const renderer = new THREE.WebGLRenderer()
  10. renderer.setSize(DOM.clientWidth, DOM.clientHeight)
  11. DOM.appendChild(renderer.domElement)
  12. new OrbitControls(camera, renderer.domElement)
  13. scene.add(new THREE.AxesHelper(500))
  14. // Css3DOM
  15. const css3DRender = setCss3DRenderer(DOM)
  16. // Css2DOM
  17. const css2DRender = setCss2DRenderer(DOM)
  18. const setCss2dDOM = (DOM, position) => {
  19.     DOM.style.pointerEvents = 'auto'
  20.     const mesh = new CSS2DObject(DOM)
  21.     mesh.position.copy(position)
  22.     scene.add(mesh)
  23.     return mesh
  24. }
  25. const setCss3dDOM = (DOM, position) => {
  26.     const mesh = new CSS3DObject(DOM)
  27.     mesh.position.copy(position)
  28.     scene.add(mesh)
  29.     return mesh
  30. }
  31. for (let i = 0; i < 5; i++) {
  32.     setCss2dDOM(createDom('2D' + i), { x: 0, y: 0, z: i * 2 }) // 2d dom
  33.     setCss3dDOM(createDom('3D' + i), { x: 0, y: i * 2, z: 0 }).scale.multiplyScalar(0.02) // 3d dom
  34. }
  35. animate()
  36. function animate() {
  37.     requestAnimationFrame(animate)
  38.     renderer.render(scene, camera)
  39.     css3DRender.render(scene, camera) // Css3D渲染
  40.     css2DRender.render(scene, camera) // Css2D渲染
  41. }
  42. window.onresize = () => {
  43.     renderer.setSize(box.clientWidth, box.clientHeight)
  44.     camera.aspect = box.clientWidth / box.clientHeight
  45.     camera.updateProjectionMatrix()
  46.     css3DRender.resize()
  47.     css2DRender.resize()
  48. }
  49. // 创建dom
  50. function createDom(text) {
  51.     const div = document.createElement('div')
  52.     const img = document.createElement('img')
  53.     img.src = `https://threehub.cn/` + '/files/author/z2586300277.png'
  54.     img.style.width = '50px'
  55.     img.style.height = '50px'
  56.     div.appendChild(img)
  57.     div.innerHTML += text
  58.     div.style.color = 'white'
  59.     return div
  60. }
  61. /* css2d渲染 */
  62. function setCss2DRenderer(DOM) {
  63.     const css2DRender = new CSS2DRenderer()
  64.     css2DRender.resize = () => {
  65.         css2DRender.setSize(DOM.clientWidth, DOM.clientHeight)
  66.         css2DRender.domElement.style.zIndex = 0
  67.         css2DRender.domElement.style.position = 'relative'
  68.         css2DRender.domElement.style.top = -DOM.clientHeight * 2 + 'px'
  69.         css2DRender.domElement.style.height = DOM.clientHeight + 'px'
  70.         css2DRender.domElement.style.width = DOM.clientWidth + 'px'
  71.         css2DRender.domElement.style.pointerEvents = 'none'
  72.     }
  73.     css2DRender.resize()
  74.     DOM.appendChild(css2DRender.domElement)
  75.     return css2DRender
  76. }
  77. /* css3d 渲染 */
  78. function setCss3DRenderer(DOM) {
  79.     const css3DRender = new CSS3DRenderer()
  80.     css3DRender.resize = () => {
  81.         css3DRender.setSize(DOM.clientWidth, DOM.clientHeight)
  82.         css3DRender.domElement.style.zIndex = 0
  83.         css3DRender.domElement.style.position = 'relative'
  84.         css3DRender.domElement.style.top = -DOM.clientHeight + 'px'
  85.         css3DRender.domElement.style.height = DOM.clientHeight + 'px'
  86.         css3DRender.domElement.style.width = DOM.clientWidth + 'px'
  87.         css3DRender.domElement.style.pointerEvents = 'none'
  88.     }
  89.     css3DRender.resize()
  90.     DOM.appendChild(css3DRender.domElement)
  91.     return css3DRender
  92. }
  93. /**
  94. * 名称: CSS元素
  95. * 作者: 优雅永不过时 https://github.com/z2586300277
  96. */
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表