C++ 透视矩阵不显示我的对象

C++ 透视矩阵不显示我的对象,c++,opengl,glfw,glm-math,C++,Opengl,Glfw,Glm Math,在添加透视矩阵(正交或透视)之前,我的对象将完全打印出来,但添加它们之后,我无法再查看我的对象。我已经调试了程序,知道正在使用对象的正常绘图程序;但是,我不知道它是否被删除/未加载,或者它是否只是看不见。我已经包括了我声明矩阵和动画循环的地方。任何帮助都将不胜感激 //enables matrix uniform GLuint uTransform = glGetUniformLocation(mProgram, "u_transform"); //enables depth testing

在添加透视矩阵(正交或透视)之前,我的对象将完全打印出来,但添加它们之后,我无法再查看我的对象。我已经调试了程序,知道正在使用对象的正常绘图程序;但是,我不知道它是否被删除/未加载,或者它是否只是看不见。我已经包括了我声明矩阵和动画循环的地方。任何帮助都将不胜感激

//enables matrix uniform
GLuint uTransform = glGetUniformLocation(mProgram, "u_transform");

//enables depth testing
glEnable(GL_DEPTH_TEST);

//creates aspect ratio variable
float aspect = 500.0f / 500.0f;
//enables projection matrix
glm::mat4 pmat = glm::perspective(70.0f, aspect, 0.01f, 1000.0f);
//enables view matrix
glm::vec3 eye(0, -5, 2);
glm::vec3 center(0, 0, 0);
glm::vec3 up(0, 0, 1);
glm::mat4 vmat = glm::lookAt(eye, center, up);

while (!glfwWindowShouldClose(mWindow)) //animation loop
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    tmat = pmat * vmat * tmat;
    glUniformMatrix4fv(uTransform, 1, GL_FALSE, glm::value_ptr(tmat)); //sets data type of matrix
    for(int i = 0; i <= numberofshapes; i++)
    {
        glBindVertexArray(shapes[i].vao);
        glDrawArrays(shapes[i].drawtype, 0, shapes[i].numOfvertices);
    }
    if(w==true){
        tmat = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.001f, 0.0f)) * tmat;
    }if(a==true){
        tmat = glm::translate(glm::mat4(1.0f), glm::vec3(-0.001f, 0.0f, 0.0f)) * tmat;
    }if(s==true){
        tmat = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, -0.001f, 0.0f)) * tmat;
    }if(d==true){
        tmat = glm::translate(glm::mat4(1.0f), glm::vec3(0.001f, 0.0f, 0.0f)) * tmat;
    }if(r==true){
        tmat = glm::rotate(glm::mat4(1.0f), glm::radians(0.1f), glm::vec3(0.0f, 1.0f, 0.0f)) * tmat;
    }
    glfwSwapBuffers(mWindow);
    counter+=1;
    glfwPollEvents();
}
//启用矩阵统一
GLuint uTransform=glGetUniformLocation(mProgram,“u_变换”);
//启用深度测试
glEnable(GLU深度试验);
//创建纵横比变量
浮动方向=500.0f/500.0f;
//启用投影矩阵
glm::mat4 pmat=glm::透视图(70.0f,纵横比,0.01f,1000.0f);
//启用视图矩阵
glm::vec3眼(0,-5,2);
glm::vec3中心(0,0,0);
glm::vec3向上(0,0,1);
glm::mat4 vmat=glm::注视(眼睛、中心、向上);
而(!glfwWindowShouldClose(mWindow))//动画循环
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
tmat=pmat*vmat*tmat;
glUniformMatrix4fv(uTransform,1,GL_FALSE,glm::value_ptr(tmat));//设置矩阵的数据类型

对于(int i=0;i,根据的文档,视场角度必须以弧度为单位,而不是以度为单位(自)

将角度从度转换为弧度:

glm::perspective(glm::radians(70.0f), aspect, 0.01f, 1000.0f);
使用代码

tmat = pmat * vmat * tmat;
glUniformMatrix4fv(uTransform, 1, GL_FALSE, glm::value_ptr(tmat));
在每个帧中,您都在不断地将视图和投影矩阵连接到最终模型视图投影矩阵

将其更改为:

glm::mat4 mvp = pmat * vmat * tmat;
glUniformMatrix4fv(uTransform, 1, GL_FALSE, glm::value_ptr(mvp));

我已将代码行更改为:glm::mat4 pmat=glm::perspective(70.0f*3.14159f/180.0f,aspect,0.01f,1000.0f);(它说明M_PI未定义)但是,该对象仍然没有显示。关键在于,您正在每帧重新应用投影矩阵和视图矩阵。您需要将模型变换与投影矩阵和视图分离。在将矩阵传递给shades GL程序后,您正在旋转矩阵。您的
if fir tree
必须在
glUniformMatrix4fv
之前调用。@VictorGubin否,计算在下一帧的
while
循环结束时完成。那么为什么不旋转
pmat
呢?在
pmat*vmat*tmat
之后,这些旋转会产生未定义的结果。