代码之家  ›  专栏  ›  技术社区  ›  Muddy

像真正的风力涡轮机一样旋转对象

  •  4
  • Muddy  · 技术社区  · 6 年前
    #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;
    }
    

    1 回复  |  直到 5 年前
        1
  •  3
  •   Rabbid76    6 年前

    您需要一个用于风力涡轮机当前角度的变量( current_angle step_angle center_x , center_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();
    }