目前,我正在获取对象边界框的每个角并将其转换为标准化设备坐标 (NDC),并跟踪最大和最小 NDC。然后我计算 NDC 的中间值,在世界上找到它并让我的相机观察它。
<Determine max and minimum NDCs>
centerX = (maxX + minX) / 2;
centerY = (maxY + minY) / 2;
point.set(centerX, centerY, 0);
projector.unprojectVector(point, camera);
direction = point.sub(camera.position).normalize();
point = camera.position.clone().add(direction.multiplyScalar(distance));
camera.lookAt(point);
camera.updateMatrixWorld();
这是一个近似的方法对吗?我在几个地方看到了它的建议。我问是因为每次我将对象居中时,当再次计算它们时(在进行任何其他更改之前),最小和最大 NDC 应该相等,但它们不是。我接近但不相等的数字(忽略负号),随着我越来越近,数字之间的“错误”变得越来越大。IE前几个中心的错误是:0.0022566539084770687、0.00541687811360958、0.011035676399427596、0.025670088917273515、0.06396864345885889等。
有没有我遗漏的步骤会导致这种情况?
我将此代码用作 while 循环的一部分,以在屏幕上最大化和居中对象。(我正在对其进行编程,以便用户可以输入一个航向和一个标高,并且相机将被定位,以便它在该航向和标高处查看对象。几周后,我确定(现在)它更容易这样做。)
然而,当我将相机靠近我的物体时,这似乎开始分崩离析。例如,经过几次迭代后,我的最大 X NDC 为 0.9989318709122867,我的最小 X NDC 为 -0.9552042384799428。但是,当我查看计算点时,我看起来太靠右了,在下一次迭代中,我的最大 X NDC 是 0.9420058636660581,我的最小 X NDC 是 1.0128126740876888。