2013-10-15 5 views
0

Итак, я могу нарисовать вращающийся куб с помощью OpenGL3.2 + и перевести его из 0,0,0 и влево, но когда я попытаюсь нарисовать второй (в сторону справа), он не оказывает ...Нарисуйте 2 куба в OpenGL, используя GLM

Это моя функция отображения:

void display()         
    { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glUseProgram(myShader.handle()); 

    GLuint matLocation = glGetUniformLocation(myShader.handle(), "ProjectionMatrix"); 
    glUniformMatrix4fv(matLocation, 1, GL_FALSE, &ProjectionMatrix[0][0]); 

    spinY+=0.03; 
    if(spinY>360) spinY = 0; 

    glm::mat4 viewMatrix; 
    viewMatrix = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-100));  //viewing matrix 
    ModelViewMatrix = glm::translate(viewMatrix,glm::vec3(-30,0,0));  //translate object from the origin 
    ModelViewMatrix = glm::rotate(ModelViewMatrix,spinY, glm::vec3(0,1,0));     //rotate object about y axis 

    glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix"), 1, GL_FALSE, &ModelViewMatrix[0][0]); //pass matrix to shader 

    //Add the following line just before the line to draw the cube to 
    //check that the origin of the cube in eye space is (-30, 0, -100); 
    result = glm::vec3(ModelViewMatrix * glm::vec4(0,0,0,1)); 
    std::cout<<glm::to_string(result)<<std::endl; //print matrix to get coordinates. 

    myCube.render(); 
    glUseProgram(0); 
    } 

Я хочу, чтобы иметь возможность использовать тот же класс Куб/размер и т.д., а просто сделать его еще раз (я предположим, что это самый эффективный/лучший способ сделать это).

Я попробовал этот

void display()         
    { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glUseProgram(myShader.handle()); 

    GLuint matLocation = glGetUniformLocation(myShader.handle(), "ProjectionMatrix"); 
    glUniformMatrix4fv(matLocation, 1, GL_FALSE, &ProjectionMatrix[0][0]); 

    spinY+=0.03; 
    if(spinY>360) spinY = 0; 

    glm::mat4 viewMatrix; 
    viewMatrix = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-100));  //viewing matrix 
    ModelViewMatrix = glm::translate(viewMatrix,glm::vec3(-30,0,0));  //translate object from the origin 
    ModelViewMatrix = glm::rotate(ModelViewMatrix,spinY, glm::vec3(0,1,0));     //rotate object about y axis 

    glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix"), 1, GL_FALSE, &ModelViewMatrix[0][0]); //pass matrix to shader 

    //Add the following line just before the line to draw the cube to 
    //check that the origin of the cube in eye space is (-30, 0, -100); 
    result = glm::vec3(ModelViewMatrix * glm::vec4(0,0,0,1)); 
    std::cout<<glm::to_string(result)<<std::endl; //print matrix to get coordinates. 

    myCube.render(); 

    glm::mat4 viewMatrix_TWO; 
    viewMatrix_TWO = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-100));  //viewing matrix 
    ModelViewMatrix_TWO = glm::translate(viewMatrix_TWO,glm::vec3(30,0,0));  //translate object from the origin 
    ModelViewMatrix_TWO = glm::rotate(ModelViewMatrix_TWO,spinY, glm::vec3(0,1,0));     //rotate object about y axis 

    glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix_TWO"), 1, GL_FALSE, &ModelViewMatrix[0][0]); //pass matrix to shader 

    myCube.render(); 

    glUseProgram(0); 
    } 

Очевидно, что я реализовал это неправильно ... Как я могу получить куб любую сторону экрана? Благодарю.

UPDATE

я понял, что я не создал второй объект куба, но с этим в настоящее время реализуется, она до сих пор не работает ... Могу ли я запутанным, как матрицы вид/модель взаимодействия? Я создал новый для каждого объекта ....

Новый код:

myCube.render(); 

spinX+=0.03; 
if(spinX>360) spinX = 0; 

glm::mat4 viewMatrix_Two,ModelViewMatrix_Two; 
viewMatrix_Two = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-100));  //viewing matrix 
ModelViewMatrix_Two = glm::translate(viewMatrix_Two,glm::vec3(30,0,0));  //translate object from the origin 
ModelViewMatrix_Two = glm::rotate(ModelViewMatrix_Two,spinX, glm::vec3(0,1,0));     //rotate object about y axis 

glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix_Two"), 1, GL_FALSE, &ModelViewMatrix_Two[0][0]); //pass matrix to shader 

myCube_Two.render(); 

UPDATE

Shader:

uniform mat4 ModelViewMatrix; 
    //uniform mat4 ModelViewMatrix_Two; //NOT NEEDED - USED SAME SHADER OBJECT 
    uniform mat4 ProjectionMatrix; 

    in vec3 in_Position; // Position coming in 
    in vec3 in_Color;  // colour coming in 
    out vec3 ex_Color;  // colour leaving the vertex, this will be sent to the fragment shader 

    void main(void) 
    { 
    gl_Position = ProjectionMatrix * ModelViewMatrix * vec4(in_Position, 1.0); 
    //gl_Position = ProjectionMatrix * ModelViewMatrix_Two * vec4(in_Position, 1.0); 
    ex_Color = in_Color; 
    } 

ответ

1

В конце концов, я создал второй объект Cube, вторую матрицу просмотра и использовал их с уже установленной матрицей модели в моем шейдере, кажется, что оба куба называются/визуализируются индивидуально.

Правильный код:

glm::mat4 viewMatrix_Two, ModelViewMatrix_Two; 
    viewMatrix_Two = glm::translate(glm::mat4(1.0),glm::vec3(0,0,-200)); 
    ModelViewMatrix = glm::translate(viewMatrix_Two,glm::vec3(30,0,0)); 
    ModelViewMatrix = glm::rotate(ModelViewMatrix,spinX, glm::vec3(1,0,0)); 

    glUniformMatrix4fv(glGetUniformLocation(myShader.handle(), "ModelViewMatrix"), 1, GL_FALSE, &ModelViewMatrix[0][0]); //pass matrix to shader 

    myCube_Two.render(); 
0

Если ваш шейдер не имеет форму называется ModelViewMatrix_Two, это не сработает. Я не вижу причины, по которой ваш шейдер нуждается в другой форме для представления модели, так как вы не рисуете оба куба при одном и том же вызове. Если это не проблема, можете ли вы разместить свой шейдерный код?

+0

К сожалению, я скучаю понял ты ... Ты прав, я нету дал ModelViewMatrix_Two в моем шейдер ... Я попробую это. – Reanimation

+0

, скорректировав Uniform, теперь он отображает только ModelViewMatrix, который передается в шейдер ... – Reanimation

+1

Решено. Спасибо за вашу помощь ... Мне нужна только вторая матрица для представления и использовать ее с существующей матрицей модели в моем шейдере ... Теперь отлично работает. Я отправлю правильный код ниже. Благодарю. – Reanimation

Смежные вопросы