跨坐标系导入动画变换矩阵:TR与SM64旋转适配难题
跨坐标系动画变换矩阵适配问题
当前同时运行两套坐标系不同的游戏引擎:Tomb Raider(TR)坐标系和Super Mario 64(SM64)坐标系,顶点位置转换规则如下:
TR → SM64 转换规则
- x' = x/scaling
- y' = -y/scaling
- z' = -z/scaling
SM64 → TR 转换规则
- x' = x*scaling
- y' = -y*scaling
- z' = -z*scaling
需要将SM64的动画变换矩阵导入TR,实现把马里奥的动画应用到劳拉身上,但旋转四元数出现适配问题。SM64的动画系统逻辑是:先对角色应用基础变换,再为每个骨骼叠加包含平移与旋转的变换矩阵。
已尝试的方法及问题
直接缩放修正位置
为修正位置的符号与缩放,将基础变换矩阵乘以(S, -S, -S)(S为缩放因子),结果骨骼位置问题解决,但旋转四元数完全失效。手动旋转变换矩阵
尝试通过旋转变换矩阵修正旋转问题,代码如下: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轴全局角度翻转,脚部这类复杂骨骼的旋转完全混乱。
Tinv * Matrix * T 变换方式
尝试用坐标系变换的标准方式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;结果角色位置倒置到地面以下,旋转仍不正确。
现寻求正确的跨坐标系变换矩阵转换方法。
内容的提问来源于stack exchange,提问作者RicardoSBA
相关产品推荐
相关产品推荐

