【问题标题】:Making an object fit exactly inside the camera frustum in Three.Js在 Three.Js 中使对象完全适合相机平截头体
【发布时间】:2014-10-11 15:48:49
【问题描述】:

我正在尝试使一个对象适合相机平截头体,为此我遍历了所有三角函数,这就是我使用的代码。

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;
}

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

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

我想要的结果如下(这是我通过鼠标右键平移并向上拖动直到适合整个画布框架获得的结果):

我真的希望你能帮助解决这个问题,因为这让我整天发疯;-)

非常感谢!

【问题讨论】:

标签: 3d three.js perspectivecamera frustum


【解决方案1】:

我没有检查你的距离计算,但你是直视 z 轴,而对象不是垂直以 0 为中心。将您的camera.y 放在mesh1_BB.max.y / 2 应该可以解决这个问题。

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

【讨论】:

  • 非常感谢您的快速答复。我确实将 camera.y 更改为 mesh1_BB.max.y /2 但我得到的结果与原始帖子中的第二张图像非常相似。在试验并放置一个非常大的 camera.y 时,相机一直指向 (0,0,0)。我认为这是问题的一部分,相机应该指向前方而不是 0,0,0...
  • TrackballControls 弄乱了我的相机属性。将其设置为 height/2 非常有用,非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 2015-11-05
  • 2013-03-08
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多