2012-02-03 6 views
1

擬似コード:描画するアイテムごとにgluLookAt()を呼び出しますか?

drawScene() { 
    for(every 3Dobject) { 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     gluLookAt(eye, targ, up); //is there a better way? 
     3Dobject[n].draw(); //this involves calling translations/rotations 
    } 
    //of course theres 2D GUI stuff to draw next 

が、これはそれを行うには、適切な(または少なくともないterribad)方法は何ですか?

+1

いいえ、それはかなりひどいです。 – genpfault

答えて

3

おそらくglLookAtに電話をかけてはいけません。すべてのオブジェクトが画面の中央に描画されないようにしてください。モデルビュー行列を変更して戻すことができないオブジェクトに問題がありますか? Look-At計算を繰り返す代わりにglPushMatrixglPopMatrixを使用してください。

+0

「すべてのオブジェクトを画面中央に描画したくない」 - 各オブジェクトは3D世界座標を保持します。言い換えれば、カメラは常にtargを見るが、オブジェクトはどこかの左に移動している可能性がある。私はそれが間違っているかどうか、私に知らせてください。興味深いglPush/Pop関数をありがとう、ありがとう。 – jason

+0

@jason:「targ」がループ内の現在のオブジェクトに接続されていないことは明らかでした。また、それ以外の場合はループ外で行うことになるという暗黙の示唆があります。 –

1

いいえ、「カメラの設定」を一度呼び出すと、ワールド空間で独自の変換を適用するだけで、それに応じて変換されたすべてのオブジェクトが描画されます。

EDIT:Ben Voigtが提案したように、すべてのオブジェクトが描画されるまでこの変換を保持するには、適切に押してポップする必要があります。

例:

gluLookAt(...); 

//it is essential to track this state, since there are multiple stacks 
glMatrixMode(GL_MODELVIEW); 

for(object : objects){ 
    glPushMatrix(); 
    glMultMatrix(object.transform); 
    draw(object); 
    glPopMatrix(); 
} 

また、私はこの機能が新しいOpenGLのバージョン/プロファイルで廃止されましたことを、言及したいと思います。

+0

これをOpenGL ES 1.something(android 2.2をターゲットにする)で行います。良い例、それほどのgracias! – jason

関連する問題