在OpenGL中围绕固定点旋转对象

14

我对这段OpenGL代码有问题:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix(); // put current matrix on stack

//glTranslatef(0.0f, 0.0f, 0.0f);   
//glTranslatef(-4*1.5, 0.0, 4*1.5);

glRotatef(rotationAngle, 0.0f, 1.0f, 0.0f); // rotate the robot on its y-axis
glTranslatef(xpos, ypos, zpos);
DrawRobot(xpos, ypos, zpos); // draw the robot
glPopMatrix();

我该怎么做才能让我的机器人围绕其当前所在的点而不是原点旋转?我认为问题出在这段代码中。

4个回答

17

绕z轴旋转物体中心的示例:

glPushMatrix();

glTranslatef(250,250,0.0); // 3. Translate to the object's position.

glRotatef(angle,0.0,0.0,1.0); // 2. Rotate the object.

glTranslatef(-250,-250,0.0); // 1. Translate to the origin.

// Draw the object
glPopMatrix();

2
这个问题很老了,已经得到了充分的回答。新的回答没有添加任何有用的信息。而且同样的几行代码被提交为其他旧问题的答案。 - Reto Koradi
13
此答案新增了一些内容,即在旋转之后,物体需要被平移回到原来的位置。其他答案中未提及此事。 - Dov Grobgeld
这对我有用。如果没有Push和PopMatrix语句,它就无法工作。 - The Coding Wombat

12

先进行平移,再进行旋转。顺序很重要。

glTranslatef(xpos, ypos, zpos);
glRotatef(rotationAngle, 0.0f, 1.0f, 0.0f);

兄弟,它起作用了,谢谢。但问题是机器人旋转的圆圈;我想要减小它的半径。顺便说一下,我只是将机器人旋转90度。等待您的回复,谢谢。 - user2388112
1
@user2388112:我不太确定你的意思,但我认为这应该会有所帮助:您可以通过先将其转换到该点,然后旋转,然后再转换回来(只需取每个坐标的负值)来围绕任何想要的点旋转。如果这不是您要寻找的,请在此处提出新问题,因为这些评论不适合进行扩展讨论。 - hammar

3

在翻译后尝试旋转:

    glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix(); // put current matrix on stack

//glTranslatef(0.0f, 0.0f, 0.0f);   
//glTranslatef(-4*1.5, 0.0, 4*1.5);

glTranslatef(xpos, ypos, zpos);
glRotatef(rotationAngle, 0.0f, 1.0f, 0.0f); // rotate the robot on its y-axis
DrawRobot(xpos, ypos, zpos); // draw the robot
glPopMatrix();

兄弟,它起作用了,谢谢。但问题是机器人旋转的圆圈;我想减小它的半径。顺便说一下,我只旋转机器人90度。等待您的回复,谢谢。 - user2388112

2

使用这个

house();

glTranslatef(x, y, 0.0); // 3. Translate back to original
glRotatef(theta, 0.0, 0.0, 1.0); // 2. Rotate the object around angle
glTranslatef(-m, -n, 0.0); // 1. Move to origin

house();

其中m和n您想要旋转的对象上的点,而x和y您想要围绕其旋转的点


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接