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一起用于渲染。
我理解旋转矩阵的形成方式。基本上,它放入归一化向量并转置矩阵,并以某种方式产生旋转矩阵。解释数学。
答案 0 :(得分:7)
变换矩阵将顶点从一个空间转换为另一个空间。假设初始空间是空间A,最后的空间是空间B.
空间A和空间B均由series of basis vectors定义。因此,空间A具有一些基础向量和原点。但是,如果您想以数字方式讨论基础向量,则必须相对于其他空间来讨论它们。否则,数字没有意义,因为空格定义了向量中的数字。
从空间A到空间B的变换矩阵是空间A 相对于空间B 表示的基矢量。变换的第一列是空间A的X轴相对于空间B的方向。第二列是A的Y轴,第三列是A的Z轴。
代码正在做的是为相机空间生成相对于给定世界空间的基础向量(由给出的三个向量定义)。因此,它构建了一个矩阵,在相机空间中占据顶点并将它们吐出世界空间。
然而,它想要生成的矩阵是从世界空间到相机空间的转换。所以它之前反转矩阵; A-to-B矩阵的逆是B-to-A矩阵。有趣的事实:纯旋转矩阵的逆与其转置相同,这也更容易计算。