当前位置: 首页 > 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()

相关文章:

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

一.由于CSS3DRenderer 是附加组件,必须显式导入 import { CSS3DRenderer, CSS3DObject } from three/examples/jsm/renderers/CSS3DRenderer.js;二.CSS3DRenderer特点 CSS3D不面向摄像机,会跟随场景缩放,不被模型遮挡,通过DOM事…...

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(简单支持发起人与审批人的流程)续

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 之前生产的xml,在bpmn设计里编辑有些内容不正确,包括审批人,关联表单等…...

虚幻引擎:如何进行关卡切换?

一丶非无缝切换 在切换的时候会先断开连接,等创建好后才会链接,造成体验差 蓝图中用到的节点是 Execute Console Command 二丶无缝切换 链接的时候不会断开连接,中间不会出现卡顿,携带数据转换地图 1.需要在gamemode里面开启无缝漫游,开启之后使用上面的切换方式就可以做到无缝…...

工具类xxxUtil从application.properties中读取参数

一.原因 编写一个服务类的工具类,想做成一个灵活的配置,各种唯一code想从配置文件中读取,便有了这个坑。 二.使用value获取值为null, 这是因为这个工具类没有交给spring boot 来管理,导致每次都是new 一个新的,所以每…...

三国志14信息查询小程序(历史武将信息一览)制作更新过程05-后台接口的编写及调用

1,创建ASP.NET Web API项目 生成完毕,项目结构如下: 运行看一下: 2,后台接口编写 (1)在Models文件夹中新建一个sandata.cs文件(就是上篇中武将信息表的model文件) u…...

