赞
踩
import { CSS3DRenderer, CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.js';
CSS3D不面向摄像机,会跟随场景缩放,不被模型遮挡,通过DOM事件点击
但是由于项目要求label时刻面向摄像机,因此需要在每次刷新更新lookat朝向,可参考以下代码
function updateLabel(nodeName){
// nodeName添加标签时记得赋予name属性
const node = scene.getObjectByName(nodeName);// 返回一个匹配该名字的子对象
const cameraPosition = camera.position.clone();
node?.lookAt(cameraPosition);
}
// 循环渲染
function animate() {
requestAnimationFrame(animate);
renderer_3d.render(scene, camera);
updateLabel(nodeName) // label朝向camera
}
animate()
从项目中抽出来的,可能有缺漏,欢迎大家补充
import * as THREE from 'three'; import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' import { CSS3DRenderer, CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.js'; // 创建场景 const scene = new THREE.Scene(); // 创建CSS3DRenderer渲染器, 相机, 控制器 const renderer_3d = new CSS3DRenderer(); renderer_3d.setSize(window.innerWidth, window.innerHeight); renderer_3d.domElement.style.position = 'absolute'; renderer_3d.domElement.style.top = '0px'; //DOM添加renderer : 我是使用umi写的containerRef.current是我的DOM容器(视个人项目情况而定) containerRef.current.appendChild(renderer_3d.domElement); // 创建相机 const camera = new new THREE.PerspectiveCamera(100, window.innerWidth / window.innerHeight, 0.1,1000); camera.lookAt(0, 0, 0) camera.updateProjectionMatrix(); // 创建控制器 const controls_3d = new OrbitControls(camera, renderer_3d.domElement); controls3.enableDamping = true; // 是否有惯性 controls3.enableZoom = true; // 是否可以缩放 //添加标签文字 const tag = create3DTag({ name: '教学楼' }); //创建CSS3DObject标签元素 function create3DTag(obj) { const element = document.createElement('div'); element.className = 'tag'; element.innerText = obj.name; const object = new CSS3DObject(element); element.style.pointerEvents = 'none';//避免HTML标签遮挡三维场景的鼠标事件 object.name='tag_3d' // 注:name不可缺 object.visible = true; object.scale.set(2,2,2);//缩放比例 object.position.set(10, 20, 0);//指定摆放位置 return object; } // 更新CSS3D朝向 function updateLabel(nodeName){ const node = scene.getObjectByName(nodeName);// 返回一个匹配该名字的子对象 const cameraPosition = camera.position.clone(); node?.lookAt(cameraPosition); } // 循环渲染 function animate() { requestAnimationFrame(animate); renderer_3d.render(scene, camera); updateLabel(nodeName) // label朝向camera } animate()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。