假设我有"look "one_answers";perspective"矩阵。现在我需要从相应的相机上的2d点和相机与前者之间的距离计算一个世界3d点。
当然,相反的问题很容易解决:point2D = lookAt * perspective * point3D
。这意味着point3D = (lookAt * perspective)^-1 * point2D
。但我不清楚这里的距离应该用在哪里,以及"附加"是什么。点的值,即用问号(x, y, z, ?)
和(x, y, ?, ?)
表示的值。我猜这些值(或其中一些)可以从距离中得出?
或者这个任务不能以这种方式逆转?如果是这样,我该如何在不深入几何的情况下解决它?
我不知道你说的"看"是什么。和";perspective"矩阵。
也就是说,假设相机上有一个坐标系,光轴沿Z轴,光心为原点,成像平面与它的距离为f,以像素表示,我们有关系f X/Z = i - w/2
f Y/Z = j - h/2
其中X, Y, Z
为空间坐标,i, j
为像素索引,w, h
为图像宽度和高度(以像素为单位)。
由此,我们通过
绘制到摄像机的距离f²D²/Z² = f²(X²+Y²+Z²)/Z² = (i - w/2)²+(j-h/2)²+f²
为
Z = fD/√((i - w/2)²+(j-h/2)²+f²)
X = Z/f (i - w/2)
Y = Z/f (j - h/2)
你可以通过仿射变换把这些相对于相机的坐标转换成你的世界坐标。
注意"与相机的距离"可以有不同的理解方式。它可以是真欧几里得距离,也可以是到包含该点的平面的距离。
我非常怀疑
(lookAt * perspective)^-1
存在。你不能逆看,它是一个投影矩阵,所以它有一维核因此它的行列式为零
由于没有关于这些矩阵的具体信息,这可以帮助我找出一个更几何的解决方案,只是使用蛮力计算。建立线性方程组
A = lookAt * perspective
y = 2Dpoint
x = 3Dpoint
A * x = y
你知道y
,所以用高斯消去法求解x
。你将得到一个只有一个参数的解族x = x0 + t*u0
。然后,取矢量e4 = [0,0,0,1]
并建立方程
|perspective*(x0 + t*u0) - e4|^2 = (distance_between_x_and_camera)^2
表示未知变量t
。这是一个二次方程,所以很容易解。当你找到解$t0$(有两个解,选一个使3D点更接近2D点的解),你就得到了你的位置
3Dpoint = x = x0 + t0*u0