1

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

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

2 回答 2

2

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

mv = v

这是有效的,因为围绕自身旋转矢量不会改变矢量。(请注意,这个方程有多个解,但它们都只相差一个标量因子。)

不幸的是,如果你不能确定m不包括其他变换,我不知道你是否可以找到旋转轴,或者即使有一个独特的旋转轴要找到。

于 2012-03-29T19:07:59.610 回答
0

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

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

除此之外,您可能还想查看这个答案

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


对象矩阵可以这样表示:

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('local x' 转换为世界空间)向量等。

所以只要最后一列 (m[0..3][3]) 为 0, 0, 0, 1 就可以提取对象位置及其“x”、“y”、“z”向量(“side” , "up", "front" - 这取决于应用程序)来自矩阵。如果最后一列不是“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]

并且各个轴应正确定向(因此您可以确定这不是“镜像”矩阵)。确切的方向取决于您的应用程序。可能是这样的:

  1. crossProduct(objy, objx) == objz
  2. crossProduct(objx, objz) == objy
  3. 交叉产品(objz,objy)== objx
于 2012-03-29T19:25:26.403 回答