【问题标题】:OpenGL gimbal lockOpenGL云台锁
【发布时间】:2011-04-23 15:38:13
【问题描述】:

我找到了关于如何避免云台锁定的示例程序: http://www.mfwweb.com/OpenGL/Special_Rotations/Source.c 我的问题是,如果我们在向量或列表中放置了多个对象,void Render_Scene(void) 的功能应该如何?我在我的程序中使用了这段代码的片段,但旋转不起作用。我知道矩阵有一些问题。这是我的 paintGL() 函数(我正在使用 qt):

void GLBox::paintGL()
{

glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

double *trans;
double *rot;
double *matrix;
double ang;
double **vertexes;

//camera
glTranslated(xTrans, yTrans, zTrans);
glRotated(xRot, 1, 0, 0);
glRotated(yRot, 0, 1, 0);
glRotated(zRot, 0, 0, 1);


for(unsigned int i = 0; i < vector_objects.size(); i++)
{
    glPushMatrix();

    trans = (*vector_objects[i]).getTranslation();
    rot = (*vector_objects[i]).getRotation();
    matrix = (*vector_objects[i]).getMatrixRotation();
    vertexes = (*vector_objects[i]).getVertexes_coordinates();
    ang = (*vector_objects[i]).getAngle();

    glTranslated(trans[0], trans[1], trans[2]);

    if (ang != 0.0)
    {
        //glLoadIdentity ();
        glRotatef (ang, rot[0], rot[1], rot[2]);
        glMultMatrixd(matrix);
        glGetDoublev(GL_MODELVIEW_MATRIX, matrix);
    }

    glMultMatrixd(matrix);

    //drawing
    for(int j = 0; j < (*vector_objects[i]).getNumber_of_vertexes(); j += 3)
    {
        glBegin(GL_TRIANGLES);
        glVertex3dv( vertexes[j]);
        glVertex3dv( vertexes[j + 1]);
        glVertex3dv( vertexes[j + 2]);
        glEnd();
    }

    glPopMatrix();
}

glFlush();
}

你知道如何解决这个问题吗?谢谢你的帮助

【问题讨论】:

  • ARGH 这正是 OpenGL 遭受的那种滥用。请与我交谈:OpenGL 不是矩阵数学库。这个 glGetDouble(GL_*_MATRIX, ...); ...; glMultMatrix 废话是非常非常糟糕的风格。无论如何,原作者似乎对空间变换一无所知。欧拉角和万向节锁定的问题是,使用欧拉角没有解决这个问题的干净方法。唯一的解决方案是不使用欧拉角,而是使用一种通用的方式来存储旋转:旋转矩阵或更好的四元数。
  • 感谢您提供有关 Quarternions 的线索。我现在正在阅读它们。
  • 一个很好的使用四元数的例子可以找到there
  • 哈,哇,自从 1.0 被开发以来,我就一直在使用 OpenGL,我从来没有想过将它用作数学库。确实是编码恐怖。

标签: opengl


【解决方案1】:

你真的想为此使用四元数。周围有很多样品。我已经非常成功地使用了one from SGI(由 Gavin Bell 编写)。还有一些库(例如,GLM)包含操作/使用它们的例程。几乎任何一本关于计算机图形学基础知识的体面书籍都会至少有一两章专门介绍基于四元数的旋转。

【讨论】:

  • 感谢您的回答。您提供的链接非常有用。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 2010-11-16
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多