Three.js中的CSS2DObject和CSS2DRenderer

使用CSS2DObject和CSS2DRenderer可以绘制一个2D效果的标签,用于展示一些信息。

1、效果图
2、示例源码
import { CSS2DObject, CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer';

// 创建一个html标签
function tag(){
    const div = document.createElement('div');
    div.style.visibility = 'hidden';
    div.innerHTML = 'GDP';
    div.style.padding = '4px 10px';
    div.style.color = '#fff';
    div.style.fontSize = '16px';
    div.style.position = 'absolute';
    div.style.backgroundColor = 'rgba(25,25,25,0.5)';
    div.style.borderRadius = '5px';
    // div元素包装成为css2模型对象CSS2DObject
    const label =new CSS2DObject(div);
    div.style.pointerEvents = 'none';//避免HTML标签遮挡三维场景的鼠标事件
     // 设置HTML元素标签在three.js世界坐标中位置
    // label.position.set(x, y, z);
    return label;
}

const labelRenderer = new CSS2DRenderer();
labelRenderer.setSize(window.innerWidth, window.innerHeight);
labelRenderer.domElement.style.position = 'absolute';
// 相对鼠标的相对偏移
labelRenderer.domElement.style.top = '-16px';
labelRenderer.domElement.style.left = '0px';
// //设置.pointerEvents=none,以免模型标签HTML元素遮挡鼠标选择场景模型
labelRenderer.domElement.style.pointerEvents = 'none';
document.body.appendChild(labelRenderer.domElement);

export { tag, labelRenderer };

通过阅读CSS2DRenderer的源码可以知道,CSS2DRenderer会递归遍历scene去找到CSS2DObject来进行渲染得到标签内容信息。CSS2DObject可以添加进入你想要展示其的mesh当中。

import { earth } from './earth'; //网格模型的地球
import { tag } from './tag'; //标签信息
const label = tag();
earth.add(label);

CSS2DRenderer需要在渲染器当中进行相应的配置。

  // 渲染
    private render() {
        this.stats.begin();
        labelRenderer.render(this.scene, this.cameraObr); //渲染标签
        window.requestAnimationFrame(() => this.render());
        this.webGLRenderer.render(this.scene, this.cameraObr);
        this.stats.end();
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容