为什么从中心原点开始旋转

时间:2016-03-22 22:23:16

标签: c++ opengl

我面临一个旋转问题,一个用opengl绘图原语绘制的三角形。我正在使用过剩键功能通过按ER键逆时针和顺时针旋转三角形。然后还使用过剩特殊键功能通过按up down left right键来翻译三角形x轴和y轴

Rotation and Translation

但是在将这个三角形转换到另一个位置而不是按下旋转键之后,它不会从它停留的最后位置旋转。它是从中心原点旋转的,如何解决这个问题。

Doesn't rotate where last time stay

我不知道我做错了什么。

代码:

#include<iostream>
#include <cstdlib>
#include<GL\freeglut.h>

using namespace std;

float posX = 0.0f;
float posY = 0.0f;

float movethis = 0.1f;
float angle = 0.0f;


void init(void) {

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, -1.0);

}


void drawFigure() {
    glPointSize(4);
    glColor3f(1.0f, 1.0f, 0.0f);

    glBegin(GL_LINES);

    //Total 4 liens 9 vertex
    glVertex2f(0.1f, 0.0f);
    glVertex2f(-0.1f, 0.0f);
    glVertex2f(0.0f, 0.1f);
    glVertex2f(-0.1f, 0.0f);
    glVertex2f(0.0f, 0.1f);
    glVertex2f(0.1f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex2f(0.0f, 0.1f);
    glVertex2f(0.0f, 0.0f);

    glEnd();

    glBegin(GL_POINTS);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex2f(0.0f, 0.1f);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex2f(0.0f, 0.0f);


    glEnd();

}

void SpecialKeys(int key, int xpos, int ypos) {

    if (key == GLUT_KEY_UP) {
            posY = posY + movethis;

        }

    else if (key == GLUT_KEY_DOWN) {
            posY = posY - movethis;
    }

    else if (key == GLUT_KEY_RIGHT) {
            posX = posX + movethis;
    }

    else if (key == GLUT_KEY_LEFT) {
            posX = posX - movethis;
    }


    glutPostRedisplay();
}


void KeysFun(unsigned char key, int xpos, int ypos) {
    if (key == 'e' || key == 'E') {
        angle=angle+10;
    }



    else if (key == 'r' || key == 'R') {
        angle=angle-10;
    }

    glutPostRedisplay();

}


void display() {

    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


    glRotatef(angle, 0.0f, 0.0f, 1.0f);
    glTranslatef(posX, posY, 0.0f);

    drawFigure();
    glFlush();

}



int main(int argc, char**argv) {
    glutInit(&argc, argv);
    glutInitWindowSize(600, 600);
    glutInitWindowPosition(450, 50);
    glutCreateWindow("Frame");
    init();
    glutDisplayFunc(display);
    glutSpecialFunc(&SpecialKeys);
    glutKeyboardFunc(&KeysFun);
    glutMainLoop();

    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

您必须“向后”阅读矩阵乘法链中的运算顺序。您首先必须旋转,然后翻译,但如果您将其写为

rotate
translate
vertices

数据正在“向上”移动,因此顶点首先“看到”翻译,然后是旋转。解决方案:翻转旋转和平移的顺序。