如何在 Three.js 场景中创建可点击展开的标签

在这里插入图片描述

在复杂的可视化场景中,经常需要为 3D 对象添加可交互的标签,以便用户点击时可以查看详细信息。这篇文章将通过一个简单的案例展示,如何在 Three.js 中为对象创建可点击的标签,点击标签可以展开详细信息,再次点击可以关闭这些信息。

实现思路
  1. 创建护罩对象:我们在 Three.js 中生成护罩(类似于 3D 球体),这些护罩将承载标签。
  2. 创建 2D 标签:使用 Three.js 的 CSS2DRenderer 创建 HTML 标签,并附加到护罩对象上。
  3. 实现点击交互:点击标签时,显示更多信息,再次点击时隐藏这些信息。
第一步:创建基本的 Three.js 场景

我们首先需要在项目中创建一个基本的 Three.js 场景,并在其中生成几个护罩对象。以下代码展示了如何设置 Three.js 场景和护罩:

import * as THREE from 'three'; 
import { CSS2DRenderer, CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';

// 创建基本的 Three.js 场景
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 5, 10);

const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

const labelRenderer = new CSS2DRenderer();
labelRenderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(labelRenderer.domElement);

// 添加灯光
const ambientLight = new THREE.AmbientLight(0x404040, 2); 
scene.add(ambientLight);

// 创建护罩对象
const geometry = new THREE.SphereGeometry(1.5, 32, 32);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const shield = new THREE.Mesh(geometry, material);
scene.add(shield);

这个代码片段中,我们创建了一个基础的 Three.js 场景,设置了相机、灯光,并添加了一个简单的护罩对象(一个球体)。还初始化了一个 CSS2DRenderer 用于接下来渲染 HTML 标签。

第二步:为护罩添加 2D 标签

接下来,我们将使用 CSS2DRenderer 来为护罩添加一个标签。这个标签将包含护罩的名称,并且初始状态下显示基本信息,更多信息隐藏。

// 创建标签元素
const div = document.createElement('div');
div.className = 'label';
div.textContent = 'Shield 1';
div.style.fontSize = '14px';
div.style.color = 'white';
div.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
div.style.padding = '5px';
div.style.borderRadius = '5px';
div.style.cursor = 'pointer';

// 创建隐藏的详细信息元素
const moreContent = document.createElement('div');
moreContent.className = 'more-content';
moreContent.style.display = 'none';
moreContent.textContent = '更多关于 Shield 1 的内容...';
moreContent.style.marginTop = '5px';
moreContent.style.backgroundColor = 'rgba(255, 255, 255, 0.8)';
moreContent.style.color = 'black';
moreContent.style.padding = '10px';
moreContent.style.borderRadius = '5px';

// 将详细信息嵌入标签中
div.appendChild(moreContent);

// 为护罩添加点击事件,控制显示和隐藏详细信息
div.addEventListener('click', () => {
  moreContent.style.display = moreContent.style.display === 'none' ? 'block' : 'none';
});

// 创建 CSS2DObject,将标签附加到护罩上
const label = new CSS2DObject(div);
label.position.set(0, 2, 0); // 标签位置在护罩上方
shield.add(label);

在这段代码中,我们:

  1. 创建了 HTML 标签,并设置了样式,包括护罩名称和背景颜色。
  2. 创建了详细信息的部分,初始状态下隐藏。
  3. 通过点击事件实现了点击标签时展开或收起详细信息。
第三步:渲染场景并添加交互

最后,我们将把标签添加到 Three.js 的渲染循环中,同时确保标签随 3D 场景中的对象移动。

// 渲染循环
function animate() {
  requestAnimationFrame(animate);
  renderer.render(scene, camera);
  labelRenderer.render(scene, camera); // 渲染标签
}
animate();

现在,运行这个代码时,会看到一个带有标签的护罩对象。点击标签时,会显示详细信息,再次点击时会隐藏详细信息。

第四步:为什么标签没有显示在边缘?

生成的标签附加在护罩的顶部,护罩的分布范围可能会限制标签在屏幕中的可见位置。在我们的项目中,护罩是以屏幕中心为基准进行分布,因此没有分布到屏幕边缘。为了将护罩分布得更广,可以调整护罩的位置逻辑,确保护罩覆盖到屏幕的边缘区域。

