我从世界坐标系1到2有一个相似性变换 S 。我还有一组3D点 x_i 和投影矩阵 P_j 世界坐标系1或2中的(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中的投影矩阵。
答案 0 :(得分: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
要说相机矩阵在“任何”特定坐标系中“没有意义”。矩阵位于坐标系之间。
答案 1 :(得分:1)
我自己找到了解决方案:
投影矩阵P1将3D点投影到图像平面,从而投影到 源坐标系中的2D点:
x' = P1 * X1
可以通过应用将3D点转换为目标系统 相似变换S:
X2 = S * X1
获得改变投影矩阵P2的投影矩阵P2 目标系统到2D点,不会改变:
x' = P2 * X2 = P2 * S * X1 = P1 * S^-1 * S * X1 = P1 * I * X1
因此:
P2' = P1 * S^-1
最后,缩放因子的标准化是必要的:
P2 = s * P2'