目前,我正在拍摄物体边界框的每个角落并将其转换为标准化设备坐标(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。
答案 0 :(得分:1)
您解决此问题的方法不正确。而不是在屏幕坐标方面考虑这一点,考虑一下场景的术语。
您需要计算出相机需要移动多少以使其中的光线射到物体的中心。想象一下,你站在一片田野里,对面是两个人亚历克斯和伯特,伯特站在亚历克斯右边2米处。你现在正在直接看Alex,但是想要看看Burt而不转。如果你知道它们之间的距离和方向,2米和右边。你只需要移动那个距离和方向,即向右和2米。
在数学环境中,您需要执行以下操作:
获取您在3d空间中聚焦的物体的中心,然后投影与您的相机平行的平面,即相机朝向的方向的切线,该点位于该点上。
接下来,从相机光线投影到相机朝向的平面,物体中心点与从相机撞击平面的点之间产生的差异就是移动相机所需的量。无论相机和物体的方向或位置如何,这都应该有效。
答案 1 :(得分:0)
你正在玩第一个问题。鸡还是鸡蛋。每次更改相机属性时,您都可以有效地更改对象在NDC空间中的投影位置。所以即使你认为自己越来越近,你也永远不会到达那里。
从不同角度看问题。将相机放在某处并尝试尽可能规范(即给它1个宽高比)并将物体放在相机的z轴上。这不可能吗?