c++ - 使用 OpenGL 围绕枢轴点旋转

标签 c++ algorithm opengl 3d

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

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

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

最佳答案

问题出在

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 矩阵。

关于c++ - 使用 OpenGL 围绕枢轴点旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17630313/

相关文章:

C++ 和表格格式打印

c++ - 在 Rcpp 中调试运行时错误

c++ - 来自基类的函数被隐藏在子类中。我该如何解决?

c# - "stack around the variable is corrupted"在 c++ 到 c# 回调期间

algorithm - 为什么时间复杂度是O(log n)?

java - OpenGL 阻止颜色影响其他几何体

algorithm - 汇编中的 Fletcher 算法

c++ - C++ 中的多态递归调用?

windows - 我的 openGL 着色器不会链接到 eclipse 之外?

c++ - OpenGL 过剩 "glutCreateWindow"已弃用?