C++ 使用OpenGL围绕轴心点旋转

C++ 使用OpenGL围绕轴心点旋转,c++,algorithm,opengl,3d,C++,Algorithm,Opengl,3d,我正在尝试将一个对象绕其一侧旋转,并且已经尝试了论坛上常见的方法: translate(-P); rotate(); translate(P); 在OpenGL(颠倒平移/旋转的顺序)中,我使用了以下代码: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); glTranslatef(-50, 50, 0); glRotatef(rotationCoord, 0, 1, 0); glTran

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

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();
然而,我正在绘制的矩形似乎并没有围绕着作为轴心的一侧旋转。(尝试将左侧设置为轴心点并围绕其旋转)。我制作了一个屏幕截图视频来展示我现在的旋转方式。以下是视频:


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

问题来自

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();
}
#包括
#包括
使用名称空间glm;
作废显示(作废)
{
glClearColor(0,0,0,0);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
GLfloat纵横比=(浮动)g_宽度/g_高度;
mat4 eyeToCamera=透视(45.f,纵横比,g_近平面,g_远平面);//投影
mat4 cameraToWorld=lookAt(vec3(0,0,-150),vec3(),vec3(0,1,0));//视图
vec3枢轴(50,-50,0);
mat4 worldToObject=平移(轴)
*旋转(旋转角度,向量3(0,1,0))
*translate(-pivot);//模型
glLoadMatrixf(值_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);
格伦德();
glutSwapBuffers();
}

请注意,我没有使用任何矩阵堆栈函数,我只设置GL\U MODELVIEW矩阵。

轴的选择是奇数。y轴平移组件没有效果,因为您正在xz平面中旋转。这是你想要的吗?@Marcelocontos:我现在不想绕Y轴旋转。只有X轴。但是矩形的左侧似乎在移动,而枢轴应该是静止的。对吗?
glRotatef(…,0,1,0)
是围绕y轴(又名xz平面)的旋转,而不是x轴的旋转。@marcelocontos:Oops。我必须在上面的评论中提到,目前rotaiton必须只围绕Y轴,而不是X轴。为这一混乱道歉。这就是说,随着绕Y轴旋转以及现在发生的情况,枢轴应该是静止的,我不知道为什么。试着颠倒顺序:T(P)R()T(-P)。这是在抓救命稻草,但最好至少消除这种可能性。我需要先将“translate the back”翻译成
-10
,因为我已经应用了如上所述的投影矩阵(这是我后面的一个操作所需要的)。我尝试减少矩形的
z值
,以更改矩形的绘制距离,并查看这是否会造成旋转问题。但是,即使矩形位于
-0.1
,我仍然没有固定的轴。由于OpenGL的后乘法,旋转后,
-10
平移必须在那里,以使矩形在透视投影内完全可见。我不确定为什么,
-10
平移会导致,或者在透视投影中仍然显示矩形的情况下,我应该如何旋转固定轴。@user1240679放置
glTranslatef(0,0,-10.0)
在旋转之前调用,即在调用上面的
glPushMatrix
之后直接调用。这样,在对象旋转后应用平移。太棒了!谢谢这里需要澄清一个小的离题疑问。我有一个矩形的向量位置(在现实世界中是旋转的-两个Z顶点在Z=0,另外两个在Z=200)。我想从这些顶点获取旋转矩阵,并像我在文章中所做的那样应用它(但不是使用
glRotatef
,而是使用
glMultMatrix
)。顺便说一句,问题就在这里:如果你能阅读下面的评论讨论,就可以给出上下文。谢谢