c++ - 像真正的风力涡轮机一样旋转物体

标签 c++ opengl glut coordinate-transformation opengl-compat

#include <stdio.h>
#include <math.h>
#include "glut.h"

void init() {
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 400, 0.0, 300.0);
}

void drawTurbine() {
    // draw the tower
    glBegin(GL_LINES);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2f(160, 40);
    glVertex2f(163, 180);
    glVertex2f(160, 40);
    glVertex2f(175, 40); 
    glVertex2f(175, 40);
    glVertex2f(172, 180);
    glEnd();
    // Rotate object
    glPushMatrix();
    glRotatef(100, 0, 1, 0);
    // draw first rotor blade
    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2f(173, 180);
    glVertex2f(163, 180);
    glVertex2f(168, 270);
    glEnd();
    // draw second rotor blade
    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2f(170, 174);
    glVertex2f(175, 180);
    glVertex2f(247, 140);
    glEnd();
    // draw third rotor blade
    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2f(162, 180);
    glVertex2f(167, 174);
    glVertex2f(88, 140);
    glEnd();
    // circle in the middle
    float theta;
    glBegin(GL_POLYGON);
    glColor3f(1.0, 1.0, 1.0);
    for (int i = 0; i <= 360; i++) {
           theta = i * 3.142 / 180;
           glVertex2f(168 + 7 * cos(theta), 180 + 6.5 * sin(theta));
    }
    glEnd();
    glPopMatrix();
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    drawTurbine();
    glFlush();
    glutSwapBuffers();
    glutPostRedisplay();
}

void idle() {
    display();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(700, 600);
    glutInitWindowPosition(10, 10); 
    glutCreateWindow("Wind Turbine");
    init(); 
    glutIdleFunc(idle);
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

我创建了一个风力涡轮机,我正在尝试旋转转子叶片,但代码只是让它消失了。我想让它顺时针旋转。我只需要知道如何让它像真正的风力涡轮机一样旋转。我是 glRotatef 的新手,这将是我第一次使用 OpenGL 旋转对象。

最佳答案

您需要一个变量来表示风力涡轮机的当前角度 (current_angle) 和每帧的旋转角度 (step_angle)。此外,您还必须知道风力涡轮机的中心(center_xcenter_y):

float current_angle = 0.0f;
float step_angle = 0.2f;
float center_x = 168.0f;
float center_y = 180.0f;

要围绕一个枢轴旋转,您必须定义一个模型矩阵,该矩阵由反转的枢轴位移,然后旋转并最终转换回枢轴。旋转轴是 z 轴 (0, 0, 1),因为您的几何图形是在 xy 平面中绘制的:

glTranslatef( center_x, center_y, 0.0f );
glRotatef(current_angle, 0, 0, 1);
current_angle += step_angle;
glTranslatef(-center_x, -center_y, 0.0f );

预览:

函数drawTurbine的完整代码:

void drawTurbine() {
    // draw the tower
    glBegin(GL_LINES);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2f(160, 40);
    glVertex2f(163, 180);
    glVertex2f(160, 40);
    glVertex2f(175, 40); 
    glVertex2f(175, 40);
    glVertex2f(172, 180);
    glEnd();
    // Rotate object
    glPushMatrix();

    glTranslatef( center_x, center_y, 0.0f );
    glRotatef(current_angle, 0, 0, 1);
    current_angle += step_angle;
    glTranslatef(-center_x, -center_y, 0.0f );

    // draw first rotor blade
    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2f(173, 180);
    glVertex2f(163, 180);
    glVertex2f(168, 270);
    glEnd();
    // draw second rotor blade
    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2f(170, 174);
    glVertex2f(175, 180);
    glVertex2f(247, 140);
    glEnd();
    // draw third rotor blade
    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 1.0, 1.0);
    glVertex2f(162, 180);
    glVertex2f(167, 174);
    glVertex2f(88, 140);
    glEnd();
    // circle in the middle
    float theta;
    glBegin(GL_POLYGON);
    glColor3f(1.0, 1.0, 1.0);
    for (int i = 0; i <= 360; i++) {
           theta = i * 3.142 / 180;
           glVertex2f(168 + 7 * cos(theta), 180 + 6.5 * sin(theta));
    }
    glEnd();
    glPopMatrix();
}

关于c++ - 像真正的风力涡轮机一样旋转物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53903978/

相关文章:

插件的 C++ 多态基类层次结构设计

c++ - VS2019 内联函数的一些问题

opengl - 查找 3d 点之间的旋转角度

c++ - 四边形输出纹理不正确

C++:取消引用实际上在做什么?

c++ - 使用 cl 构建代码并连接到 sqlite 库

c++ - SFML - Opengl VAO 问题给我一个 (1282) 错误

opengl - 为什么投影矩阵必须是双倍的?

c++ - 如何在不终止应用程序的情况下关闭 GLUT 窗口?

c++ - 碰撞检测有效但有小故障?