2011-04-23 79 views
1

我发现例如如何避免万向节锁定程序: http://www.mfwweb.com/OpenGL/Special_Rotations/Source.c 我的问题是应该如何发挥作用void Render_Scene(void)看起来一样,如果我们有一个以上的物体放置在向量或列表?我在程序中使用了此代码的片段,但旋转不起作用。我知道矩阵有一些问题。这里是我的paintGL()函数(我正在使用qt):OpenGL的万向节锁定

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(); 
} 

你也许知道如何解决这个问题?感谢您的帮助

+3

* ARGH *这正是OpenGL所遭受的误用年龄。请跟我说说:OpenGL不是矩阵数学库。这个glGetDouble(GL _ * _ MATRIX,...); ...; glMultMatrix废话是非常非常糟糕的风格。无论如何,原作者似乎对空间转换毫无头绪。欧拉角和万向节锁的问题是,使用欧拉角不存在干净的解决方案。唯一的解决方案就是不使用欧拉角,而是存储旋转的一种普遍方式:旋转矩阵或更好的Quarternions。 – datenwolf 2011-04-23 15:59:50

+0

感谢您提供有关Quarternions的线索。我现在正在阅读关于他们的信息。 – Marwroc 2011-04-23 16:20:57

+0

使用四元数的一个很好的例子可以在这里找到(http://rainwarrior.thenoos.net/dragon/arcball.html) – Joulukuusi 2011-04-23 16:39:52

回答

1

你真的想为此使用四元数。有相当多的样本。我已经很成功地使用了one from SGI(由Gavin Bell撰写)。还有库(例如,GLM),其中包含操作/使用它们的例程。几乎所有关于计算机图形基础知识的书籍都至少有一两章专门介绍基于四元数的旋转。

+0

谢谢你的回答。你给的链接真的很有用。非常感谢。 – Marwroc 2011-04-23 21:19:12