1

我有一个从世界坐标系 1 到 2 的相似变换S。我还有一组 3D 点x_i和世界坐标系 1 或 2 中的相机投影矩阵P_j (3x4 或 4x4)。

我现在想将系统 1 中的相机(投影矩阵)转换为系统 2。

转换 3D 点按预期工作,但我将如何使用投影矩阵来做到这一点?

我的方法如下:

S = [Ss*SR | St]
P = [R | t]

反转投影矩阵:

PP = inv(P) = [R.T | -R.T*t] = [RR | tt]

旋转相机的方向:

RR' = SR * RR

缩放、旋转和平移位置:

tt' = Ss*SR*tt + St
PP' = [RR' | tt']

对变换后的矩阵求逆,再次得到投影矩阵:

P' = inv(PP')

其中 P 和 P' 分别是系统 1 和 2 中的投影矩阵。

4

2 回答 2

1

你的问题不清楚。 相似变换不是传统的 OpenGL 术语。管道从对象坐标开始。模型变换 M 将这些坐标转换为世界坐标(只有一个世界坐标系)。视图变换 V 将这些转换为眼睛坐标。有时将视图矩阵称为相机矩阵,因为 V 将假设的相机视线向量和眼睛点分别指向世界负 z 轴和原点。投影变换 P 将眼睛坐标转换为同质 (4d) 剪辑坐标。在平行投影中,这些与标准化设备坐标相同。从角度来看,除法仍然需要执行,但这不能表示为 4x4 矩阵运算,对于您想要的也不重要。所以 4d 中的整个管道是

d = P V M x

其中d是剪辑/标准化设备坐标,x是对象坐标。您可以在渲染场景时更改任何或所有管道。但是改变 P 或 V 是不寻常的。

所以你的问题没有多大意义。相机矩阵 V 用眼睛坐标中的点和矢量来描述。如果您想查看它们在对象空间中的位置,只需乘以 inv(M)。也许(我猜)您拥有的是两个对象空间和相应的模型矩阵,可以将它们带到一个共同的世界:

d = P V M_1 x_1
d = P V M_2 x_2

现在,如果您在对象系统 1 中有一个眼点和矢量,并且需要将它们带到系统 2,请执行明显的操作。根据 x_1 求解 x_2:

x_2 = inv(M_2) M_1 x_1

说相机矩阵“在”任何特定的坐标系都没有意义。矩阵在坐标系之间。

于 2013-11-09T00:44:17.410 回答
1

我自己找到了解决方案:

投影矩阵 P1 将 3D 点投影到图像平面,从而投影到源坐标系中的 2D 点:

x' = P1 * X1

通过应用相似性变换 S,可以将 3D 点转换为目标系统:

X2 = S * X1

要获得将目标系统中的 3D 点转换为不变的 2D 点的投影矩阵 P2:

x' = P2 * X2 = P2 * S * X1 = P1 * S^-1 * S * X1 = P1 * I * X1

因此:

P2' = P1 * S^-1

最后,需要按比例因子进行归一化:

P2 = s * P2'
于 2013-11-09T16:57:22.570 回答