Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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
Java 需要帮助理解这个旋转矩阵的数学代码吗_Java_Opengl_Graphics_Matrix_Transformation - Fatal编程技术网

Java 需要帮助理解这个旋转矩阵的数学代码吗

Java 需要帮助理解这个旋转矩阵的数学代码吗,java,opengl,graphics,matrix,transformation,Java,Opengl,Graphics,Matrix,Transformation,这段代码生成一个世界到摄影机的矩阵,该矩阵将与openGL一起用于渲染 除了旋转矩阵是如何形成的,我什么都懂。基本上,它把标准化向量和转置矩阵,不知怎的,这就产生了一个旋转矩阵。解释数学。变换矩阵将顶点从一个空间变换到另一个空间。假设初始空间是空间A,最终空间是空间B 空间A和空间B都由A定义。所以空间A有一些基向量和一个原点。然而,如果你想用数字来讨论基向量,你必须讨论它们相对于其他空间的关系。否则,这些数字就没有意义了,因为空间定义了向量中的数字的含义 从空间A到空间B的变换矩阵是空间A相对

这段代码生成一个世界到摄影机的矩阵,该矩阵将与openGL一起用于渲染


除了旋转矩阵是如何形成的,我什么都懂。基本上,它把标准化向量和转置矩阵,不知怎的,这就产生了一个旋转矩阵。解释数学。

变换矩阵将顶点从一个空间变换到另一个空间。假设初始空间是空间A,最终空间是空间B

空间A和空间B都由A定义。所以空间A有一些基向量和一个原点。然而,如果你想用数字来讨论基向量,你必须讨论它们相对于其他空间的关系。否则,这些数字就没有意义了,因为空间定义了向量中的数字的含义

从空间A到空间B的变换矩阵是空间A相对于空间B表示的基本向量。变换的第一列是空间A的X轴方向,相对于空间B。第二列是A的Y轴,第三列是A的Z轴

代码所做的是生成相机空间的基向量,相对于给定的世界空间(由给定的三个向量定义)。因此,它构建了一个矩阵,在摄影机空间中获取顶点,并在世界空间中吐出它们


但是,它要生成的矩阵是从世界空间到摄影机空间的变换。因此,它先将矩阵求逆;A-to-B矩阵的逆矩阵是B-to-A矩阵。有趣的事实:纯旋转矩阵的逆矩阵与其转置矩阵相同,这也更容易计算。

最好在那里问这个问题。
private Mat4 calcLookAtMatrix(Vec3 cameraPt, Vec3 lookPt, Vec3 upPt) {
    Vec3 lookDir = Glm.normalize(Vec3.sub(lookPt, cameraPt));
    Vec3 upDir = Glm.normalize(upPt);

    Vec3 rightDir = Glm.normalize(Glm.cross(lookDir, upDir));
    Vec3 perpUpDir = Glm.cross(rightDir, lookDir);

    Mat4 rotMat = new Mat4(1.0f);
    rotMat.setColumn(0, new Vec4(rightDir, 0.0f));
    rotMat.setColumn(1, new Vec4(perpUpDir, 0.0f));
    rotMat.setColumn(2, new Vec4(Vec3.negate(lookDir), 0.0f));

    rotMat = Glm.transpose(rotMat);

    Mat4 transMat = new Mat4(1.0f);
    transMat.setColumn(3, new Vec4(Vec3.negate(cameraPt), 1.0f));

    return rotMat.mul(transMat);
}