【问题标题】:Bounding box that is parallel to the camera与相机平行的边界框
【发布时间】:2021-07-05 14:57:08
【问题描述】:

我的问题是如何定义相机位置,给定一个lookAt向量,当相机不在z轴上时,它会根据它的fov和aspect捕获所有对象。

我认为我需要获得一个垂直于相机外观的对象边界框,并且顶部和底部前后边缘平行于 xz 平面。然后边界框的背面是“远”平面,我可以计算到它(或 fov)的距离并相应地设置相机。

我的问题是,如何得到这样一个边界框(Box3 实例),给定场景中的一些对象和lookAt 向量?

【问题讨论】:

    标签: three.js


    【解决方案1】:

    我的问题是,如何得到这样一个边界框(Box3 实例),给定场景中的一些对象和lookAt 向量?

    THREE.Box3 的实例是轴对齐的边界框。无论相机如何旋转,都不可能为一组给定的 3D 对象生成不同的边界框。

    也许您可以使用一种非常常见的方法 3D 查看器,以确保始终在视口中显示导入的 3D 对象。来自开源 glTF viewer 的示例代码如下所示:

    const aabb = new THREE.Box3().setFromObject( object );
    const center = aabb.getCenter( new THREE.Vector3() );
    const size = aabb.getSize( new THREE.Vector3() ).length();
    
    // centering object
    
    object.position.x += ( object.position.x - center.x );
    object.position.y += ( object.position.y - center.y );
    object.position.z += ( object.position.z - center.z );
    
    // update camera
    
    camera.near = size / 100;
    camera.far = size * 100;
    camera.updateProjectionMatrix();
    
    camera.position.copy( center );
    camera.position.x += size / 2.0;
    camera.position.y += size / 5.0;
    camera.position.z += size / 2.0;
    camera.lookAt( center );
    

    【讨论】:

    • 是的,使对象居中可以简化事情,但由于其他原因我不能这样做。我最终将所有极值点投影到轴上,然后进行棕褐色计算以获得最大所需距离。本来希望 Three.js 能够提供内置支持来识别给定位置方向和观察点的距离。
    猜你喜欢
    • 2015-07-13
    • 2018-06-03
    • 1970-01-01
    • 2017-07-24
    • 2016-09-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多