3
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(); 后我无法让它旋转;循环内。如果我移除它,我的所有球体都会飞向各个方向。

有人可以帮忙吗?

4

6 回答 6

8

如果 OpenGL 对您来说是新手,我强烈建议您阅读NeHe OpenGL 教程。

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 并构建一个显示列表以在渲染循环中调用。

于 2009-03-19T14:37:30.587 回答
3

你没有glBegin/ glEnd(实心球体不需要)另外,在听起来投影矩阵未初始化glLoadIdentity之前尝试。glRotate说到这,你可能也需要一个gluPerspective

于 2009-03-19T14:31:15.953 回答
2

您必须记住,OpenGL 的矩阵堆栈独立于您的帧。堆栈仍然存在,因此必须使用 push/pop 保存它,或者为每一帧完全重建。

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

于 2009-03-19T14:31:35.623 回答
2

你正在创建一个实心球体......你应该如何判断它是否旋转?

于 2009-03-19T14:34:03.857 回答
0

你设置ProjectionMatrix正确吗?(使用glutOrtho等)

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

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
}

但以上对你没有帮助,因为你想动动整个大脑。所以你应该像你一样用平移来渲染你的大脑,但将旋转矩阵应用于所有对象。

希望这可以澄清。

于 2009-03-19T23:44:30.903 回答
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 矩阵堆栈?

于 2009-03-19T14:32:32.830 回答