我们如何在openGL中相对于一个点(原点除外)旋转2d中的数字?

Ama*_*ony 4 c++ opengl

使用该glrotatef()功能可将图形相对于原点旋转指定的角度.如何在不使用转换矩阵的情况下相对于另一个点旋转相同的图形?谢谢!

void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    gluOrtho2D(0,499,0,499);
    glMatrixMode(GL_PROJECTION);
    glColor3f(1,0,0);
    drawhouse();
    glFlush();
    glColor3f(0,0,1);
    glTranslatef(0.5 ,0.5,0.5);
    glRotatef(45,1,1,1);
    glTranslatef(-0.5 ,-0.5,-0.5);
    drawhouse();
    glFlush();
}
Run Code Online (Sandbox Code Playgroud)

这是发生了什么的屏幕截图.http://postimage.org/image/q81bhupw/

Joh*_*eek 7

基本上:

如果要旋转P,翻译-P(以便P移动到原点),然后执行旋转,然后平移P(使原点移回P).

glTranslatef(P.x, P.y, P.z);
glRotatef(angle, A.x, A.y, A.z);
glTranslatef(-P.x, -P.y, -P.z);
Run Code Online (Sandbox Code Playgroud)

(注意:这是"反向顺序",因为添加的最后一个转换是在OpenGL规则下应用的第一个转换.)

因此,在您的设置代码中,您需要以下调用:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 499, 0, 499);
glMatrixMode(GL_MODELVIEW);
Run Code Online (Sandbox Code Playgroud)

然后你的display()方法应该是这样的:

void display() {
    glClear(GL_COLOR_BUFFER_BIT);

    glLoadIdentity();
    glTranslatef(0.5f, 0.5f, 0.5f);
    glRotatef(45.f, 1.f, 1.f, 1.f);
    glTranslatef(-0.5f, -0.5f, -0.5f);
    glColor3f(0.f, 0.f, 1.f);
    drawhouse();
    glFlush();
}
Run Code Online (Sandbox Code Playgroud)

  • 你正在调用`glMatrixMode(GL_PROJECTION)`然后再也不会调用`glMatrixMode(GL_MODELVIEW)`,所以你不会改变你认为你正在改变的东西.此外,您不应在每次显示调用时绘制两次场景(或者甚至在每次显示调用时更改投影矩阵).我不认为你的问题与轮换有任何关系. (2认同)