物体不会旋转?

时间:2009-03-19 14:26:07

标签: opengl rotation

void RenderBrain(void)
{ 

glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);

ifstream myFile("brainData.txt");

if (!myFile.is_open()) 
{
    cout << "Unable to open file";
    exit(1); // terminate with error
}


glRotatef(80.0f, 1.0f, 0.0f, 0.0f);

while (! myFile.eof()) 
{
    myFile>>a[0];
    myFile>>a[1];
    myFile>>a[2];
    myFile>>a[3];


    glColor3f(0.60f,0.80f,0.90f);

    glLoadIdentity();       
    glTranslatef((a[0]-1.15)*26, a[2]*30, a[1]*30);
    glutSolidSphere(6, 5, 5);   


}   

myFile.close();
glFlush();
glutSwapBuffers();
}

上面是我的代码的一部分,我有问题在添加glLoadIdentity()后使其旋转;在循环内。如果我将其移除,将导致我的所有球体向各个方向飞去。

有人可以帮忙吗?

6 个答案:

答案 0 :(得分:7)

如果OpenGL对您不熟,我强烈建议使用NeHe OpenGL Tutorials

glLoadIdentity否定了glRotate的影响。相反,使用glPushMatrix/glPopMatrix来实现独立翻译:

glPushMatrix();               
glTranslatef((a[0]-1.15)*26, a[2]*30, a[1]*30);
glutSolidSphere(6, 5, 5);
glPopMatrix();

如果球体不再可见,则需要提供视口和投影矩阵设置代码,以便我们确定问题。另一方面,如果您还没有设置视口和投影,那么请参阅上面的教程并修复它!

此外,每次渲染场景时,您都会将模型视图矩阵旋转80度。这是预期的结果吗?这个函数的频率是多少?我会考虑在变量中保持所需的旋转,然后加载单位矩阵并在每次传递时按该角度旋转。例如:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
angle += angularVelocity * deltaTime;
glRotate(angle, 1, 0, 0);

您是仅仅调用此函数一次并期望glRotate调用不断更新场景(一个非常不正确的假设),或者重复调用此函数来渲染动画场景,这也是不明确的。如果是前一种情况,那么请阅读我上面链接的教程。如果是后一种情况,那么您应该考虑执行一次文件I / O并构建一个要在渲染循环中调用的display list

答案 1 :(得分:3)

您没有glBegin / glEnd(实心球体不需要)另外,请在glLoadIdentity之前尝试glRotate像投影矩阵没有初始化。谈到哪个,你可能还需要一个gluPerspective

答案 2 :(得分:2)

您必须记住,OpenGL的矩阵堆栈与您的帧无关。堆栈仍然存在,因此必须使用push / pop保存,或者为每个帧完全重建。

在你的情况下,尝试将glRotate()调用移到glLoadIdentity()之后,进行新的旋转。当然,您必须更改角度以实现旋转变化。

答案 3 :(得分:2)

你正在创造一个坚固的球体......你应该怎么判断它是否被旋转?

答案 4 :(得分:0)

我的OpenGL生锈了,但我想你想在加载单位矩阵后进行旋转。

glLoadIdentity();    
glRotatef(80.0f, 1.0f, 0.0f, 0.0f);           
glTranslatef((a[0]-1.15)*26, a[2]*30, a[1]*30);
glutSolidSphere(6, 5, 5);

但是最好的解决方案(如果我没记错的话)是在旋转之后推动矩阵,然后在循环的每次迭代中弹出它而不是glLoadIdentity(),但我不太确定。也许其他人更了解OpenGL矩阵堆栈?

答案 5 :(得分:0)

您是否正确设置了ProjectionMatrix? (使用glutOrtho等)

正如其他人已经指出的那样,glLoadIdentity使你的模型 - 视图 - 矩阵识别,然后你正在进行翻译,所以当你渲染球体时,它只会被翻译。至于飞行,你在循环中进行转换,OpenGL是状态机,所以你的所有转换都是一个接一个地应用。即。

for (each point)
{
   modelMatrix *= translate(newPt); // this is adding all transaltes..
}

因此,你的出发点可能会正确显示(可能只是第一次出现),但后续看起来像是飞行......因为他们正在翻译所有以前的点。

您需要做的是独立地为每个pt应用翻译,即

for (each pt)
{
push_matrix
glLoadIdentity
glRotate      // matrix being applied is in reverse order of being called..
glTranslate   // so translate and rotate
glutSphere
pop matrix
}

但是上面对你没有帮助,因为你想要移动全脑。所以你应该像你一样使用翻译渲染你的大脑,但是将旋转矩阵应用于所有对象。

希望这澄清。