THREEJS - 动态标签(dom方式)

本文介绍了如何在三维场景中通过DOM元素为模型添加标签,包括创建DOM结构、封装转换坐标函数以及在渲染过程中实时更新标签位置。这种方法允许自定义样式,适应不同场景需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在三维场景中,我们会有一种需求:需要给三维场景中的模型打上标签,例如展示模型的名称/性能展示等,三维场景打标签的方式很多,有dom、sprite、Mesh等等,这篇文章来给大家介绍的是一种比较常见的打标签方式:dom。这种方式我们可以自定义任何样式的dom标签,比较容易满足各种场景的需求。

1.创建dom元素:

<div id="sign" style="position: absolute;">
    <div class="sign">
        <div class="name">我是标签</div>
    </div>
    <img src="./img/mark.png" class="mark" alt="">
</div>

2.函数的封装:目的是将三维场景中的坐标转化为屏幕坐标系的二维坐标:

/**
 * 添加标签:dom方式
 * @param {*} targePosition :需要传递当前标签的位置
 * @param {*} targetId :标签对应的dom的唯一ID,暂且用时间戳代替,避免重复
 */
function newTag(targePosition, targetId) {
    let world_vector = new THREE.Vector3(targePosition.x, targePosition.y, targePosition.z);
    let vector = world_vector.project(camera);
    let halfWidth = window.innerWidth / 2,
        halfHeight = window.innerHeight / 2;
    let x = Math.round(vector.x * halfWidth + halfWidth);
    let y = Math.round(-vector.y * halfHeight + halfHeight);

    /**
     * 更新立方体元素位置
     */
    let div = document.getElementById(targetId)
    div.style.left = x + 'px';
    div.style.top = y + 'px';
}

3.将目标标签的函数,放置到render函数中,这样做的目的就是保证标签可以根据我们需要展示的三维场景坐标实时转化为屏幕的二维坐标,保证标签是跟随场景的视角实时联动:

function render() {
    newTag({x: 100,  y: 100, z: 100}, 'sign');
    renderer.render(scene, camera);
}

上面就是三维场景中给模型打标签的方式之一 —— dom,其它的几种方式,我们会在后续文章中给出。
 

欢迎大家提意见或者建议,相互学习!!!!!!

### 关于 Three.js 与微信小程序结合使用的教程 #### 创建项目结构 为了使 Three.js 能够在微信小程序环境中运行,需要构建特定的项目结构。threejs-example-for-miniprogram 开源项目提供了一个良好的起点[^2]。 #### 初始化环境配置 安装依赖项并设置开发工具链对于顺利集成至关重要。确保按照官方指南完成必要的准备工作,这通常涉及 npm 或 yarn 来管理包以及微信开发者工具来进行调试和预览。 #### 加载 Three.js 文件 由于微信小程序有其独特的文件加载机制,直接引入外部库并非总是可行。建议采用本地打包的方式或将所需资源托管至 CDN 并通过 script 标签异步加载[^1]。 #### 实现基本场景渲染 一旦成功导入 Three.js 后,在 `app.js` 中初始化 renderer, scene 和 camera 是必不可少的操作: ```javascript // app.js const THREE = require('./libs/three.min'); Page({ onReady() { const width = wx.getSystemInfoSync().windowWidth; const height = wx.getSystemInfoSync().windowHeight; let scene = new THREE.Scene(); let camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000); let renderer = new THREE.WebGLRenderer({ antialias: true }); // 设置画布大小适应屏幕尺寸 renderer.setSize(width, height); this.setData({ threeCanvas: renderer.domElement, }); // 继续其他逻辑... } }) ``` #### 添加交互功能 为了让用户体验更加生动有趣,可以实现 raycasting 技术让用户能够点击选中物体。此技术允许检测鼠标指针下的对象,并执行相应的操作。 #### 测试兼容性和性能优化 考虑到不同设备间的差异性,务必进行全面测试以验证应用程序的表现情况。同时注意控制复杂度以免影响流畅度,尤其是在移动平台上[^3]。 #### 更新维护文档阅读 随着 Three.js 不断迭代更新,部分 API 接口可能发生变更。因此保持关注最新版次的变化记录有助于及时调整代码适配新特性[^4]。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值