threejs CSS3DRenderer添加标签并设置朝向摄像机

一.由于CSS3DRenderer 是附加组件,必须显式导入
复制代码
import { CSS3DRenderer, CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.js';
二.CSS3DRenderer特点

CSS3D不面向摄像机,会跟随场景缩放,不被模型遮挡,通过DOM事件点击

但是由于项目要求label时刻面向摄像机,因此需要在每次刷新更新lookat朝向,可参考以下代码

javascript 复制代码
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()
三.完整代码

从项目中抽出来的,可能有缺漏,欢迎大家补充

javascript 复制代码
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()
相关推荐
福兮说4 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理5 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6666 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)6 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan6 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_7 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒7 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技7 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu8 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
默_笙9 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript