Нарисуйте 2 куба в OpenGL, используя GLM

0

Поэтому я могу нарисовать вращающийся куб, используя OpenGL3. 2+ и перевести его из 0,0,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();
    glUseProgram(0);
    }

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

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

    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);
    }

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

ОБНОВИТЬ

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

Новый код:

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();

ОБНОВИТЬ

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;
    }
Теги:
opengl
glm-math

2 ответа

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 в моем шейдере ... Я попробую это.
  • 0
    исправив Uniform, он теперь рендерит только ModelViewMatrix, который сначала передается шейдеру ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню