【问题标题】:Implementing a fly around camera with three.js用 three.js 实现一个环绕相机的飞行
【发布时间】:2014-01-07 15:29:41
【问题描述】:

我是 Three.js 的新手,我想为我的场景创建一个飞行相机。

我已经看到 THREE.Geometry 具有 .computeBoundingSphere() 方法和 .boundingSphere 属性,它为我提供了该对象边界球的中心和半径。 假设我的场景中只有一个网格,我可以通过 scene.children[0].computeBoundingSphere 获得它

想法是使用.boundingSphere.center 设置myCamera.lookAt 并使用.boundingSphere.center.boundingSphere.radius 与我的视角的Math.sin/cos 来设置myCamera 位置。

问题 1:这是继续进行的最佳方式还是 Three.js 是否为该范围提供了任何特殊的类或帮助器?

问题 2:如果我的场景包含多个网格并且我想要一个全局场景 boundingSphere,该怎么办?我是否已经手动遍历所有scene.children(跳过相机、灯光等)并以数学方式创建单个网格的 boundingSphere 的“boundingSphere”,还是有更聪明的方法来做到这一点?是否可以添加一个“根”虚拟对象,其中包含我所有的场景网格,并作为所有子 boundingSpheres 的结果来获取它的 boundingSphere?

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    three.js 提供了几个相机控件的示例。 OrbitControlsTrackballControls 可能是您要查找的内容。

    Box3.setFromObject( object ) 将计算对象(包括其子对象)的世界轴对齐边界框,同时考虑对象和子对象的世界变换。

    通过边界框,您可以确定设置摄像头的位置。有关该主题的更多信息,请参阅How to Fit Camera to Object

    编辑 - 在您的情况下,object 将是您的“根”父级 Object3D。如果你想要一个边界球,那么你可以使用这个模式:

    var sphere = new THREE.Box3().setFromObject( object ).getBoundingSphere();
    

    three.js r.64

    【讨论】:

    • 您好,谢谢!一个疑问:文档(threejs.org/docs/#Reference/Math/Box3)没有列出您提到的方法,但是查看源代码(github.com/mrdoob/three.js/blob/master/src/math/Box3.js)该方法就在那里。那么文档的更新程度如何?我还发现 Box3 的 getBoundingSphere 方法与 setFromObject 结合使用可能会奏效。我会尝试一下然后回来。谢谢!
    • 文档正在慢慢出现。我强烈建议您始终阅读源代码。
    • new THREE.Box3().setFromObject(objects).getBoundingSphere();假设“对象”是我所有场景网格的 THREE.Object3D 容器
    【解决方案2】:

    您是否查看了位于 https://github.com/mrdoob/three.js/tree/master/examples/js/controls 的示例控件?使用/破解其中一个示例可能比从头开始创建自己的示例更容易。

    【讨论】:

    • 我看了这个:threejs.org/examples/#misc_controls_orbit 这似乎最符合我的需要。然而,它将相机放置在一个固定的距离(第 63 行),该距离不是根据场景边界球计算的......
    猜你喜欢
    • 2012-06-17
    • 2012-07-23
    • 1970-01-01
    • 2013-08-30
    • 2012-10-24
    • 1970-01-01
    • 2013-05-21
    • 2013-03-19
    • 2016-11-30
    相关资源
    最近更新 更多