gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:22:36 32 4
gpt4 key购买 nike

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 矩阵乘法,然后将结果的 x y z 按结果的 w 进行缩放。

general multiply pointformula

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

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

此函数相当于矩阵相乘,如下所示:

fast multiply point formula

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

关于matrix - (Unity3D)MultiplyPoint 和 MultiplyPoint3x4 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35208476/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com