OpenGL 3.3 - 2 个三角形的不同旋转

问题描述 投票:0回答:2

我正在关注 opengl-tutorial.org 系列,教程 3 在屏幕上绘制一个三角形。该代码使用顶点着色器,通过向其提供 ModelViewProjection (MVP) 矩阵来进行顶点变换。

我可以让三角形在每次循环时绕其原点旋转。我无法解决的是,当我添加第二个三角形时,如何才能使其中一个三角形旋转,而另一个三角形保持静止。着色器中的整个顶点变换与主循环一起工作让我感到困惑。

这是直接来自教程的部分代码:

static const GLfloat g_vertex_buffer_data[] = { 
    -1.0f, -1.0f, 0.0f,
     1.0f, -1.0f, 0.0f,
     0.0f,  1.0f, 0.0f,
};
static const GLushort g_element_buffer_data[] = { 0, 1, 2 };

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

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

glm::mat4 View       = glm::lookAt(
                            glm::vec3(0,0,3), 
                            glm::vec3(0,0,0), 
                            glm::vec3(0,1,0));

glm::mat4 Model      = glm::mat4(1.0f);

glm::mat4 MVP        = Projection * View * Model; 

do{

    // Clear the screen
    glClear( GL_COLOR_BUFFER_BIT );

    // Use our shader
    glUseProgram(programID);

    // Send our transformation to the currently bound shader, 
    // in the "MVP" uniform
    glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
        0,                 
        3,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
    );

    // Draw the triangle !
    glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle

    glDisableVertexAttribArray(0);

    // Swap buffers
    glfwSwapBuffers(window);
    glfwPollEvents();

}

要旋转,我正在使用这个:

glm::mat4 Model      = glm::mat4(1.0f);

rot=rot+0.01f;
glm::vec3 myRotationAxis( 0, 0, 1);
Model = glm::rotate( Model, rot, myRotationAxis );

glm::mat4 MVP        = Projection * View * Model; 

我通过修改顶部的顶点缓冲区来绘制第二个三角形:

static const GLfloat g_vertex_buffer_data[] = { 
    -1.0f, -1.0f, 0.0f,
     1.0f, -1.0f, 0.0f,
     0.0f,  1.0f, 0.0f,
     1.5f, 0.0f, -5.0f,
     2.5f, 0.0f, -5.0f,
     2.0f, 1.0f, -5.0f
};

然后画我的2个三角形:

glDrawArrays(GL_TRIANGLES, 0, 6); // 3 indices starting at 0 -> 1 triangle

顶点着色器显然正在变换所有 6 个顶点。我该如何制作这个程序,以便只有第二个三角形旋转?

c++ rotation opengl-3
2个回答
1
投票

您将使用相同的参数通过同一顶点着色器发送两个三角形。您可以使用不同的参数分别通过着色器发送它们,也可以通过不同的着色器发送它们,具体取决于您想要执行的操作。最简单的方法可能是这样的:

// Draw the first triangle like you did above
glDrawArrays (GL_TRIANGLES, 0, 3);

// ... set up the matrix for the second triangle here ... 

// Tell the shader about the new matrix
glUniformMatrix (MatrixID, 1, GL_FALSE, &MVP[0][0]);

// And draw starting at the second triangle
glDrawArrays (GL_TRIANGLES, 3, 3);

0
投票

我画了一个三角形,如下:

ofDrawTriangle(ofPoint(0, -fHigh / 2, 0), 
               ofPoint(fWide / 2, fHigh / 2, 0), 
               ofPoint(-fWide / 2, fHigh / 2, 0));

它在以下范围内绘制、平移和旋转:

ofPushMatrix();
ofTranslate(ofVec3f(fPT.x, fPT.y, 0));
ofRotateDeg(fRotate);
ofScale(fScale);

ofDrawTriangle(ofPoint(0, -fHigh/2, 0), 
               ofPoint(fWide/2, fHigh/2, 0),
               ofPoint(-fWide/2, fHigh/2, 0));

ofPopMatrix();

然后我想确定鼠标是否在这个三角形内。 我试过这个:

ofPoint pt = ofPoint(ix, iy, 0);
res = insideTriangleArea(pt, ofPoint(0,-fHigh/2, 0),
                             ofPoint(fWide/2, fHigh/2, 0),
                             ofPoint(-fWide/2, fHigh/2, 0));

[insideTriangleArea函数应用 pt 位于由所提供的 3 个点定义的区域内的公式,并且适用于静态三角形(其中角点已知并且不会动态更改)。]

..... 在 ofPushMatrix/ofPopMatrix 范围内和没有它都有效,除了敏感区域位于左上角而不是以 fPT 点为中心,并且它不会根据 的值旋转fRotate 变量。

我错过了什么?

谢谢, 吉姆·赖特

© www.soinside.com 2019 - 2024. All rights reserved.