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

また、この関数を 1 回だけ呼び出して glRotate 呼び出しでシーンが継続的に更新されることを期待しているのか (非常に誤った仮定)、またはアニメーション シーンをレンダリングするためにこの関数を繰り返し呼び出しているのかはあいまいです。前者の場合は、上記のリンク先のチュートリアルをお読みください。後者の場合は、ファイル I/O を 1 回実行し、レンダリング ループで呼び出されるディスプレイ リストを構築することを検討する必要があります。

于 2009-03-19T14:37:30.587 に答える
3

glBegin/がありませんglEnd(固体球では必要ありません) また、射影行列が初期化されていないように聞こえるので、glLoadIdentityの前に試してください。glRotateそういえば、おそらく も必要ですgluPerspective

于 2009-03-19T14:31:15.953 に答える
2

OpenGL のマトリックス スタックはフレームから独立していることを覚えておく必要があります。スタックは残るため、プッシュ/ポップを使用して保存するか、フレームごとに完全に再構築する必要があります。

あなたの場合、glRotate() 呼び出しを glLoadIdentity() の後に移動して、新しいローテーションを実行してみてください。もちろん、回転を変更するには角度を変更する必要があります。

于 2009-03-19T14:31:35.623 に答える
2

ソリッドな球体を作成しています...回転しているかどうかをどのように判断すればよいでしょうか?

于 2009-03-19T14:34:03.857 に答える
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 に答える
0

ProjectionMatrix正しく設定していますか?(使用glutOrtho等)

他の人がすでに指摘しているようにglLoadIdentity、モデルビューマトリックスを識別し、その後翻訳を行っているため、球体をレンダリングすると、翻訳されるだけになります。飛行に関しては、ループで変換を行っており、OpenGL がステート マシンであるため、すべての変換が次々に適用されます。すなわち

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

したがって、開始点は正しく表示される可能性があります (おそらく最初のみ) が、その後は飛んでいるように見えます..以前のすべての点の変換を取得しているためです。

あなたがする必要があるのは、各ポイントに独立して翻訳を適用することです。

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 に答える