Unity文档像往常一样毫无帮助。

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

但是,我对MultiplyPoint3x4中的标准矩阵乘法与MultiplyPoint使用的标准矩阵乘法之间的区别感到困惑。
有人告诉我源代码许可证可用,但是我只需要一个功能。

任何意见欢迎。

最佳答案

我对此也很好奇。 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;
}


这是完整的4x4 * 4x1矩阵乘法,然后按结果的w缩放结果的x y z。

matrix - (Unity3D)MultiplyPoint和MultiplyPoint3x4之间的区别-LMLPHP

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

这就是为什么他们拥有更快的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;
}


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

matrix - (Unity3D)MultiplyPoint和MultiplyPoint3x4之间的区别-LMLPHP

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

10-04 16:17