我想以滚动俯仰偏航方式旋转3d对象。 我将对象的姿势存储在矩阵中,并执行滚动,俯仰和偏转旋转,将姿势矩阵乘以关于x,y或z轴的标准旋转矩阵之一。
然后我使用这些代码行显示它。
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(-5, 5, 2, 0, 0, 0, 0, 1, 0);
glPushMatrix();
ship.Draw();
glPopMatrix();
glutSwapBuffers();
}
void Spacecraft::Draw(){
glMultMatrixf(pose);
model.Draw();
return;
}
它有效,但是对象,而不是围绕它们自己的轴旋转它围绕世界轴旋转...... 我哪里错了?
答案 0 :(得分:0)
旋转始终与局部坐标系的原点有关。因此,您首先必须转换坐标系,以便所需旋转的中心恰好位于本地坐标系原点。在没有看到其余代码的情况下,很难分辨应用的位置和转换。
其余的绘图代码(未显示)也包含模型的内容。绘制功能。很可能你在那里的某个地方有翻译。此平移将对象移离坐标系中心。我认为你所缺少的(不是关于OpenGL而是一般的线性代数)是,矩阵乘法是非交换的,即操作顺序很重要,而对于列主矩阵,操作的顺序是最后一个(或者从右到左,如果用正常表示法写的)。所以旋转必须是你在矩阵上乘以的最后事物,而不是第一个。