2015-10-19 32 views
1

我的代码有问题。目前我正在渲染两个对象。他们是地板和人物。楼层位于VAO [0],位于VAO 1。我的问题是我看不到物体的底板。我知道我必须改变物体底部的视图才能看到它。我想用旋转来做到这一点。我只想换地板。这是我的洞码。有人能帮助我吗?我只想在这个内容的opengl 3.3中使用现代的opengl。我想要这样的看法:My scene红色区域是地板,绿色是数字。 我该如何实现我的目标。供你参考。这是一个测试场景。我远距离的目标就像3D游戏中的洞景。所以这意味着更多的polygones用于地板和其他场景,如墙壁,天花板,房间中的物体和nps。所有这些都是用精灵制作的,因为我认为如果不使用3D程序来创建3D模型,这将是最好的方式。所以如果你有我的物品的提示,欣赏它。 谢谢你的帮助。在opengl中旋转困难3

#define GLFW_NO_GLU 
#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include <iostream> 
#include <glm.hpp> 
#include <gtc/matrix_transform.hpp> 
#include <gtc/type_ptr.hpp> 

int main() 
{ 
    if(glfwInit()==GL_FALSE) 
    { 
     std::cerr<<"GLFW FAIL"; 
     return 1; 
    } 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3); 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE); 
    glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 

    GLFWwindow* window = glfwCreateWindow(1024, 748, "My Game", NULL, NULL); 
    if (window==GL_FALSE) 
    { 
     std::cerr<<"Open Window FAIL"; 
     return 1; 
    } 
    glfwMakeContextCurrent(window); 
    glewExperimental = true; 

    if(glewInit()!=GLEW_OK) 
    { 
     std::cerr<<"GLEW FAIL"; 
     return 1; 
    } 

    glViewport(0, 0, 1024, 748); 

    const GLchar* vertexshadersrc="#version 330 core\n" 
          "layout (location = 0) in vec4 position;\n" 
          "uniform mat4 matrix;\n" 
          "void main()\n" 
          "{\n" 
          "gl_Position = gl_Position=matrix * position;\n" 
          "}\0"; 
    const GLchar* fragmentshadersrc="#version 330 core\n" 
           "out vec4 color;\n" 
           "void main()\n" 
           "{\n" 
           "color=vec4(1.0f,0.0f,0.0f,1.0f);\n" 
           "}\0"; 

    GLuint vertexshader=glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vertexshader,1,&vertexshadersrc,NULL); 
    glCompileShader(vertexshader); 

    GLint compile_ok; 
    GLint errlength; 
    GLchar* errmsg; 
    glGetShaderiv(vertexshader,GL_COMPILE_STATUS, &compile_ok); 
    if(compile_ok==GL_FALSE) 
    { 
     glGetShaderiv(vertexshader, GL_INFO_LOG_LENGTH,&errlength); 
     errmsg=new GLchar[errlength]; 
     glGetShaderInfoLog(vertexshader,errlength,&errlength,errmsg); 
     std::cerr<<"Vertexshader"; 
     std::cerr<<errmsg; 
     return 1; 
    } 


    GLuint fragmentshader=glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fragmentshader,1,&fragmentshadersrc,NULL); 
    glCompileShader(fragmentshader); 

    glGetShaderiv(fragmentshader,GL_COMPILE_STATUS, &compile_ok); 
    if(compile_ok==GL_FALSE) 
    { 
     glGetShaderiv(fragmentshader, GL_INFO_LOG_LENGTH,&errlength); 
     errmsg=new GLchar[errlength]; 
     glGetShaderInfoLog(fragmentshader,errlength,&errlength,errmsg); 
     std::cerr<<"Fragmentshader"; 
     std::cerr<<errmsg; 
     return 1; 
    } 

    GLuint programm=glCreateProgram(); 
    glAttachShader(programm,vertexshader); 
    glAttachShader(programm,fragmentshader); 
    glLinkProgram(programm); 
    glDeleteShader(vertexshader); 
    glDeleteShader(fragmentshader); 

    GLfloat floor[]= 
    { 
     -1.0f, 0.0f, 1.0f, 
     -1.0f, 0.0f, -1.0f, 
     1.0f, 0.0f, 1.0f, 
     1.0f, 0.0f, -1.0f, 
    }; 

    GLfloat floorc[]= 
    { 

    1.0f,0.0f,0.0f,1.0f 
    }; 

    GLfloat figure[] = { 
     -0.2f, 0.4f, -0.1f, 
     -0.2f, 0.0f, -0.1f, 
     0.2f, 0.4f, -0.1f, 
     0.2f, 0.0f, -0.1f 
    }; 

    GLfloat figurec[]= 
    { 
     0.0f,1.0f,0.0f,1.0f 
    }; 

    GLfloat tree[] = { 
     -0.7f, 0.4f, -0.1f, 
     -0.7f, 0.0f, -0.1f, 
     -0.3f, 0.4f, -0.1f, 
     -0.3f, 0.0f, -0.1f 
    }; 

    GLuint VAO[3], VBO[6]; 
    glGenVertexArrays(3, VAO); 
    glGenBuffers(6, VBO); 

    glBindVertexArray(VAO[0]); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO[0]); 
    glBufferData(GL_ARRAY_BUFFER,sizeof(floor),floor,GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 


    glBindBuffer(GL_ARRAY_BUFFER, VBO[1]); 
    glBufferData(GL_ARRAY_BUFFER,sizeof(floorc),floorc,GL_STATIC_DRAW); 
    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 

    glBindVertexArray(VAO[1]); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO[2]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(figure), figure, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 


    glBindBuffer(GL_ARRAY_BUFFER, VBO[3]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(figurec), figurec, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 

    glBindVertexArray(VAO[2]); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO[4]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(tree), tree, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 

    glm::mat4 projection; 
    projection=glm::perspective(45.0f,4.0f/3.0f,0.1f,100.0f); 
    glm::mat4 modelview; 
    modelview=glm::translate(glm::mat4(1.0f),glm::vec3(0.0f, 0.0f, -1.0f)); 
    glm::mat4 mpmatrix=projection*modelview; 

    //GLuint position=glGetAttribLocation(programm,"position"); 
    GLuint matrixuni=glGetUniformLocation(programm,"matrix"); 
    //glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(GLvoid*)0); 
    glUseProgram(programm); 

    glUniformMatrix4fv(matrixuni,1,GL_FALSE,&mpmatrix[0][0]); 


    while (!glfwWindowShouldClose(window)) 
    { 
     glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glBindVertexArray(VAO[0]); 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

     glBindVertexArray(VAO[1]); 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

     /*glBindVertexArray(VAO[2]); 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);*/ 

     glfwPollEvents(); 
     glfwSwapBuffers(window); 
    } 
    glfwTerminate(); 
    return 0; 
} 
+1

“我知道我有翻译的对象地上以使其可见我想用一个旋转做到这一点“你想转化它,还是旋转它(或者甚至两者)? – derhass

回答

0

从3个矩阵产生的屏幕上的图像:投影矩阵,视图矩阵和模型矩阵。似乎你忘了查看矩阵。我换成这个代码的矩阵部分:

glm::mat4 projection; 
projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f); 

