将 2D 投影旋转角度转换为 3D 对象

Converting 2D projection rotation angles to 3D object

我正在将密度值的 3D 矩阵投影到 3 个 2D 平面(ZX、ZY、XY)中。然后我使用下面的旋转矩阵将每个投影旋转 3 个不同的角度:Pzx、Pzy、Pxy:

如何转换这 3 个单独的角度,以便我可以将它们应用于 3D 变换矩阵,该矩阵将围绕 X、Y、Z(或 Z、Y、X)旋转 3D 对象,例如下面的旋转矩阵:

明确地说,我不希望将角度 Pzx、Pzy、Pxy 应用到 3D 对象,而是计算 2D 中的这些单独旋转在 3D 中会转换成什么。

这个问题产生了一个方程组。设 R_3d 是 3d 中的旋转 space,R_xyxy 平面中的旋转,[*]_xy*xy飞机。然后对于任何一点 v:

I:   [R_3d v]_zx = R_zx [v]_zx
II:  [R_3d v]_zy = R_zy [v]_zy
III: [R_3d v]_xy = R_xy [v]_xy

我们看到每个坐标都存在于两个方程中。让我们检查一下x坐标的相关方程:

a := alpha, b := beta, c := gamma
I:   cos b cos c x - cos b sin c y + sin b z = sin Pzx z + cos Pzx x
III: cos b cos c x - cos b sin c y + sin b z = cos Pxy x - sin Pxy y

我们看到对于任何 v(两个等式的右侧),以下关系都成立:

sin Pzx z + cos Pzx x = cos Pxy x - sin Pxy y

其他两个坐标也存在类似的方程式。只有满足这些条件,才能存在精确的 3d 旋转。如果我没记错的话,只有 Pzx=Pzy=Pxy=0 才会出现这种情况。一般来说,可以计算出一个近似解。我建议基于以下能量的最小二乘解:

E(a, b, c) = Sum { for all v in data set } ( || [R_3d v]_zx - R_zx [v]_zx ||^2
                                           + || [R_3d v]_zy - R_zy [v]_zy ||^2
                                           + || [R_3d v]_xy - R_xy [v]_xy ||^2 )

最佳旋转参数为:

{a, b, c}* = arg min {a, b, c} E(a,b,c)

这个解决方案将最小化对应点的两个投影的距离。

不幸的是,这个问题不是一个很容易解决的线性最小二乘问题。相反,迭代方法可以解决这个问题(例如 Levenberg–Marquardt)。在您的编程语言中寻找该算法的实现,插入能量并求解最佳旋转参数。