3D对象的相机距离

时间:2012-12-07 10:18:41

标签: 3d camera projection perspective

假设我有一个3D对象。我没有关于物体形状的详细信息,我唯一的信息是3轴坐标的范围(最小/最大x坐标等)。

考虑到相机的“方向”(因此基本上相机在哪个角度看物体)如何计算相机必须有多远才能在一定尺寸的屏幕上观看整个物体。 / p>

所以基本上我有以下输入:

  • 对象边界
  • 相机“方向”
  • 屏幕尺寸

想要计算相机距离。

我该如何解决这个问题?

我发现了很多关于如何在3D坐标中知道摄像机位置时将3D点投影到2D平面上的信息,但是我无法以匹配输入/输出的方式调整公式。

示例输入将是:

  • x:(0-100),y:(0-100),z:(0-100)
  • 相机看着物体,好像它绕Z轴旋转45°,绕X轴旋转45°
  • 屏幕尺寸为600x600

提前致谢!

1 个答案:

答案 0 :(得分:1)

我将在下面的答案中假设一个正交投影,但是对透视投影的扩展应该很容易。对于小物体,正交投影看起来没问题(因为我们习惯于看不到透视效果)。

对于每个点i,让x[i]y[i]z[i]为对象空间中的原始坐标。

x'[i]y'[i]z'[i]成为旋转到相机空间的点(这可以通过将旋转变换应用到每个点来计算 - 我认为这部分很容易你)。

正交投影将是:

X[i] = f*x'[i] + Cx
Y[i] = f*y'[i] + Cy

f是某个数字,我们将计算处理缩放的数字,而CxCy是图片的中心。 这可以使得更复杂以允许例如透视投影,非统一纵横比。参见例如我对这个问题的回答:((3D points projected to form an image))这样的事情处理透视投影。

由于我们将解决f,我们会重新排列:

f = (X[i] - Cx)/x'[i]
f = (Y[i] - Cy)/y'[i]

MaxX成为像素坐标中最大的理想X点,MaxY像素坐标中最大的YMinX和{{1}最小的(我们取像素的中心)。

例如

MinY

我们想要选择一个足够小的MinX=0.5 MaxX=599.5 MinY=0.5 MaxY=599.5 ,以便最极端fx'[i]点映射到其中一个像素上。

注意:我假设对象已经居中:如果不是,那么我们也需要计算一个好的y'[i]Cx(并且更适合图像可以像那样实现。

计算每个CyX方向的最大和最小旋转点(Y表示min_i(x[i])的所有可能值x[i]的最小值}}):

i

现在求解每个极端像素映射到每个极值点所需的焦距:

minx = min_i(x[i])
maxx = max_i(x[i])
miny = min_i(y[i])
maxy = max_i(y[i])

我们选择其中最小的一个,以确保整个对象适合屏幕。

示例

如果我们假设最左侧的点(后旋转)位于

f_1 = (MinX - Cx)/minx
f_2 = (MaxX - Cx)/maxx
f_3 = (MinY - Cy)/miny
f_4 = (MaxY - Cy)/maxy

最正确的观点:

minx = -1.2

最向上的点(注意我假设像素coordiantes与空间坐标对齐):

maxx = 1.5

最下挫点(注意我假设像素坐标与空间坐标对齐):

miny = -1.3

我们使用您的maxy = 1.3 图片示例。

对于我们解决600x600的每一个:

f

现在我们选择最小的f_1 = (0.5 - 300)/-1.2 = 249.6 f_2 = (599.5 - 300)/1.5 = 199.7 f_3 = (0.5 - 300)/-1.3 = 230.4 f_4 = (599.5 - 300)/1.3 = 230.4 ,我们得到:

f

正交投影将是:

f=199.7

提醒:通过添加透视投影,允许不同的图像中心,缩放等,您可以通过多种方式使其变得更加复杂。这种方法旨在成为最简单的入门方式。