threejs得WebGLRenderer+CSS3DRenderer结合使用

概要

在使用threejs显示label发现,人家自带了CSS3DRenderer/CSS2DRenderer.

1:CSS3DRenderer+WebGLRenderer出现鬼畜bug

第一种:在二个render添加control得时候如果WebGLRenderer在最上层会出现遮盖CSS3DRenderer。
第二种:如果CSS3DRenderer在最上层会触发二个control抖动情况。

2:解决思路

二个render使用同一个camera,使用二个control(必须二个control.update()—都要跑起来)。

3:代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .web-gl {
            position: absolute;
            width: 100%;
            height: 100%;
        }
    </style>

    <script async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script>
    <script type="importmap">
        {
            "imports": {
                "three": "https://unpkg.com/three@0.155/build/three.module.js",
                "three/addons/": "https://unpkg.com/three@0.155/examples/jsm/"
            }
        }
    </script>
</head>

<body>
    <div class="web-gl"></div>
    <script type="module">
        import * as THREE from 'three'
        import { OrbitControls } from 'three/addons/controls/OrbitControls.js'
        import { CSS3DRenderer, CSS3DObject, CSS3DSprite } from 'three/addons/renderers/CSS3DRenderer.js';

        const scene = new THREE.Scene();
        scene.background = null
        const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

        const renderer = new THREE.WebGLRenderer({
            alpha: true
        });
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.domElement.style.position = 'absolute'
        renderer.domElement.style.top = '0'

        document.querySelector('.web-gl').appendChild(renderer.domElement);

        const css3Renderer = new CSS3DRenderer();
        css3Renderer.setSize(window.innerWidth, window.innerHeight);
        css3Renderer.domElement.style.position = 'absolute'
        css3Renderer.domElement.style.top = '0'

        document.querySelector('.web-gl').appendChild(css3Renderer.domElement);

        const testDiv = document.createElement('div')
        testDiv.innerHTML = 'hsadasd'
        testDiv.style.background = 'red'

        const css3Object = new CSS3DSprite(testDiv)
        css3Object.scale.set(0.5, 0.5, 0.5)
        scene.add(css3Object)

        const light = new THREE.AmbientLight(0xffffff, 1); // soft white light
        scene.add(light);

        const geometry = new THREE.BoxGeometry(1, 1, 1);
        const material = new THREE.MeshStandardMaterial({ color: 0x00ff00 });
        const cube = new THREE.Mesh(geometry, material);
        cube.rotation.x = Math.PI / 4
        cube.rotation.y = Math.PI / 4
        cube.scale.set(10, 10, 10)
        scene.add(cube);

        camera.position.z = 20;

        const controls = new OrbitControls(camera, renderer.domElement);
        const controls2 = new OrbitControls(camera, css3Renderer.domElement);

        function animate() {
            requestAnimationFrame(animate);

            renderer.render(scene, camera);
            css3Renderer.render(scene, camera)

            controls.update();
            controls2.update()
        };

        animate();
    </script>
</body>

</html>

小结

提示:这里可以添加总结

例如:

提供先进的推理,复杂的指令,更多的创造力。

CSS3DRendererCSS3DSprite是three.js中的两个组件,用于创建CSS3D场景CSS3D对象。 CSS3DRenderer可以将CSS3D元素(如HTML元素)渲染为three.js场景的一部分。它的用法类似于WebGLRenderer,但它是基于CSS3D变换而不是WebGL。你可以使用CSS3DRenderer来创建具有3D效果的HTML元素,如垂直滚动的3D文本或3D动画元素。 CSS3DSprite则是将HTML元素渲染为three.js场景中的一个精灵(Sprite)。与普通的Sprite不同,CSS3DSprite可以包含任何普通的HTML元素(如图像、视频、文本等)。你可以使用它来创建与普通Sprite类似的3D精灵,但它具有更丰富的内容变换效果。 下面是两个示例: 1. 使用CSS3DRenderer创建3D文本效果: ``` // 创建CSS3DRenderer对象 var renderer = new THREE.CSS3DRenderer(); // 将renderer放入DOM容器中 var container = document.getElementById(&#39;container&#39;); container.appendChild(renderer.domElement); // 创建CSS3D元素(文本) var element = document.createElement(&#39;div&#39;); element.textContent = &#39;Hello World&#39;; element.style.fontSize = &#39;2em&#39;; element.style.color = &#39;#fff&#39;; // 创建CSS3D对象,将CSS3D元素添加到其中 var object = new THREE.CSS3DObject(element); // 将对象添加到场景中 scene.add(object); // 渲染场景 renderer.render(scene, camera); ``` 2. 使用CSS3DSprite创建3D图像精灵: ``` // 创建CSS3DRenderer对象 var renderer = new THREE.CSS3DRenderer(); // 将renderer放入DOM容器中 var container = document.getElementById(&#39;container&#39;); container.appendChild(renderer.domElement); // 创建HTML元素(图像) var image = document.createElement(&#39;img&#39;); image.src = &#39;img/logo.png&#39;; // 创建CSS3DSprite对象,并将HTML元素添加到其中 var sprite = new THREE.CSS3DSprite(image); // 设置CSS3DSprite对象的位置、大小等 参数 sprite.position.set(0, 0, 0); sprite.scale.set(1, 1, 1); // 将Sprite对象添加到场景中 scene.add(sprite); // 渲染场景 renderer.render(scene, camera); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值