当前位置: 首页 > news >正文

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

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

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()
http://www.lryc.cn/news/221784.html

相关文章:

  • 基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(简单支持发起人与审批人的流程)续
  • 虚幻引擎:如何进行关卡切换?
  • 工具类xxxUtil从application.properties中读取参数
  • 三国志14信息查询小程序(历史武将信息一览)制作更新过程05-后台接口的编写及调用
  • 时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测
  • useEffect和useLayoutEffect的区别
  • [科研图像处理]用matlab平替image-j,有点麻烦,但很灵活!
  • Node.js |(五)包管理工具 | 尚硅谷2023版Node.js零基础视频教程
  • 【ES专题】ElasticSearch集群架构剖析
  • Kafka与Flink的整合 -- sink、source
  • 小鱼ROS
  • 简单讲讲RISC-V跳转指令基于具体场景的实现
  • 第13章 Java IO流处理(一) File类
  • 测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)
  • pytorch中的矩阵乘法
  • Java--Stream流详解
  • [PHP]ShopXO企业级B2C免费开源商城系统 v2.3.1
  • Python基础入门系列详解20篇
  • P02项目(学习)
  • pandas 笔记:get_dummies分类变量one-hot化
  • PTE作文练习(一)
  • 如何做到一套FPGA工程无缝兼容两款不同的板卡?
  • VSCode修改主题为Eclipse 绿色护眼模式
  • conan和cmake编译器版本不匹配问题解决
  • float单精度浮点数如何在计算机中存储
  • 机器视觉在虚拟现实与增强现实中的作用
  • 红黑数原理及存在原因
  • Ansible入门—安装部署及各个模块应用案例(超详细)
  • Spring Boot 3系列之-启动类详解
  • muduo源码剖析之Timer定时器