在执行某些矩阵计算期间,我遇到了一些使用GLM的问题。我从我的老师/教授那里得到了一些代码,我需要使用glm实现这部分代码。他使用了一些旧的自编写的lib。
以下是一些更好理解的原始代码:
Mtx4x4 Mo = Mtx4x4(cam.right.x, cam.right.y, cam.right.z, cam.right*-cam.pos,
cam.up.x, cam.up.y, cam.up.z, cam.up*-cam.pos,
-cam.front.x, -cam.front.y, -cam.front.z, -cam.front*-cam.pos,
0.0, 0.0, 0.0, 1.0);
对于这个显而易见的使用方法:glm :: mat4应该是选择,但这也是我的第一个问题:glm :: mat4的参数应该是哪个顺序?关于行主要和列主要顺序的阅读非常困惑。在我的C ++代码中,我使用以下代码创建mat4:
Mo = glm::mat4( orgCameraMat[0].x, orgCameraMat[0].y, orgCameraMat[0].z, (float)glm::dot(orgCameraMat[0],-orgCameraMat[3]),
orgCameraMat[1].x, orgCameraMat[1].y, orgCameraMat[1].z, glm::dot(orgCameraMat[1],-orgCameraMat[3]),
-orgCameraMat[2].x, -orgCameraMat[2].y, -orgCameraMat[2].z, glm::dot(-orgCameraMat[2],-orgCameraMat[3]),
0.0f,0.0f,0.0f,1.0f);
这里我使用了其他一些名称,但orgCameraMat是相机的模型视图矩阵,为glm :: mat4(使用glm :: lookAt创建)
我的第一个问题是:这些矩阵是否相等 - 产生的代码与上面的代码相同?
我的第二个问题是:在给定的代码中稍后他们使用Mtx3x4 Pt(我假设它是从Mtx4x4 P =透视图(fov,aspect,near,far)创建的
以下是代码中的计算:
Mtx4x4 P = perspectiveHorz(renderData.ofov, displayAspect, 0.1, 1000);
Mtx3x4 To = Mtx3x4(P) * Mo;
Mo是上面创建的4x4矩阵(请参阅第一个问题)。 什么是现在的3x4矩阵看起来像?
x x x x x x x
x x x x Or x x x
x x x x x x x
x x x
以下是我使用GLM进行第二部分的内容:
glm::mat4x3 pt = glm::mat4x3(
P[0].x, P[0].y, P[0].z,
P[1].x, P[1].y, P[1].z,
P[2].x, P[2].y, P[2].z,
P[3].x, P[3].y, P[3].z
);
glm::mat4x3 To = pt * Mo;