两个空间之间的旋转矩阵

Rotation matrix between two spaces

我正在努力将 Razer Hydra 九头蛇整合到我的项目中。集成并不困难,基本功能已经运行良好。 然而,我有一个问题,我自己无法解决。 这是关于轮换。问题是Sixense SDK space 和我的space 不一样。但唯一的区别是 Z 轴的符号。 在这里你可以在图片上看到它以便更好地理解:

现在我从每个九头蛇控制器得到一个 3x3 旋转矩阵。 但是要使用它,我必须将旋转矩阵转换为 space 的旋转矩阵。我是这样做的:

  float (*mat)[3];
  mat = hydra.controllerRight.rot_mat;

  float x1 = mat[0][0];
  float x2 = mat[0][1];
  float x3 = mat[0][2];
  float x4 = 0;

  float y1 = mat[1][0];
  float y2 = mat[1][1];
  float y3 = mat[1][2];
  float y4 = 0;

  float z1 = mat[2][0];
  float z2 = mat[2][1];
  float z3 = mat[2][2];
  float z4 = 0;

  float w1 = 0;
  float w2 = 0;
  float w3 = 0;
  float w4 = 1;

  // my 4x4 rotation matrix
  MatrixF rotMat( x1, x2, x3, x4,
                  y1, y2, y3, y4,
                  z1, z2, z3, z4,
                  w1, w2, w3, w4 );

现在当然使用这个旋转矩阵的结果是错误的。但我不知道该怎么做才能解决它。我尝试了很多配置,首先是反转 z 值而不是转置矩阵,因为我不确定 sixense 矩阵的结构。

有人可以帮我吗?

我假设,sixense 矩阵是某种模型变换。你在 space A(sixense space)中得到了这个变换,你想在 space B(你的 space)中表示这个变换。

你知道两个 space 之间的系统变换是一个简单的反射矩阵:

          / 1  0  0  0 \
T(B<-A) = | 0  1  0  0 |
          | 0  0 -1  0 |
          \ 0  0  0  1 /

要将 space A M_A 中的模型转换转换为 space B M_B 中的模型转换,您必须乘以:

M_B = T(B<-A) * M_A

这等于对矩阵的第三行取反 M_A(假设是列主矩阵)。看起来这可能是您代码中的所有 z。但它也可以是所有 ..3s.