使一个物体完全适合Three.Js中的相机平截头体

时间:2014-08-18 16:52:27

标签: 3d three.js perspectivecamera frustum

我正在尝试将一个物体放在相机平截头体内,我为此完成了所有三角函数,这就是我使用的代码。

var setupCamera = function() {
    aspectRatio = window.innerWidth / window.innerHeight
    camera = new THREE.PerspectiveCamera( 45, aspectRatio, 1, 10000 );
    scene.add(camera);
}

var updateCamera = function() {
    var height = mesh1_BB.max.y;

    var width = mesh1_BB.max.x - mesh1_BB.min.x;
    var vertical_FOV = camera.fov * (Math.PI/ 180);

    var max_z = mesh1_BB.max.z;

    var horizontal_FOV = 2 * Math.atan (Math.tan (vertical_FOV/2) * aspectRatio);

    var distance_vertical = height / (2 * Math.tan(vertical_FOV/2));
    // alert ('vertical' + distance_vertical);
    var distance_horizontal = width / (2 * Math.tan(horizontal_FOV/2));
    // alert ('horizontal' + distance_horizontal);
    var z_distance = distance_vertical >= distance_horizontal? distance_vertical : distance_horizontal;

    camera.position.z = z_distance + max_z;
    camera.position.y = 0 ;
    camera.position.x = 0;
}

虽然我认为相机距离的计算是正确的,但这是我得到的结果: enter image description here

我认为问题在于改变相机的y位置,并用camera.position.y = height;但这就是我得到的:

enter image description here

我想要的结果如下(这是我通过使用鼠标右键单击按钮进行平移并将其向上拖动直到它适合整个画布框架而获得的结果): enter image description here

我真的希望你可以帮忙解决这个问题,因为这一直让我疯狂; - )

非常感谢!

1 个答案:

答案 0 :(得分:1)

我没有检查你的距离计算,但你直接沿着z轴,向下看,而物体没有垂直居中于0 。将camera.y放在mesh1_BB.max.y / 2应该可以解决这个问题。

如果您不想移动相机,请至少将其指向物体的实际中心。在这种情况下,使用(轴对齐)边界框不再是100%正确。