【问题标题】:Opengl, render an object poseOpengl,渲染物体姿势
【发布时间】:2014-08-24 09:52:53
【问题描述】:

我想以滚动俯仰偏航方式旋转一个 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;
}

它可以工作,但是对象,而不是围绕自己的轴旋转,而是围绕世界轴旋转...... 我哪里错了?

【问题讨论】:

    标签: opengl matrix rotation


    【解决方案1】:

    旋转始终围绕局部坐标系的原点。因此,您首先必须平移坐标系,以便所需旋转的中心恰好位于局部坐标系原点。如果不查看代码的其余部分,就很难判断要在哪里应用哪些转换。

    其余未显示的绘图代码也包括模型的内容。绘图功能。很可能你在那里的某个地方有翻译。这种平移将对象从坐标系中心移开。我认为您所缺少的(不是关于 OpenGL,而是一般的线性代数)是,矩阵乘法是不可交换的,即运算顺序很重要,对于列主矩阵,运算顺序是最后到第一个(或正确到如果以正常符号书写,则留下)。所以旋转必须是你在矩阵上乘以 最后一个的东西,而不是第一个。

    【讨论】:

    • 谢谢,我知道,重点是对象会旋转,但要围绕自己的轴旋转,它会围绕世界轴旋转!但是当我检查例如当我围绕z轴旋转它时,它的姿势矩阵的第三列向量没有改变,但是当我显示它时,对象并没有围绕它旋转......我想我错过了一些关于openGL的东西。 ..
    • @giuseppe:那么您的模型网格未正确居中于原点。对于使用 Blender 创建的示例模型,这很容易发生。每个网格对象都有一个对象中心,网格相对于该对象中心进行布局。现在,如果网格远离对象中心,如果您不了解这种特性,您可能会移动整个对象以将其明显地带回正确的位置。解决方案:在导出的模型中正确居中网格。除此之外,还建议在绘制网格之前导出模型局部变换矩阵并相乘。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2014-05-21
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多