总结

在这篇文章中,我们展示了如何使用 Three.js 的 CSS2DRenderer 为 3D 场景中的对象添加 2D 标签,并实现点击显示或隐藏详细信息的交互效果。这个功能可以应用于各种 3D 数据可视化场景中,为用户提供直观的交互体验。

ps:最近的项目使用three.js的地方很多,且拓展了很多功能,我会将一个个的功能点拆分出来。因为之前查找相关博客发现很多都是整个一起的,对于只想要其中一部分而言会增加很多不必要的时间成本,所以我会将功能点拆解出来。想了解更多关于three.js的文章可以看我的three专栏

跳转连接:【Three.js】实现护罩(防御罩、金钟罩、护盾)效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/884379.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文复现:考虑电网交互的风电、光伏与电池互补调度运行(MATLAB-Yalmip-Cplex全代码)

论文复现:考虑电网交互的风电、光伏与电池储能互补调度运行(MATLAB-Yalmip-Cplex全代码) 针对风电、光伏与电化学储能电站互补运行的问题,已有大量通过启发式算法寻优的案例,但工程上更注重实用性和普适性。Yalmip工具箱则是一种基于MATLAB平台的优化软件工具箱,被广泛应用…

基于单片机语音智能导盲仪仿真设计

文章目录 前言资料获取设计介绍设计程序具体实现截图设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们…

【Python】探索 Graphene:Python 中的 GraphQL 框架

人们常说挣多挣少都要开心,这话我相信,但是请问挣少了怎么开心? 随着现代 Web 应用对数据交互需求的不断增长,GraphQL 作为一种数据查询和操作语言,越来越受到开发者的青睐。Graphene 是 Python 语言中实现 GraphQL 的…

基于SpringBoot+Vue3的在线报名系统

一、项目介绍 1.1 项目介绍 本项目为一个报名系统,实现了基本的报名流程,功能完善,前后端皆有个人独立开发,功能相对不是特别难,但该有的功能还是都已经实现。 1.2 技术架构 主要技术栈: SpringBoot2 …

WebRTC中的维纳滤波器实现详解:基于决策导向的SNR估计

目录 1. 维纳滤波器的基本原理2. WebRTC中的维纳滤波器实现3. 代码逐步剖析4. 总结 在WebRTC的噪声抑制模块中,维纳滤波器(Wiener Filter)是一种非常常见且重要的滤波器,用于提高语音信号的清晰度并抑制背景噪声。本文将详细解释维…

erlang学习:Linux命令学习6

for循环学习 打印九九乘法表 for i in {1..9};do %%取1-9for j in $(seq 1 $i);do %%取1-iecho -n "$j*$i$((i*j)) " %%进行九九乘法表打印doneecho done尝试了很多次报错是因为后面的换行符不对,window系统中的换行符与linux对不上,因…

AI芯片WT2605C赋能厨房家电,在线对话操控,引领智能烹饪新体验:尽享高效便捷生活

在智能家居的蓬勃发展中,智能厨电作为连接科技与生活的桥梁,正逐步渗透到每一个现代家庭的厨房中。蒸烤箱作为智能厨电的代表,以其丰富的功能和高效的性能,满足了人们对美食的多样化追求。然而,面对众多复杂的操作功能…

