当前位置:   article > 正文

15.场景标注标签信息_css2drenderer.js

css2drenderer.js

CSS2DRenderer(HTML标签)

下面给大家介绍一个threejs的扩展库CSS2DRenderer.js,通过CSS2DRenderer.js可以把HTML元素作为标签标注三维场景。

  • 1.HTML元素创建标签
  • 2.CSS2模型对象CSS2DObject
  • 3.CSS2渲染器CSS2DRenderer
  • 4.CSS2Renderer.domElement重新定位
  1. // 引入CSS2渲染器CSS2DRenderer和CSS2模型对象CSS2DObject
  2. import { CSS2DRenderer,CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js';
  3. const div = document.getElementById('tag');
  4. // HTML元素转化为threejs的CSS2模型对象
  5. const tag = new CSS2DObject(div);
  6. tag.position.set(50, 0, 50);
  7. scene.add(tag);
  8. // 创建一个CSS2渲染器CSS2DRenderer
  9. const css2Renderer = new CSS2DRenderer();
  10. css2Renderer.setSize(width, height);
  11. document.body.appendChild(css2Renderer.domElement);
  12. // HTML标签<div id="tag"></div>外面父元素叠加到canvas画布上且重合
  13. // 注意canvas网布布局方式不同,CSS相关代码写法也可能不同,不过你只要能让标签父元素叠加到canvas画布上上面且重合就行
  14. css2Renderer.domElement.style.position = 'absolute';
  15. css2Renderer.domElement.style.top = '0px';
  16. css2Renderer.domElement.style.pointerEvents = 'none';
  17. // 渲染循环
  18. function render () {
  19. css2Renderer.render(scene, camera);
  20. renderer.render(scene, camera);
  21. requestAnimationFrame(render);
  22. }
  23. render();

HTML标签遮挡Canvas画布事件 

HTML元素标签<div id="tag"></div>外面div父元素遮挡了Canvas画布鼠标事件,会造成相机控件OrbitControls的旋转、缩放等操作无效,也有可能会影响你的射线拾取,等等任何与canvas画布有关的鼠标事件都有可能收到影响,不过这算是普通web前端内容,选择前端方式解决即可。

设置.style.pointerEvents = none,就可以解决HTML元素标签对threejs canvas画布鼠标事件的遮挡。

css2Renderer.domElement.style.pointerEvents = 'none';

Canvas尺寸变化(HTML标签)

  1. // 画布跟随窗口变化
  2. window.onresize = function () {
  3. const width = window.innerWidth;
  4. const height = window.innerHeight;
  5. // cnavas画布宽高度重新设置
  6. renderer.setSize(width,height);
  7. // HTML标签css2Renderer.domElement尺寸重新设置
  8. css2Renderer.setSize(width,height);
  9. camera.aspect = width / height;
  10. camera.updateProjectionMatrix();
  11. };

CSS3DRenderer渲染HTML标签

CSS3渲染器CSS3DRenderer和CSS2渲染器CSS2DRenderer整体使用流程基本相同,只是在HTML标签渲染效果方面不同,比如CSS3渲染的标签会跟着场景相机同步缩放,而CSS2渲染的标签默认保持自身像素值。

  1. // 引入CSS3渲染器CSS3DRenderer
  2. import {CSS3DRenderer} from 'three/addons/renderers/CSS3DRenderer.js';
  3. // 创建一个CSS3渲染器CSS3DRenderer
  4. const css3Renderer = new CSS2DRenderer();
  5. css2Renderer.setSize(width, height);
  6. // HTML标签<div id="tag"></div>外面父元素叠加到canvas画布上且重合
  7. css2Renderer.domElement.style.position = 'absolute';
  8. css2Renderer.domElement.style.top = '0px';
  9. //设置.pointerEvents=none,解决HTML元素标签对threejs canvas画布鼠标事件的遮挡
  10. css2Renderer.domElement.style.pointerEvents = 'none';
  11. document.body.appendChild(css2Renderer.domElement);
  12. // 渲染循环
  13. function render() {
  14. css3Renderer.render(scene, camera);
  15. // ...
  16. requestAnimationFrame(render);
  17. }
  18. window.onresize = function () {
  19. ...
  20. // HTML标签css3Renderer.domElement尺寸重新设置
  21. css3Renderer.setSize(width,height);
  22. };

CSS3对象模型CSS3DObject

CSS3DObject使用方法和CSS2DObject一样

  1. // 引入CSS3模型对象CSS3DObject
  2. import { CSS3DObject } from 'three/addons/renderers/CSS3DRenderer.js';

CSS3模型对象CSS3DObject渲染结果,就像一个矩形平面网格模型一样。你通过相机控件OrbitControls旋转、缩放三维场景,CSS3模型对象CSS3DObject跟着旋转、缩放。 旋转过程中HTML元素标签的正反面都可以看到。

一个网格模型被另一个不透明网格模型遮挡,canvas画布上不会显示,不过注意一点CSS3DObject模型本质上渲染到网页上还是HTML元素,这就是说模型背面的HTML标签并不会被遮挡,CSS3DObject标签是以HTMl元素形式叠加在canvas画布上的,不受threejs内部模型对象影响。

  1. // 禁止CSS3DObject标签对应HTMl元素背面显示
  2. <div id="tag" style="backface-visibility: hidden;">标签内容</div>

CSS3精灵模型CSS3DSprite

CSS3DSprite使用方法也和和CSS2DObject一样。

  1. // 引入CSS3精灵模型对象CSS3DSprite
  2. 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'。

  1. const div = document.getElementById('tag');
  2. // HTML元素转化为threejs的CSS3模型对象
  3. const tag = new CSS3DObject(div);
  4. // new CSS3DObject(div);之后设置style.pointerEvents
  5. div.style.pointerEvents = 'none';
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/121575
推荐阅读
相关标签
  

闽ICP备14008679号