使用 OpenGL 围绕枢轴点旋转

Posted

技术标签:

【中文标题】使用 OpenGL 围绕枢轴点旋转【英文标题】:Rotation around a pivot point with OpenGL 【发布时间】:2013-07-13 12:45:18 【问题描述】:

我正在尝试围绕其一侧旋转对象,并且已经尝试了论坛上的常用方法:

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

如何设置该对象的轴心,使其围绕该点旋转?

【问题讨论】:

枢轴的选择很奇怪。 y 轴平移组件没有影响,因为您在 xz 平面中旋转。这是你想要的吗? @MarceloCantos :我暂时不打算绕 Y 轴旋转。只是X轴。但是矩形的左侧似乎在移动,而枢轴应该是静止的。对吗? glRotatef(…, 0, 1, 0) 是围绕 y 轴(又名 xz 平面)而不是 x 轴的旋转。 @MarceloCantos:哎呀。我不得不在上面的评论中提到,rotaiton 现在只能围绕 Y 轴,而不是 X 轴。为混乱道歉。也就是说,随着围绕 Y 轴的旋转以及现在发生的旋转,枢轴应该是静止的,我不知道为什么。 尝试颠倒顺序:T(P) R() T(-P)。这是抓住了最后一根稻草,但至少消除这种可能性是件好事。 【参考方案1】:

问题出在

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 value 以更改矩形的绘制距离,并查看这是否会造成旋转问题。但即使矩形位于-0.1,我仍然没有得到固定的枢轴。由于 OpenGL 的后乘法,-10 的平移必须在旋转后存在,以使矩形在透视投影中完全可见。 我不知道为什么 -10 的翻译会导致,或者我应该如何在我的透视投影中仍然显示一个矩形的固定枢轴。 @user1240679 将glTranslatef(0, 0, -10.0) 调用放在旋转之前,即直接在上面调用glPushMatrix 之后。这样,在对象旋转后会应用平移。 太棒了!谢谢。一个小题外疑问在这里被清除。我有一个矩形的向量位置(在现实世界中旋转 - Z=0 的两个 Z 顶点,Z=200 的另外两个)。我想从这些顶点获取旋转矩阵并像我在上面的帖子中所做的那样应用它(但将使用glMultMatrix 而不是glRotatef)。顺便说一句,问题在这里:***.com/questions/17585424/… 如果您可以阅读下面的 cmets 讨论,那将给出上下文。谢谢

以上是关于使用 OpenGL 围绕枢轴点旋转的主要内容,如果未能解决你的问题,请参考以下文章

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

OpenGL绕点旋转

现代Opengl:旋转一个长方体,在长方体的一端有枢轴

围绕枢轴点旋转刚体

OpenGL 在进行自旋转时围绕对象旋转

围绕世界轴OpenGL旋转对象