如何仅旋转特定对象而不影响opengl中的其他对象?

时间:2019-11-28 05:19:15

标签: c++ opengl opengl-compat glrotate

我正在OpenGL中制作风扇,我在其中装有杆子和旋转的东西,当我尝试旋转它们时,所有风扇都随杆子一起旋转,我应该如何固定它,我使用了{ {1}},而且当我旋转使用推入式和pup矩阵时,它根本不旋转,它仅以我所写的角度旋转一次,任何建议都可以帮助您?

2 个答案:

答案 0 :(得分:1)

在老派的opengl中,您将封装了一对glPushMatrix(存储矩阵堆栈的状态)和glPopMatrix(恢复先前的转换)调用之间的转换更改。

glPushMatrix();
  glRotatef(45.0f, 0, 1, 0); //< or whatever your rotation is. 
  drawObjectToBeRotated();
glPopMatrix();

// now any objects drawn here will not be affected by the rotation. 

在现代OpenGL中,您要为绘制的每个网格分别上传一个单独的ModelViewProjection矩阵作为顶点着色器均匀性(有几种方法可以执行此操作,或者在Uniform变量Uniform-Buffer-对象,着色器存储缓冲区或某些实例缓冲区输入)。

答案 1 :(得分:1)

  

我使用push和pup矩阵旋转,它根本不旋转,只旋转一次

如果您使用glPushMatrix / glPopMatrix,则当前矩阵由glPushMatrix存储在矩阵堆栈中,并在调用glPopMatrix时恢复。介于两者之间的所有矩阵变换都将丢失。

要实现连续旋转,必须使用增大的旋转角度。创建一个全局变量angle并增加它。例如:

float angle = 0.0f;

void draw()
{
    // ...

    glPushMatrix();

    // apply rotation and increase angle
    glRotatef(angle, 1.0f, 0.0f, 0.0f);
    angle += 1.0f;

    // draw the object
    // ...

    glPopMatrix();

    // ...
}