1

已编辑

如何替换对象的几何体,使对象本身(和场景层次结构)完好无损?

直接分配mesh.geometry给 newGeometry并且needsUpdate = true在我的代码中不起作用。

这是来自three.js 站点(http://threejs.org/docs/#Manual/Introduction/Creating_a_scene)的代码示例,其中我的小添加标记为注释“my 1”、“my 2”和“my3”。

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

        var renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        camera.position.z = 5;

        var geomCube = new THREE.CubeGeometry(1,1,1),
            geomSphere = new THREE.SphereGeometry(1);

        var material = new THREE.MeshBasicMaterial({color: 0x20a0e0, wireframe: true, wireframeLinewidth: 3});

        var mesh = new THREE.Mesh(geomCube, material);

        scene.add(mesh);

        // ******** my 1 ********
        mesh.geometry = geomSphere;
        mesh.geometry.needsUpdate = true;

        // ******** my 3 ********
        function onclickTest()
            {
            mesh.geometry = geomCube;
            mesh.geometry.needsUpdate = true;
            }


        var cnt = 300;

        var render = function () {
            requestAnimationFrame(render);

            mesh.rotation.x += 0.01;
            mesh.rotation.y += 0.01;

            renderer.render(scene, camera);

            // ******** my 2 ********
            if ( !cnt-- )
                {
                mesh.geometry = geomCube;
                mesh.geometry.needsUpdate = true;
                }

        };

        render();

代码“我的 1”有效,它将初始立方体更改为球体。但是代码“my 2”会导致three.js中的错误。我还在按钮的 onclick 句柄中放置了相同的代码,而不是在渲染循环(“my 3”)中,但结果相同:它失败了。

有人能告诉我几何替换的好方法吗?

ps 原则上,我们可以将“虚拟”节点放置在场景层次结构中Meshes的位置上。网格节点可以作为子节点链接到虚拟节点。在这种情况下,网格的移除和创建不会影响场景的结构。但我不喜欢这个解决方案,它看起来不自然。

4

0 回答 0