赞
踩
下面给大家介绍一个threejs的扩展库CSS2DRenderer.js,通过CSS2DRenderer.js可以把HTML元素作为标签标注三维场景。
- // 引入CSS2渲染器CSS2DRenderer和CSS2模型对象CSS2DObject
- import { CSS2DRenderer,CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js';
-
- const div = document.getElementById('tag');
- // HTML元素转化为threejs的CSS2模型对象
- const tag = new CSS2DObject(div);
- tag.position.set(50, 0, 50);
- scene.add(tag);
-
- // 创建一个CSS2渲染器CSS2DRenderer
- const css2Renderer = new CSS2DRenderer();
- css2Renderer.setSize(width, height);
- document.body.appendChild(css2Renderer.domElement);
-
- // HTML标签<div id="tag"></div>外面父元素叠加到canvas画布上且重合
- // 注意canvas网布布局方式不同,CSS相关代码写法也可能不同,不过你只要能让标签父元素叠加到canvas画布上上面且重合就行
- css2Renderer.domElement.style.position = 'absolute';
- css2Renderer.domElement.style.top = '0px';
- css2Renderer.domElement.style.pointerEvents = 'none';
-
- // 渲染循环
- function render () {
- css2Renderer.render(scene, camera);
- renderer.render(scene, camera);
- requestAnimationFrame(render);
- }
- render();

HTML元素标签<div id="tag"></div>外面div父元素遮挡了Canvas画布鼠标事件,会造成相机控件OrbitControls的旋转、缩放等操作无效,也有可能会影响你的射线拾取,等等任何与canvas画布有关的鼠标事件都有可能收到影响,不过这算是普通web前端内容,选择前端方式解决即可。
设置.style.pointerEvents = none,就可以解决HTML元素标签对threejs canvas画布鼠标事件的遮挡。
css2Renderer.domElement.style.pointerEvents = 'none';
- // 画布跟随窗口变化
- window.onresize = function () {
- const width = window.innerWidth;
- const height = window.innerHeight;
- // cnavas画布宽高度重新设置
- renderer.setSize(width,height);
- // HTML标签css2Renderer.domElement尺寸重新设置
- css2Renderer.setSize(width,height);
- camera.aspect = width / height;
- camera.updateProjectionMatrix();
- };
CSS3渲染器CSS3DRenderer和CSS2渲染器CSS2DRenderer整体使用流程基本相同,只是在HTML标签渲染效果方面不同,比如CSS3渲染的标签会跟着场景相机同步缩放,而CSS2渲染的标签默认保持自身像素值。
- // 引入CSS3渲染器CSS3DRenderer
- import {CSS3DRenderer} from 'three/addons/renderers/CSS3DRenderer.js';
-
- // 创建一个CSS3渲染器CSS3DRenderer
- const css3Renderer = new CSS2DRenderer();
- css2Renderer.setSize(width, height);
- // HTML标签<div id="tag"></div>外面父元素叠加到canvas画布上且重合
- css2Renderer.domElement.style.position = 'absolute';
- css2Renderer.domElement.style.top = '0px';
- //设置.pointerEvents=none,解决HTML元素标签对threejs canvas画布鼠标事件的遮挡
- css2Renderer.domElement.style.pointerEvents = 'none';
- document.body.appendChild(css2Renderer.domElement);
-
- // 渲染循环
- function render() {
- css3Renderer.render(scene, camera);
- // ...
- requestAnimationFrame(render);
- }
-
- window.onresize = function () {
- ...
- // HTML标签css3Renderer.domElement尺寸重新设置
- css3Renderer.setSize(width,height);
- };

CSS3DObject使用方法和CSS2DObject一样
- // 引入CSS3模型对象CSS3DObject
- import { CSS3DObject } from 'three/addons/renderers/CSS3DRenderer.js';
CSS3模型对象CSS3DObject渲染结果,就像一个矩形平面网格模型一样。你通过相机控件OrbitControls旋转、缩放三维场景,CSS3模型对象CSS3DObject跟着旋转、缩放。 旋转过程中HTML元素标签的正反面都可以看到。
一个网格模型被另一个不透明网格模型遮挡,canvas画布上不会显示,不过注意一点CSS3DObject模型本质上渲染到网页上还是HTML元素,这就是说模型背面的HTML标签并不会被遮挡,CSS3DObject标签是以HTMl元素形式叠加在canvas画布上的,不受threejs内部模型对象影响。
- // 禁止CSS3DObject标签对应HTMl元素背面显示
- <div id="tag" style="backface-visibility: hidden;">标签内容</div>
CSS3DSprite使用方法也和和CSS2DObject一样。
- // 引入CSS3精灵模型对象CSS3DSprite
- import { CSS3DSprite } from 'three/addons/renderers/CSS3DRenderer.js';
CSS3精灵模型CSS3DSprite对应的HTML标签,可以跟着场景缩放,位置可以跟着场景旋转,但是自身的姿态角度始终平行于canvas画布,不受旋转影响,就像精灵模型一样Sprite CSS3精灵模型CSS3DSprite尺寸、位置、缩放等渲染规律和CSS3对象模型CSS3DObject基本一致。
标签<div id="tag"></div>在CSS3渲染器渲染的时候,默认会被设置为pointer-events: auto;,这时候虽然css3Renderer.domElement不遮挡canvas画布的鼠标事件,但是<div id="tag"></div>遮挡canvas画布的鼠标事件。
这时候你可以通过代码强制改变CSS3渲染器给标签设置的.style.pointerEvents = 'auto',设置为.style.pointerEvents = 'none',这时候注意一点,修改.style.pointerEvents,要在实例化new CSS3DObject(div)之后,因为执行new CSS3DObject(div)的时候,会把HTML标签设置为.style.pointerEvents = 'auto'。
- const div = document.getElementById('tag');
- // HTML元素转化为threejs的CSS3模型对象
- const tag = new CSS3DObject(div);
- // new CSS3DObject(div);之后设置style.pointerEvents
- div.style.pointerEvents = 'none';
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。