4
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);
}

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

除了旋转矩阵是如何形成的,我什么都懂。基本上,它放入归一化向量并转置矩阵,然后以某种方式得出一个旋转矩阵。解释那个数学。

4

1 回答 1

8

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

空间 A 和空间 B 都由一系列基向量定义。所以空间 A 有一些基向量和一个原点。但是,如果您想以数字方式讨论基向量,则必须相对于其他一些空间来讨论它们。否则,这些数字没有意义,因为空格定义了向量中的数字的含义

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

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

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

于 2013-03-16T09:38:18.977 回答