webgl - 在 Three.js 中渲染具有大量对象的多个场景的最佳方式

标签 webgl three.js

想象一下,您要绘制两个场景,每个场景都有数百个球体,并提供在这些场景之间切换的能力。这样做的最佳方法是什么?

目前一个开关大约需要 4 到 5 秒,因为我正在删除、创建和绘制每个开关上的所有球体。下面是在场景开关上运行的代码示例。

clearObjects();
resetCamera();  

for(var i = 0; i < 500; i++) {
    var geometry = new THREE.SphereGeometry(radius, 50, 50);
    var material = new THREE.MeshLambertMaterial({color: 0xFFCC33});
    var sphere = new THREE.Mesh(geometry, material);
    sphere.position.set(randX, randY, randZ);

    scene.add(sphere);
    objects.push(sphere);   
}

最佳答案

再说一遍,为什么不只使用一个场景,将其分成两部分,设置相机 FOV(视野),以便一次只能看到一个场景部分,然后只需移动相机位置...听起来不是更有效率吗?

如果没有使用 2 个场景的特殊原因,您始终可以只使用一个场景来实现您的代码。所以试试我上面描述的方法或解释你使用2个场景的原因。

编辑:您也可以使用两个 THREE.Object3D容器来表示您的 2 个场景,您可以在其中存储所有特定场景对象,然后一次只显示/隐藏其中一个容器。比起使用 yourContainer.children[n] 操作容器的所有内容的方式.

所以一般来说,这就是你想要做的:

var scene1Container = new THREE.Object3D();
var scene2Container = new THREE.Object3D();

scene1Container.add(firstObjectFromScene1);
//.....
scene1Container.add(nObjectFromScene1);

scene2Container.add(firstObjectFromScene2);
//.....
scene2Container.add(nObjectFromScene2);

现在您可以使用 scene1Container.visible = true/false; 一次只显示/隐藏一个容器(并管理 scene1Container.traverse 以将可见性更改应用于对象的所有子项)。

关于webgl - 在 Three.js 中渲染具有大量对象的多个场景的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13792083/

相关文章:

javascript - 如何在加载 collada 纹理时调用函数? (三.js)

javascript - Three.js 集体行动

glsl - 如何使用 Open GL ES 2.0 或 WebGL 创建雾?

javascript - 检测 WebGL 支持的正确方法?

javascript - generateMipmap 完成了吗?

three.js - 如何从 cdn THREE.js 加载 GLTFLoader

javascript - WebGL & Three.js - 在两个渲染器中连续渲染一个场景

javascript - WebGL 纹理 : second time load sizing is wrong

javascript - 使用 SVG 或 WebGL 的 3D 形状

d3.js - 如何使用我的 geo json 文件以 3D 形式渲染城市