将 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_xy
是 xy
平面中的旋转,[*]_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)。在您的编程语言中寻找该算法的实现,插入能量并求解最佳旋转参数。
我正在将密度值的 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_xy
是 xy
平面中的旋转,[*]_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)。在您的编程语言中寻找该算法的实现,插入能量并求解最佳旋转参数。