4x4变换矩阵 - 如何找出旋转中心?

时间:2012-03-29 18:31:26

标签: coordinate-transformation rotational-matrices

给定任意4x4变换矩阵,我如何找出旋转中心?

m = [m11 m12 m13 m14; 
     m21 m22 m23 m24;
     m31 m32 m33 m34; 
     m41 m42 m43 m44]

2 个答案:

答案 0 :(得分:2)

如果你知道m纯粹是一个旋转矩阵,而不是不同类型的多个变换的聚合,你可以通过求解下面的等式找到旋转轴(向量v):

mv = v

这是有效的,因为围绕自身旋转矢量不会改变矢量。 (注意,这个等式有多种解决方案,但它们的区别仅在于标量因子。)

不幸的是,如果您无法确定m是否包含其他变换,我不知道您是否可以找到旋转轴,或者即使找到了唯一的旋转轴

答案 1 :(得分:0)

  

给定任意4x4变换矩阵,我如何找出旋转中心?

在一般情况下,问题无法解决,因为矩阵可能不代表旋转。它可以是投影矩阵,零矩阵等。

除此之外,您可能需要查看this answer

您的矩阵表示将旧坐标系转换为新坐标系的转换。


对象矩阵可以这样表示:

objx.x     objx.y     objx.z    0 //m[0][0]..m[0][3] or _11, _12, _13, _14
objy.x     objy.y     objy.z    0 //m[1][0]..m[1][3] or _21, _22, _23, _24
objz.x     objz.y     objz.z    0 //m[2][0]..m[2][3] or _31, _32, _33, _34
objpos.x   objpos.y   objpos.z  1 //m[3][0]..m[3][3] or _41, _42, _43, _44

其中m [] []和_11 .._ 44是D3DMATRIX的对应元素,objpos - 对象位置向量,objx - 对象x('局部x'转换为世界空间)向量等

因此,只要最后一列(m [0..3] [3])为0,0,0,1,就可以提取对象位置及其“x”,“y”,“z”向量(矩阵中的“边”,“上”,“前” - 这取决于应用。如果最后一列不是“0,0,0,1”,那么它就是投影矩阵,你不能轻易地从中提取对象数据。


因此,您可以在新坐标系内提取单个向量和旧坐标系的中心,以及各个向量。你可以找到旋转中心或任何你想要的东西。

但是,对于表示旋转的矩阵,必须满足以下条件:

  1. dotProduct(objx,objy)== 0
  2. dotProduct(objx,objz)== 0
  3. dotProduct(objx,objz)== 0
  4. dotProduct(objx,objx)== 1
  5. dotProduct(objy,objy)== 1
  6. dotProduct(objz,objz)== 1
  7. 最后一列是[0,0,0,1]
  8. 单个轴应正确定向(因此您可以确定这不是“镜像”矩阵)。确切的方向取决于您的应用程序。可能是这样的:

    1. crossProduct(objy,objx)== objz
    2. crossProduct(objx,objz)== objy
    3. crossProduct(objz,objy)== objx