【问题标题】:Optimal way to render multiple scenes with large numbers of objects in Three.js在 Three.js 中渲染具有大量对象的多个场景的最佳方法
【发布时间】:2015-12-02 18:00:59
【问题描述】:

假设您要绘制两个场景,每个场景都有数百个球体,并提供在这些场景之间切换的能力。执行此操作的最佳方法是什么?

目前一个切换大约需要 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);   
}

【问题讨论】:

    标签: webgl three.js


    【解决方案1】:

    再一次,您为什么不只使用一个场景,将其分成两部分,设置您的相机 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 以将可见性更改应用于对象的所有子级)。

    【讨论】:

    • 我设置了允许用户在场景中移动的控件。
    • 那你为什么不创建一个空的var object = THREE.Object3D 容器,将所有场景#1 对象添加到其中并仅将容器对象添加到场景中。然后创建另一个容器并将场景#2 的对象放在那里。这样你就可以简单地设置object.visible = true/false
    • 不错。我肯定看到设置object.visible 属性比重新创建和销毁所有对象要好得多。我读过一些关于制作一个包含多个对象以提高效率的主对象。我的项目的一个要求是能够点击并专注于每个领域,我不确定如果我使用这种方法是否能够做到这一点。
    • 你当然可以做到!像这样到达你的领域:containerObject.children[27]。它不像merge 方法,您的所有对象网格都相互连接,它真的像一个容器,用于存储您的对象(就像您 PC 上的文件夹)。
    • 仅供参考,因为 r71 three.js 可见性会影响儿童,因此无需遍历
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多