glm::mat4 view; 
view = glm::lookAt(glm::vec3(0, 0.25, 0.75), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); 

glm::mat4 modelview; 
modelview = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -1.0f)); 

glm::mat4 mpmatrix = projection*view*modelview; 

而且我得到了这样的画面: enter image description here

它看起来像但是这两个对象有红色的颜色,因为它们使用其中相同的着色器的颜色设置为红色。

UPD: 也许对你会足够降低一点楼层高度:

GLfloat floor[] = { 
    -1.0f, -0.05f, 1.0f, 
    -1.0f, -0.05f, -1.0f, 
    1.0f, -0.05f, 1.0f, 
    1.0f, -0.05f, -1.0f, 
}; 
+0

非常感谢您的帮助。但是,当您旋转查看所有对象时,对象图不是100%垂直。我只想改变对象层,不想对其他对象产生影响,因为它们都应该与屏幕平行,这意味着100%垂直。如果你有一个想法,请将其发布。 – Crane

+0

可以在'lookAt'函数中为两个点设置相同的高度。 'view = glm :: lookAt(glm :: vec3(0,0.1,-1.75),glm :: vec3(0,0.1,0),glm :: vec3(0,1,0));'。对你有帮助吗?在这种情况下,您将拥有z = 0的XY平面。你可以看到这个平面(从z <0的点),比如你的屏幕。 –

+0

@Crane请接受我的答案,如果这有助于你目前的问题。 –