(OpenGL)旋转对象

时间:2017-03-30 11:50:07

标签: opengl rotation mouselistener

当我点击鼠标按钮时,我正在制作一个旋转六角星的程序,其中有两个三角形重叠。

  1. 点击鼠标右键:星旋转
  2. 单击鼠标中键:星号的颜色变化(白色→蓝色)
  3. 我已经应用了代码来旋转矩形,但是当我点击鼠标右键时,它不会旋转并跳转。

    单击鼠标中键时,颜色变化成功,但通过旋转星形进行初始化。我想通过在旋转时单击中间按钮来旋转星形并更改颜色。

    请告诉我这是什么问题。

    /////////////////////////// Header /////////////////////////////
    #include <stdlib.h>
    #include <GL/glut.h>
    
    float v1[3] = { 365.0, 465.0, 0.0 };
    float v2[3] = { 365.0, 420.0, 0.0 };
    float v3[3] = { 400.0, 485.0, 0.0 };
    float v4[3] = { 400.0, 400.0, 0.0 };
    float v5[3] = { 435.0, 465.0, 0.0 };
    float v6[3] = { 435.0, 420.0, 0.0 };
    
    static GLfloat spin = 0.0;
    
    //////////////////////// Functions ////////////////////////////
    void init(void) {
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glShadeModel(GL_FLAT);
    }
    
    void reshape(int w, int h) {
        glViewport(0, 0, (GLsizei)w, (GLsizei)h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0.0, 500.0, 0.0, 500.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
    
    void spinDisplay(void) {
        spin = spin + 2.0;
    
        if (spin > 360.0) {
            spin = spin - 360.0;
        }
    
        glutPostRedisplay();
    }
    
    void triangle_1(void) {         /////////// first triangle ///////////
        glColor3f(1.0, 1.0, 1.0);
    
        glBegin(GL_TRIANGLE_FAN);
        glVertex3fv(v1);
        glVertex3fv(v4);
        glVertex3fv(v5);
    
        glEnd();
    }
    
    void triangle_2(void) {         ///////// second triangle /////////
        glColor3f(1.0, 1.0, 1.0);
    
        glBegin(GL_TRIANGLE_FAN);
        glVertex3fv(v2);
        glVertex3fv(v3);
        glVertex3fv(v6);
    
        glEnd();
    }
    
    void triangle_1p(void) {       ///// first triangle (color changed) /////
        glColor3f(0.0, 0.0, 1.0);
    
        glBegin(GL_TRIANGLE_FAN);
        glVertex3fv(v1);
        glVertex3fv(v4);
        glVertex3fv(v5);
    
        glEnd();
    }
    
    void triangle_2p(void) {       ///// second triangle (color changed) /////
        glColor3f(0.0, 1.0, 0.0);
    
        glBegin(GL_TRIANGLE_FAN);
        glVertex3fv(v2);
        glVertex3fv(v3);
        glVertex3fv(v6);
    
        glEnd();
    }
    
    void display(void) {            ///////// star display /////////
        glClear(GL_COLOR_BUFFER_BIT);
        glPushMatrix();
        glRotatef(spin, 0.0, 0.0, 1.0);
    
        triangle_1();
        triangle_2();
    
        glPopMatrix();
    
        glutSwapBuffers();
    }
    
    void display_p(void) {         ///// star display (color changed) /////
        glClear(GL_COLOR_BUFFER_BIT);
        glPushMatrix();
        glRotatef(spin, 0.0, 0.0, 1.0);
    
        triangle_1p();
        triangle_2p();
    
        glPopMatrix();
    
        glutSwapBuffers();
    }
    
    /////////////////////// Mouse Click ///////////////////////
    void mouse(int button, int state, int x, int y) {
        switch (button) {
        case GLUT_LEFT_BUTTON:
            if (state == GLUT_DOWN)
                glutIdleFunc(NULL);
            break;
        case GLUT_MIDDLE_BUTTON:
            if (state == GLUT_DOWN)
                glutIdleFunc(display_p);
            break;
        case GLUT_RIGHT_BUTTON:
            if (state == GLUT_DOWN)
                glutIdleFunc(spinDisplay);
            break;
        default:
            break;
        }
    }
    
    //////////////////////////// Main /////////////////////////////
    int main(int argc, char **argv) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
        glutInitWindowSize(500, 500);
        glutInitWindowPosition(300, 300);
        glutCreateWindow("6-Point Star");
    
        init();
    
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutMouseFunc(mouse);
        glutMainLoop();
    
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

  

当我点击鼠标右键时,它不会旋转并跳转

它实际上并没有四处跳跃,而是围绕原点旋转(显示屏的左下角)。

如果因为你正在转动然后进行翻译,就会发生这种情况。由于您已将明星在y = 442.50x0的位置硬编码到您的顶点中。如果你使星星的中心位于400x442.5(减去float v1[3] = { -35.0f, 22.5f, 0.0f }; float v2[3] = { -35.0f, -22.5f, 0.0f }; float v3[3] = { 0.0f, 42.5f, 0.0f }; float v4[3] = { 0.0f, -42.5f, 0.0f }; float v5[3] = { 35.0f, 22.5f, 0.0f }; float v6[3] = { 35.0f, -22.5f, 0.0f }; ),那么你会看到星星在显示屏的左下角自转。

display()

现在在glTranslatef(x, y, 0.0f); glRotatef(spin, 0.0, 0.0, 1.0); 你然后在旋转之前翻译:

float x = 400.0f, y = 442.5f;

考虑在其他地方定义float color1[3] = { 1.0f, 1.0f, 1.0f }; float color2[3] = { 1.0f, 1.0f, 1.0f }; int mode = 1;

现在你会看到明星回到同一个地方,但绕着自己旋转。

  

我希望在旋转时通过单击中间按钮旋转星形并改变颜色。

您可以将颜色保留为变量,而不是为每种模式复制所有代码。

mouse()

现在GLUT_MIDDLE_BUTTON case GLUT_MIDDLE_BUTTON: if (state == GLUT_DOWN) { if (mode == 1) { color1[0] = 0.0f, color1[1] = 0.0f, color1[2] = 1.0f; color2[0] = 0.0f, color2[1] = 1.0f, color2[2] = 0.0f; mode = 2; } else if (mode == 2) { color1[0] = 1.0f, color1[1] = 1.0f, color1[2] = 1.0f; color2[0] = 1.0f, color2[1] = 1.0f, color2[2] = 1.0f; mode = 1; } } ,然后你切换颜色。

triangle_1

然后在triangle_2glColor3f()中,请记得将glColor3fv(color1)替换为glColor3fv(color2)mode

而不是所有这些,你也可以在mouse中设置triangle_1并在triangle_2中执行类似的操作(也在if (mode == 2) glColor3f(0.0, 0.0, 1.0); else glColor3f(1.0, 1.0, 1.0); 中执行此操作):

display_p

选择当然取决于你。

总而言之,现在您应该可以看到星星绕自身旋转,并在点击鼠标中键时切换颜色。

现在这也意味着您可以删除triangle_1ptriangle_2pvoid f(const double e) {} void f(const Eigen::Ref<const MatrixX<double>>& g) {} int main { Eigen::Matrix<double, 2, 1> m1; Eigen::Matrix<double, 2, 1> m2; m1 << 1.0, 2.0; m2 << 1.0, 2.0; f(m1.transpose() * m2); // error: call to 'f' is ambiguous }