【问题标题】:How to rotate a computer drawing in 90 degrees如何将计算机绘图旋转 90 度
【发布时间】:2014-11-15 13:48:43
【问题描述】:

我在空白窗口中创建了兔子和鸭子图像。我的计划是显示两次:一次单独显示,另一张像它一样旋转 90 度。我已经尝试第二次创建图像并通过更改值来转动图像,但是很困难并​​且根本无法工作。需要使用哪些轴在平面中旋转图像以及完成它的正确方法。

void myInit(void){
        glClearColor(1.0, 1.0, 1.0, 0);  // the background is white
        glColor3f(0.0f, 0.0f, 0.0f);  // set drawing color
        gluOrtho2D(0.0, (GLdouble) screenWidth, 0.0, (GLdouble) screenHeight);
    }

void drawBunny(){
    glClear(GL_COLOR_BUFFER_BIT);
    // draw the outline of box (bunny)
    glLineWidth(2);
    glBegin(GL_LINE_LOOP);
        glVertex2i(50,50);
        glVertex2i(150,50);
        glVertex2i(150,100);
        glVertex2i(50,100);

    glEnd();

    //draw bunny tail
    glLineWidth(1);
    glBegin(GL_LINE_STRIP);
     glVertex2i(50,50);
     glVertex2i(50,35);//2nd wider top/bottom
     glVertex2i(70,35);//1st- shrink tail left/right
    glVertex2i(70,50);//1st- shrink tail left/right
    glEnd();

    // draw first ear
    glBegin(GL_LINE_LOOP);
        glVertex2i(175,85);
        glVertex2i(175,100);
        glVertex2i(150,100);
        glVertex2i(150,85);
    glEnd();

    //draw second ear
    glBegin(GL_LINE_LOOP);
        glVertex2i(175,70);
        glVertex2i(175,100);
        glVertex2i(150,100);
        glVertex2i(150,70);
    glEnd();

    // draw the head
    glBegin(GL_LINE_LOOP);
        glVertex2i(150,100);
        glVertex2i(150,110);
        glVertex2i(125,110);
        glVertex2i(125,100);
    glEnd();

    // draw first feet
    glBegin(GL_LINE_LOOP);
        glVertex2i(110,60);
        glVertex2i(110,75);
        glVertex2i(30,75); //decrease value increase feet
        glVertex2i(30,60);
    glEnd();

    //draw second feet
    glBegin(GL_LINE_LOOP);
        glVertex2i(50,100);
        glVertex2i(50,85);
        glVertex2i(30,85); //decrease value increase feet
        glVertex2i(30,100);
    glEnd();

     //* draw eyes
    glBegin(GL_LINE_LOOP);
        glVertex2i(140,100);
        glVertex2i(140,105);
        glVertex2i(135,105);
        glVertex2i(135,100);
    glEnd();
    glFlush();
}

int main (int argc, char** argv){
    glutInit(&argc, argv);  // initialize the toolkit
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  // set display mode
    glutInitWindowPosition(100,150);  // set window position
    glutInitWindowSize(screenWidth,screenHeight); // set window size
    glutCreateWindow("House");  // create & open window
    glutDisplayFunc(drawBunny);  // register redraw function
    myInit();
    glutMainLoop();  // loop forever
}

【问题讨论】:

    标签: c++ c opengl


    【解决方案1】:

    编写一个由 2 个兔子组成的显示函数并旋转它们:

    void display()
    {
        glLoadIdentity();
        glClear(GL_COLOR_BUFFER_BIT);
    
        drawBunny();
    
        glPushMatrix();
        glRotatef(degreetoreturn,x,y,z); // Adjust parameters according to what you need
        drawBunny();
        glPopMatrix();
    
        glutSwapBuffers();
    
    }
    

    从您的 drawBunny 函数中删除 glClear() 函数和 glFlush() 函数。最后在你的 main 函数中改变这一行:

    glutDisplayFunc(drawBunny);  // register redraw function
    

    glutDisplayFunc(display);  // register redraw function
    

    【讨论】:

    • +1 - 但是有一个小问题:glutSwapBuffers (...) 在这种情况下不正确。像素格式是单缓冲的。虽然我不建议一开始就使用单缓冲像素格式 (GLUT_SINGLE),但这就是我们所拥有的:-\
    • @AndonM.Coleman 感谢您的警告,我阅读了您是对的文档。据说在单缓冲情况下,此功能无效。
    • 昨晚玩了一晚上才发现问题。转换顺序是问题所在。 glTranslatef(100, 100, 0); glRotatef(180.0f,0.0f,0.0f,1.0f); glScalef(-1.0f,1.0f,1.0f); @Cagkan Toptas
    猜你喜欢
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多