OpenHarmony(鸿蒙南向)——平台驱动开发【MIPI DSI】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DSI(Display Serial Interface&#x…

小阿轩yx-案例:代码管理系统简介与部署

小阿轩yx-案例:代码管理系统简介与部署 前言 开发一个项目时,如果只有几十行代码或几百行代码时维护还算简单,但是代码数量达到一定程度或两三个人共同开发一个项目时,就很容易会出现代码混乱、冲突、排错难等问题。代码编写完成…

【软件测试】如何设计测试用例? 设计测试用例常用的方法.

目录 一.什么是测试用例?二.总体设计测试用例的万能公式.2.1 功能性能界面兼容易用安全2.2 弱网测试2.3 安装卸载测试. 三. 常用设计具体测试用例的方法3.1 等价类3.2 边界值3.3 正交法3.3.1 正交表3.3.2 如何设计正交表,并根据正交表编写测试用例 3.4 判定表法3.4.1 根据判定…

828华为云征文 | 解锁高效项目管理,Zentao在华为云Flexusx容器化部署与应用指南

前言 在当今快速迭代的商业环境中,高效且灵活的项目管理成为企业竞争力的关键。华为云Flexusx实例,以其灵活的vCPU内存配比、热变配功能及按需计费模式,为项目管理软件如Zentao的部署提供了理想平台。Flexusx实例采用按需计费的灵活定价模式&…

Ansible流程控制-条件_循环_错误处理_包含导入_块异常处理

文章目录 Ansible流程控制介绍1. 条件判断2. 循环3. 循环控制4. 错误处理5. 包含和导入6. 块和异常处理7. 角色的流程控制*include_tasks、import_tasks_include之间的区别 条件语句再细说且、或、非、是模糊条件when指令的详细使用方法 循环语句再细说如何使用使用item变量结合…

甄选范文“论软件需求管理”,软考高级论文,系统架构设计师论文

论文真题 软件需求管理是一个对系统需求变更了解和控制的过程。需求管理过程与需求开发过程相互关联,初始需求导出的同时就要形成需求管理规划,一旦启动了软件开发过程,需求管理活动就紧密相伴。 需求管理过程中主要包含变更控制、版本控制、需求跟踪和需求状态跟踪等4项活…

???Ansible-使用roles

文章目录 一、Ansible的内置的或官方推荐创建的目录及文件介绍roles目录解释1、roles/自定义角色名目录下2、roles/自定义角色名目录/tasks目录下3、roles/自定义角色名目录/handlers目录下4、roles/自定义角色名目录/templates目录下5、roles/自定义项目名目录/files目录下6、…

SSM超市售卖管理系统-计算机毕业设计源码23976

目 录 摘要 Abstract 1 绪论 1.1研究的背景和意义 1.2研究内容 1.3论文结构与章节安排 2 开发技术介绍 2.1 SSM框架 2.2 MySQL数据库 3 超市售卖管理系统系统分析 3.1 可行性分析 3.2 系统流程分析 3.2.1 数据流程 3.3.2 业务流程 3.3 系统功能分析 3.3.1 功…

港科夜闻 | 香港科大颁授荣誉大学院士予五位杰出人士

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大颁授荣誉大学院士予五位杰出人士。香港科大9月24日向五位杰出人士颁授荣誉大学院士,他们分别为包弼德教授、简吴秋玉女士、高秉强教授、吴永顺先生及容永祺博士(按姓氏英文字母排序)。荣誉大学院士颁…

BUG——IMX6ULL编译正点原子Linux内核报错

最初编译的是正点原子改过的Linux内核,可能是版本问题,一直报错,无法成功编译。然后换成NXP官方Linux内核6.6版本,初始编译虽然也报各种错,但都是缺少库或相关工具,全部安装后就可以成功编译出镜像了&#…

WiFi无线连接管理安卓设备工具:WiFiADB

介绍 WiFi ADB 使您能够通过 WiFi TCP/IP 连接直接在设备上轻松调试和测试 Android 应用,无需使用 USB 数据线。在启用 WiFi 上的 ADB 后,打开控制台将电脑连接到设备。 手机和电脑在同一个WiFi然后电脑上运行adb connect x.x.x.x:x命令即可 下载 谷…

IoT网关的主要功能有哪些?天拓四方

在数字化浪潮席卷全球的今天,物联网(IoT)技术凭借其独特的优势,逐渐在各个领域展现出强大的生命力。而IoT网关,作为连接物理世界与数字世界的桥梁,其在物联网体系中的作用愈发凸显。 一、数据聚合与预处理…

leetcode每日一题day15(24.9.25)——公司命名

思路:首先如果没有相同的后缀,则无论只要不是相同的首字母交换都不会出现重复情况,如果有重复后缀,则还需多增加个不能和,首字符与另一相同后缀字串的首字符相同的字串交换。 主要矛盾已经明确,则可对矛盾…