(Unity3D) MultiplyPoint 和 MultiplyPoint3x4 的区别

Jam*_*ley 2 3d vector matrix unity-game-engine

Unity 文档和往常一样无用。

MultiplyPoint3x4 只是一个变换矩阵 - 我已经手动使用点积进行了测试并具有相同的输出。

不过我很困惑超过标准矩阵乘法之间有什么不同MultiplyPoint3x4和使用MultiplyPoint。有人告诉我源代码许可证可用,但我只需要一个功能。

欢迎任何建议。

Jus*_*ers 5

我也对这个很好奇。Unity 可能会跳过矩阵乘法的哪些步骤?优化是可能的,因为缩放和旋转只需要一个 3x3 矩阵和另一个用于平移的向量。因此完整 4x4 矩阵的一部分未使用,可以在乘法中忽略。

public Vector3 MultiplyPoint(Vector3 v)
{
    Vector3 vector3;
    vector3.x =  ( m00 *  v.x +  m01 *  v.y +  m02 *  v.z) + m03;
    vector3.y =  ( m10 *  v.x +  m11 *  v.y +  m12 *  v.z) + m13;
    vector3.z =  ( m20 *  v.x +  m21 *  v.y +  m22 *  v.z) + m23;
    float num = 1f / ( ( m30 *  v.x +  m31 *  v.y +  m32 *  v.z) + m33); // this is 1/1=1 when m30, m31, m32 = 0 and m33 = 1
    vector3.x *= num; // so then multiplying by 1 is pointless..
    vector3.y *= num;
    vector3.z *= num;
    return vector3;
}
Run Code Online (Sandbox Code Playgroud)

这是一个完整的 4x4 * 4x1 矩阵乘法,然后通过结果的 w 缩放结果的 xyz。

一般乘法点公式

这对于投影变换是必需的,但对于旋转和缩放不是必需的。

这就是为什么他们拥有更快的 3x4 版本。它假设每列的 w 分量为 0,并跳过乘法和缩放的底行,因为结果 w 始终为 1。

public Vector3 MultiplyPoint3x4(Vector3 v)
{
    Vector3 vector3;
    vector3.x =  ( m00 *  v.x +  m01 *  v.y +  m02 *  v.z) + m03;
    vector3.y =  ( m10 *  v.x +  m11 *  v.y +  m12 *  v.z) + m13;
    vector3.z =  ( m20 *  v.x +  m21 *  v.y +  m22 *  v.z) + m23;
    return vector3;
}
Run Code Online (Sandbox Code Playgroud)

此函数等效于将矩阵相乘,如下所示:

快速乘点公式

源代码从此页面引用:https : //github.com/jameslinden/unity-decompiled/blob/master/UnityEngine/UnityEngine/Matrix4x4.cs