目前,我正在并行运行两个具有两个不同坐标系统的游戏引擎:
要转换顶点位置(TR->SM64 64),我只需:
-y/scaling
逆变换(SM64 -> TR)显然类似于:
-y*scaling
现在,我想将动画转换矩阵从SM64导入到TR中,以便将马里奥的动画应用于Lara。这里的问题变成了旋转四元数。
SM64动画系统对字符进行了基变换,然后对字符钻机的每根骨头进行平移和旋转,不断地堆叠更多的变换矩阵。
为了确定位置的标号和标度,我将基变换矩阵乘以(S,-S,-S),其中S是标度因子。当转换到TR时,固定了骨头的位置,但是旋转的四元数是完全破坏的。
为了修复它,我在转换矩阵中应用了一些旋转:
mat = mat4(
originalMatrix[0][0], originalMatrix[0][1], originalMatrix[0][2], originalMatrix[0][3],
originalMatrix[1][0], originalMatrix[1][1], originalMatrix[1][2], originalMatrix[1][3],
originalMatrix[2][0], originalMatrix[2][1], originalMatrix[2][2], originalMatrix[2][3],
originalMatrix[3][0], originalMatrix[3][1], originalMatrix[3][2], originalMatrix[3][3]
);
mat.rotateX(-M_PI/2);
mat.rotateZ(M_PI/2);
position=mat.getPos();
rot=mat.getRot(); //gets a rotation quaternion但不幸的是,它改变了Y的整体角度,对于更复杂的骨旋转(比如脚),它就会变得一团糟:
https://i.imgur.com/A00clc3.mp4
我真的不知道如何正确地将一个坐标系统转换成另一个坐标系统。
我看到了一些关于如何改变坐标系的视频教程,但我仍然无法管理它。
编辑:我看到并再次被建议的例子之一是去做
Tinv * Matrix * T但不幸的是,这样做的效果并不好:
mat4 T = mat4(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, -1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
mat = T.inverse()*mat*T;

这个位置被倒置在地面上(为了避免混乱,我移除了缩放中的标牌),旋转仍然是错误的。
发布于 2022-09-12 20:22:06
在的帮助下,我设法找到了解决这个问题的方法。
对于开始,让我们将T定义为两个坐标系之间的转换矩阵:
mat4 T = mat4(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, -1.0f, 0.0f, 0.0f,
0.0f, 0.0f, -1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);1-我将我想要在TR侧操纵T的身体部分的所有顶点相乘,因此它们在与SM64相同的坐标中:
vertex = T*vertex;2-我旋转了SM64矩阵,使它与TR坐标排列在一起:
mat = mat4(
originalMatrix[0][0], originalMatrix[0][1], originalMatrix[0][2], originalMatrix[0][3],
originalMatrix[1][0], originalMatrix[1][1], originalMatrix[1][2], originalMatrix[1][3],
originalMatrix[2][0], originalMatrix[2][1], originalMatrix[2][2], originalMatrix[2][3],
originalMatrix[3][0], originalMatrix[3][1], originalMatrix[3][2], originalMatrix[3][3]
);
mat.rotateX(M_PI/2);
mat.rotateZ(-M_PI/2);3-我对矩阵坐标系统进行了转换:
mat = T.inverse()*mat*T;4-将SM64转换开始时应用的标度i从S、-S、-S更改为S、S、S。
在所有这些之后,我终于将动画转换矩阵从SM64引擎正确地转换到了TR中。
https://stackoverflow.com/questions/73676346
复制相似问题