2015-10-19 52 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請接受我的答案,如果這有助於你目前的問題。 –