You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨坐标系导入动画变换矩阵: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的动画系统逻辑是:先对角色应用基础变换,再为每个骨骼叠加包含平移与旋转的变换矩阵。

已尝试的方法及问题

  1. 直接缩放修正位置
    为修正位置的符号与缩放,将基础变换矩阵乘以(S, -S, -S)(S为缩放因子),结果骨骼位置问题解决,但旋转四元数完全失效。

  2. 手动旋转变换矩阵
    尝试通过旋转变换矩阵修正旋转问题,代码如下:

    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轴全局角度翻转,脚部这类复杂骨骼的旋转完全混乱。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:50:28