使用OpenGL围绕一个中心点旋转

3
我正在尝试绕物体的一侧旋转,并已经尝试了论坛上常见的方法:
translate(-P);
rotate();
translate(P);

在OpenGL中(翻转变换/旋转顺序),我使用了以下代码:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
    glTranslatef(-50, 50, 0);
        glRotatef(rotationCoord, 0, 1, 0);
    glTranslatef(50, -50, 0);
    glBegin(GL_QUADS); 
        glVertex3f(-50.0, 50.0, 0);
        glVertex3f(50.0, 50.0, 0);
        glVertex3f(50.0, -50.0, 0);
        glVertex3f(-50.0, -50.0, 0);
    glEnd();
glPopMatrix();

然而,我正在绘制的矩形似乎没有以一个边作为枢轴进行旋转(试图将左侧设置为枢轴点并围绕其旋转)。我制作了一个屏幕捕捉视频以展示目前的旋转效果。以下是视频链接:http://youtu.be/VgEZ_rsG3xU
如何设置此对象的枢轴,以使其围绕该点旋转?

选择枢轴很奇怪。由于您正在xz平面上旋转,因此y轴平移分量没有影响。这是您想要的吗? - Marcelo Cantos
@MarceloCantos:我现在并不打算绕Y轴旋转,只是绕X轴。但矩形的左侧似乎在移动,而枢轴应该是静止的。对吗? - user1240679
@MarceloCantos:糟糕,我必须在上面的评论中提到旋转现在只能围绕Y轴进行,而不能围绕X轴进行。对于造成的混淆,我深表歉意。话虽如此,现在围绕Y轴旋转时,枢轴点应该是静止的,但我不确定为什么会这样。 - user1240679
正如Marcelo所说:尝试使用Rotatef(...0,0,1)。你只有x,y坐标,所以需要围绕z轴旋转。 - starmole
@AndreasHaferburg: 代码除了我上面提到的内容以外,什么都没有。但是这里是draw方法的 pastebin 链接:http://pastebin.com/2QZqDYsH 除此之外,我没有进行任何其他操作。 - user1240679
显示剩余4条评论
1个回答

3
问题出在

标签中。

glTranslatef(0, 0, -10.0);

你是在旋转之后进行调用。这意味着在任何其他变换之前,(0,0,-10) 就会应用到对象坐标 (+-50,+-50,0) 上,因此在旋转之前四边形就被偏移了。

这是我用于测试的代码,也许你可以从中得到一些启发:

#include <glm/glm.hpp>
#include <glm/ext.hpp>
using namespace glm;

void display(void)
{
  glClearColor(0,0,0,0);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  GLfloat aspect = (float)g_Width / g_Height;
  mat4 eyeToCamera = perspective(45.f, aspect, g_nearPlane, g_farPlane); // projection
  mat4 cameraToWorld = lookAt(vec3(0, 0, -150), vec3(), vec3(0, 1, 0)); // view

  vec3 pivot(50, -50, 0);
  mat4 worldToObject = translate(pivot)
    * rotate(rotationAngle, vec3(0, 1, 0))
    * translate(-pivot); // model
  glLoadMatrixf(value_ptr(eyeToCamera * cameraToWorld * worldToObject));
  glBegin(GL_QUADS);
    glVertex3f(-50.0, 50.0, 0);
    glVertex3f(50.0, 50.0, 0);
    glVertex3f(50.0, -50.0, 0);
    glVertex3f(-50.0, -50.0, 0);
  glEnd();

  glutSwapBuffers();
}

请注意,我不使用任何矩阵堆栈函数,只设置GL_MODELVIEW矩阵。

我需要先将后面的平移减去-10,因为我已经应用了上述的投影矩阵(这是我后续操作中所需的)。我尝试通过减小矩形的z值来改变矩形的绘制距离,并查看是否会对旋转造成问题。但即使矩形位于-0.1,我仍然无法得到一个固定的轴心点。由于OpenGL的后乘法,这个平移减去-10必须在旋转之后进行,以便让矩形完全可见于透视投影中。 - user1240679
我不确定为什么使用“-10”进行翻译会导致问题,或者我应该如何解决固定枢轴的问题,同时在我的透视投影中仍然显示一个矩形。 - user1240679
1
@user1240679 在旋转之前加入 glTranslatef(0, 0, -10.0) 呼叫,即在上面调用 glPushMatrix 后直接加入。这样,翻译将在对象旋转后应用。 - Andreas Haferburg
太棒了!谢谢。这里有一个与主题无关的疑问需要澄清。我有一个矩形的向量位置(在现实世界中旋转 - 两个Z顶点在Z = 0,另外两个在Z = 200)。我想从这些顶点中获取旋转矩阵,并像我在帖子中所做的那样应用它(但是不是使用glRotatef而是使用glMultMatrix)。问题在这里:http://stackoverflow.com/questions/17585424/creating-different-matrices-for-separate-asymmetric-frustums?noredirect=1#comment25670543_17585424 如果您可以阅读下面的评论讨论,那将会给出上下文。谢谢 - user1240679

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