Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix (Unity3D)多点和多点3x4之间的差异_Matrix_Vector_Unity3d_3d - Fatal编程技术网

Matrix (Unity3D)多点和多点3x4之间的差异

Matrix (Unity3D)多点和多点3x4之间的差异,matrix,vector,unity3d,3d,Matrix,Vector,Unity3d,3d,团结像往常一样无济于事 MultiplyPoint3x4只是一个转换矩阵——我已经用点积手动测试过了,并且有相同的输出 然而,我对中的标准矩阵乘法和中使用的标准矩阵乘法之间的区别感到非常困惑。 我被告知源代码许可证是可用的,但我只需要一个函数 欢迎任何建议。如文档中所述,MultiplyPoint3x4基本上是MultiplyPoint的更快版本,考虑到矩阵是常规3D变换。至于它到底是如何更快的,正如您可能已经猜到的,除非您能够访问源代码,否则只需相信开发人员自己所说的就符合您的最佳利益。你也可

团结像往常一样无济于事

MultiplyPoint3x4只是一个转换矩阵——我已经用点积手动测试过了,并且有相同的输出

然而,我对中的标准矩阵乘法和中使用的标准矩阵乘法之间的区别感到非常困惑。 我被告知源代码许可证是可用的,但我只需要一个函数


欢迎任何建议。

如文档中所述,MultiplyPoint3x4基本上是MultiplyPoint的更快版本,考虑到矩阵是常规3D变换。至于它到底是如何更快的,正如您可能已经猜到的,除非您能够访问源代码,否则只需相信开发人员自己所说的就符合您的最佳利益。你也可以试着在Unity论坛上发帖,以便有更好的机会让mod/dev注意到你的兴趣

我一直盲目地相信他们。 如果我有证据,我会责备他们。这是一个简单的流程


我希望这有帮助

找到了!-注意:您不需要unity source许可证

公共向量3多点向量3 v { 矢量3结果; 结果.x=this.m00*v.x+this.m01*v.y+this.m02*v.z+this.m03; 结果.y=this.m10*v.x+this.m11*v.y+this.m12*v.z+this.m13; 结果.z=this.m20*v.x+this.m21*v.y+this.m22*v.z+this.m23; float num=this.m30*v.x+this.m31*v.y+this.m32*v.z+this.m33; num=1/num; 结果x*=num; 结果y*=num; 结果z*=num; 返回结果;
}

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

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

这就是为什么他们有更快的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;
}
此函数相当于将矩阵相乘,如下所示:


源代码引用自此页面:

感谢您的解释,但我非常谨慎。不幸的是,与MultiplyPoint 3*4相比,MultiplyPoint为我提供正确输出的原因是阻止我传输到GPU。对unity论坛的建议很好,值得一试。非常感谢!回答得好!希望其他人会在这一点上绊倒。当然,这只是一个优化。当w组件只有一个选择用例时,这是有意义的。不过,我认为他们可以在unity engine后端使用覆盖或接口来处理它,而不会让我们感到困惑:同意。他们至少应该在文档中解释为什么它是有限的。