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()
相关推荐
崔庆才丨静觅2 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅3 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅3 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅4 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊4 小时前
jwt介绍
前端
爱敲代码的小鱼4 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax