了解glm矩阵格式

时间:2014-07-22 12:33:59

标签: c++ matrix glm-math

在执行某些矩阵计算期间,我遇到了一些使用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;

0 个答案:

没有答案