使用 OpenGL 围绕枢轴点旋转 [英] Rotation around a pivot point with OpenGL
问题描述
我正在尝试围绕对象的一侧旋转对象,并且已经尝试了论坛上常见的方法:
I am trying to rotate an object about one of its side and already tried the common approach as found on the forums:
translate(-P);
rotate();
translate(P);
在OpenGL
(颠倒平移/旋转的顺序)中,我使用了以下代码:
In OpenGL
(reversing the order of translations/rotations), I used the following code:
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();
但是,我正在绘制的矩形似乎并没有围绕一侧作为枢轴旋转.(尝试将左侧设置为枢轴点并围绕它旋转).我制作了一个屏幕截图视频来展示我现在得到什么样的旋转.这是视频:
However, the rectangle that I am drawing doesn't seem to be rotating around one side as pivot. (trying to set the left side as the pivot point and rotate around it). I made a screen capture vid to show what kind of rotation I am getting right now. Here's the video:
如何设置此对象的枢轴以使其围绕该点旋转?
How do I set the pivot for this object so that it rotated around that point?
推荐答案
问题出自
glTranslatef(0, 0, -10.0);
您在轮换之后调用.这意味着 (0,0,-10) 在对象坐标 (+-50,+-50,0) 被其他任何事物变换之前应用于对象坐标,因此四边形在旋转之前会发生偏移.
you're calling after the rotation. That means the (0,0,-10) is applied to the object coordinates (+-50,+-50,0) before they are transformed by anything else, so the quad is offset before it's being rotated.
这是我用来测试的代码,也许你能从中得到一些东西:
Here's the code I used for testing, maybe you get something out of it:
#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 矩阵.
Note that I don't use any matrix stack functions, and I only set the GL_MODELVIEW matrix.
这篇关于使用 OpenGL 围绕枢轴点旋转的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!