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

Dan*_*ter 4 java opengl graphics transformation matrix

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);
}
Run Code Online (Sandbox Code Playgroud)

此代码生成一个世界到相机矩阵,将与openGL一起用于渲染.

我理解旋转矩阵的形成方式.基本上,它放入归一化的向量并转置矩阵,并以某种方式产生旋转矩阵.解释数学.

Nic*_*las 7

变换矩阵将顶点从一个空间转换为另一个空间.假设初始空间是空间A,最后的空间是空间B.

空间A和空间B都由一系列基矢量定义.因此,空间A具有一些基础向量和原点.但是,如果您想以数字方式讨论基础向量,则必须相对于其他空间来讨论它们.否则,数字没有意义,因为空格定义了向量中的数字意味着什么.

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

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

然而,它想要生成的矩阵是从世界空间到相机空间的转换.所以它之前反转了矩阵; A-to-B矩阵的逆是B-to-A矩阵.有趣的事实:纯旋转矩阵的逆与其转置相同,这也更容易计算.