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

如何将从.X文件读取的Matrix4x4矩阵正确转换适配到Unity引擎使用

问题核心原因

DirectX的.X文件默认采用左手坐标系+行优先矩阵存储规则,而Unity的Matrix4x4结构使用右手坐标系+列优先存储规则,两者的坐标系习惯和存储顺序差异是你出现Z轴镜像、动画错位的核心原因。


1. 先修正矩阵读取顺序

你当前的代码是按列填充Unity矩阵,但.X文件导出的16个浮点数默认按行排列,顺序为:m00、m01、m02、m03、m10、m11、m12、m13、m20、m21、m22、m23、m30、m31、m32、m33,需要先把这组行优先数值正确映射到Unity的矩阵结构中。

2. 正确的左右手转换规则

你之前尝试失败的核心原因是漏了对平移分量的Z列元素m32取负,完整的手动取负规则如下,不需要额外修改顶点的Z坐标:

  • 对矩阵第三列(j=2)的m02、m12、m32取负
  • 对矩阵第三行(i=2)的m20、m21、m23取负

你也可以用矩阵乘法的方式自动完成转换,代码更不容易出错:

// 按顺序读取.X文件里的16个原始浮点值
float[] dxRawMat = new float[16];
for (int i = 0; i < 16; i++)
{
    dxRawMat[i] = readfloat();
}

// 构造DX侧的原始行优先矩阵
Matrix4x4 dxMat = new Matrix4x4(
    new Vector4(dxRawMat[0], dxRawMat[4], dxRawMat[8], dxRawMat[12]),
    new Vector4(dxRawMat[1], dxRawMat[5], dxRawMat[9], dxRawMat[13]),
    new Vector4(dxRawMat[2], dxRawMat[6], dxRawMat[10], dxRawMat[14]),
    new Vector4(dxRawMat[3], dxRawMat[7], dxRawMat[11], dxRawMat[15])
);

// 坐标系转换校正
Matrix4x4 zFlip = Matrix4x4.Scale(new Vector3(1, 1, -1));
Matrix4x4 unityMat = zFlip * dxMat * zFlip;

return unityMat;

3. 特殊情况适配

如果你的.X文件导出时做过Y/Z轴交换的自定义处理,只需要把上述校正矩阵的Scale参数修改为new Vector3(1, -1, 1)即可,常规导出的.X资源用上述代码即可解决镜像错位问题。


内容的提问来源于stack exchange,提问作者Zéiksz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:45:04