假设我有一个3D对象。我没有关于物体形状的详细信息,我唯一的信息是3轴坐标的范围(最小/最大x坐标等)。
考虑到相机的“方向”(因此基本上相机在哪个角度看物体)如何计算相机必须有多远才能在一定尺寸的屏幕上观看整个物体。 / p>
所以基本上我有以下输入:
想要计算相机距离。
我该如何解决这个问题?
我发现了很多关于如何在3D坐标中知道摄像机位置时将3D点投影到2D平面上的信息,但是我无法以匹配输入/输出的方式调整公式。
示例输入将是:
提前致谢!
答案 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
是某个数字,我们将计算处理缩放的数字,而Cx
和Cy
是图片的中心。
这可以使得更复杂以允许例如透视投影,非统一纵横比。参见例如我对这个问题的回答:((3D points projected to form an image))这样的事情处理透视投影。
由于我们将解决f
,我们会重新排列:
f = (X[i] - Cx)/x'[i]
f = (Y[i] - Cy)/y'[i]
让MaxX
成为像素坐标中最大的理想X
点,MaxY
像素坐标中最大的Y
,MinX
和{{1}最小的(我们取像素的中心)。
例如
MinY
我们想要选择一个足够小的MinX=0.5
MaxX=599.5
MinY=0.5
MaxY=599.5
,以便最极端f
或x'[i]
点映射到其中一个像素上。
注意:我假设对象已经居中:如果不是,那么我们也需要计算一个好的y'[i]
和Cx
(并且更适合图像可以像那样实现。
计算每个Cy
和X
方向的最大和最小旋转点(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
提醒:通过添加透视投影,允许不同的图像中心,缩放等,您可以通过多种方式使其变得更加复杂。这种方法旨在成为最简单的入门方式。