时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现SVM-Adaboost时间序列预测(风…...

useEffect和useLayoutEffect的区别

烤冷面加辣条的抖音 - 抖音 (douyin.com) 一、看下面的代码,即使调换useLayoutEffect和useEffect的位置依旧是useLayoutEffect先输出。 import { useState, useEffect, useLayoutEffect } from "react"; const Index () > {useLayoutEffect(() >…...

[科研图像处理]用matlab平替image-j,有点麻烦,但很灵活!

做材料与生物相关方向的同学应该对image-j并不陌生,前几天有个师兄拜托我用image-j分析一些图片,但使用过后发现我由于不了解image-j的工作流程而对结果并不确信,而且image-j的功能无法拓展,对有些图片的处理效果并不好&#xff0…...

Node.js |(五)包管理工具 | 尚硅谷2023版Node.js零基础视频教程

学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手 文章目录 📚概念介绍📚npm🐇安装npm🐇基本使用🐇生产依赖与开发依赖🐇npm全局安装🐇npm安装指定包和删除…...

【ES专题】ElasticSearch集群架构剖析

目录 前言阅读对象阅读导航要点笔记正文一、ES集群架构1.1 为什么要使用ES集群架构1.2 ES集群核心概念1.2.1 节点1.2.1.1 Master Node主节点的功能1.2.1.2 Data Node数据节点的功能1.2.1.3 Coordinate Node协调节点的功能1.2.1.4 Ingest Node协调节点的功能1.2.1.5 其他节点功能…...

Kafka与Flink的整合 -- sink、source

1、首先导入依赖&#xff1a; <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-kafka</artifactId><version>1.15.2</version></dependency> 2、 source&#xff1a;Flink从Kafka中读取数据 p…...

小鱼ROS

git clone git clone https://ghproxy.com/https://github.com/stilleshan/ServerStatus git clone 私有仓库 Clone 私有仓库需要用户在 Personal access tokens 申请 Token 配合使用.git clone https://user:your_tokenghproxy.com/https://github.com/your_name/your_priv…...

简单讲讲RISC-V跳转指令基于具体场景的实现

背景 在 RISC-V指令集中&#xff0c;一共有 6 条有条件跳转指令&#xff0c;分别是 beq、bne、blt、bltu、bge、bgeu。如下是它们的定义与接口 BEQ rs1, rs2, imm ≠ BNE rs1, rs2, imm &#xff1c; BLT rs1, rs2, imm ≥ BGE rs1, rs2, imm < unsigned BLTU rs1…...

第13章 Java IO流处理(一) File类

目录 内容说明 章节内容 一、 File类 内容说明 结合章节内容重点难点,会对重要知识点进行扩展,以及做示例说明等,以便更好理解重点难点 章节内容 一、 File类 1、文件与目录的描述类——File ✔️ File类并不用来进行文件的读/写操作,并未涉及到写入或读取文件内容的…...

测试面试题集锦(四)| Linux 与 Python 编程篇(附答案)

本系列文章总结归纳了一些软件测试工程师常见的面试题&#xff0c;主要来源于个人面试遇到的、网络搜集&#xff08;完善&#xff09;、工作日常讨论等&#xff0c;分为以下十个部分&#xff0c;供大家参考。如有错误的地方&#xff0c;欢迎指正。有更多的面试题或面试中遇到的…...

pytorch中的矩阵乘法

1. 运算符介绍 关于运算&#xff0c;*运算&#xff0c;torch.mul(), torch.mm(), torch.mv(), tensor.t() 和 *代表矩阵的两种相乘方式&#xff1a; 表示常规的数学上定义的矩阵相乘&#xff1b; *表示两个矩阵对应位置处的两个元素相乘。 1.1 矩阵点乘 *和torch.mul()等同…...

Java--Stream流详解

Stream是Java 8 API添加的一个新的抽象&#xff0c;称为流Stream&#xff0c;以一种声明性方式处理数据集合&#xff08;侧重对于源数据计算能力的封装&#xff0c;并且支持序列与并行两种操作方式&#xff09; Stream流是从支持数据处理操作的源生成的元素序列&#xff0c;源可…...

[PHP]ShopXO企业级B2C免费开源商城系统 v2.3.1

ShopXO 企业级B2C免费开源电商系统&#xff01; 求实进取、创新专注、自主研发、国内领先企业级B2C电商系统解决方案。 遵循Apache2开源协议发布&#xff0c;无需授权、可商用、可二次开发、满足99%的电商运营需求。 PCH5、支付宝小程序、微信小程序、百度小程序、头条&抖音…...

Python基础入门系列详解20篇

Python基础入门&#xff08;1&#xff09;----Python简介 Python基础入门&#xff08;2&#xff09;----安装Python环境&#xff08;Windows、MacOS、CentOS、Ubuntu&#xff09; Python基础入门&#xff08;3&#xff09;----Python基础语法&#xff1a;解释器、标识符、关键…...

P02项目(学习)

★ P02项目 项目描述&#xff1a;安全操作项目旨在提高医疗设备的安全性&#xff0c;特别是在医生离开操作屏幕时&#xff0c;以减少非授权人员的误操作风险。为实现这一目标&#xff0c;我们采用多层次的保护措施&#xff0c;包括人脸识别、姿势检测以及二维码识别等技术。这些…...

ClusterFuzz终极内存泄漏检测指南:LSAN与UBSAN的完整配置教程

ClusterFuzz终极内存泄漏检测指南&#xff1a;LSAN与UBSAN的完整配置教程 【免费下载链接】clusterfuzz Scalable fuzzing infrastructure. 项目地址: https://gitcode.com/gh_mirrors/cl/clusterfuzz ClusterFuzz是一款强大的可扩展模糊测试基础设施&#xff0c;能够帮…...

【架构实战】读写分离中间件对比(ShardingSphere/MyCat)

一、为什么需要读写分离 在大多数互联网应用中&#xff0c;读操作远多于写操作&#xff1a; 读请求&#xff1a;70-80% 写请求&#xff1a;20-30%单机数据库的问题&#xff1a; 主库&#xff1a;处理所有写请求 部分读请求↓ 连接池耗尽 → 响应变慢 → 用户投诉解决方案&a…...

如何用OpenCore Legacy Patcher让老款Mac焕发新生:终极完整教程

如何用OpenCore Legacy Patcher让老款Mac焕发新生&#xff1a;终极完整教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款革…...

Graphormer效果展示:实测分子属性预测,准确率超越传统GNN方法

Graphormer效果展示&#xff1a;实测分子属性预测&#xff0c;准确率超越传统GNN方法 1. 模型概述与核心优势 Graphormer是微软研究院推出的基于纯Transformer架构的图神经网络&#xff0c;专为分子图&#xff08;原子-键结构&#xff09;的全局结构建模与属性预测设计。与传…...

Unity游戏翻译解决方案:多框架适配与实时翻译优化应用指南

Unity游戏翻译解决方案&#xff1a;多框架适配与实时翻译优化应用指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator Unity游戏翻译技术正成为全球化游戏开发的关键环节&#xff0c;XUnity.AutoTranslat…...

基于STM32LXXX的数字电位器(MCP41010T-I/SN)驱动应用程序设计

一、简介&#xff1a;MCP41010T-I/SN 是 Microchip 公司推出的一款单通道、8位数字电位器&#xff0c;采用 SPI 串行接口进行通信。该器件将传统的机械电位器功能数字化&#xff0c;通过简单的数字指令精确调节电阻值&#xff0c;特别适用于需要软件控制电路参数的嵌入式系统。…...

51单片机模拟IIC从机实战:手把手教你用逻辑分析仪调试主从机通信(附完整代码)

51单片机模拟IIC从机实战&#xff1a;逻辑分析仪调试与波形诊断全解析 在嵌入式开发中&#xff0c;IIC总线因其简洁的两线制设计&#xff08;SCL时钟线与SDA数据线&#xff09;被广泛应用于传感器、EEPROM等外设通信。但当开发者尝试用51单片机模拟IIC从机时&#xff0c;往往会…...

基于GEC6818的智能车库管理系统设计与优化

1. 项目概述与背景智能车库管理系统是当前城市停车管理领域的重要技术革新方向。传统停车场普遍存在人工收费效率低、排队时间长、管理成本高等痛点。我们基于GEC6818嵌入式开发板开发的这套系统&#xff0c;通过整合车牌识别、RFID支付、数据库管理等技术模块&#xff0c;实现…...

不用示波器也能看波形!Keil软件仿真Logic Analyzer的隐藏技巧大公开

不用示波器也能看波形&#xff01;Keil软件仿真Logic Analyzer的隐藏技巧大公开 在嵌入式开发中&#xff0c;调试GPIO波形是每个工程师都会遇到的场景。传统方式需要依赖示波器或逻辑分析仪&#xff0c;但硬件设备不仅成本高昂&#xff0c;还受限于使用环境。Keil MDK内置的Log…...

Windows效率翻倍!这些隐藏的Win+R命令和CMD技巧你用过几个?

Windows效率革命&#xff1a;解锁WinR与CMD的终极生产力指南 你是否曾在同事飞速敲击键盘时暗自惊叹&#xff1f;那些看似简单的组合键背后&#xff0c;藏着Windows系统最强大的效率武器库。今天我们要探索的不仅是快捷键列表&#xff0c;而是一套完整的生产力操作系统——从Wi…...