15

3D ワールドの回転などを計算するために複雑な三角法を使用したくないので、gluLookAt は優れた代替手段のように思えます。ドキュメントによると、私がする必要があるのは、カメラの位置に 3 つの座標を配置することだけです。画面の上部があるべき方向の視線と直角でなければならないと私が考えるまで、最後のものは意味がありませんでした.

それはまったくそのようには機能しません。私はいくつかのPythonコードを持っています。これは、ゲームのこの部分に入るときのいくつかのデータといくつかのモード コードを初期化するコードです。

def init(self):
    self.game_over = False
    self.z = -30
    self.x = 0
def transfer(self):
    #Make OpenGL use 3D
    game.engage_3d(45,0.1,100)
    gluLookAt(0,0,-30,0,0,0,0,1,0)

「game.engage_3d(45,0.1,100)」は、基本的に投影行列を 45 度の画角と 0.1 と 100 の近距離座標と遠距離座標を持つように設定します。

最初の gluLookAt は、カメラを適切な位置に配置します。

(0,0,0) の中心で描画された立方体があり、gluLookAt なしで正常に動作します。描画する前に、次のコードがあります。

gluLookAt(self.x,0,self.z,0,0,0,0,1,0)
if game.key(KEY_UP):
    self.z += 2.0/game.get_fps()
if game.key(KEY_DOWN):
    self.z -= 2.0/game.get_fps()
if game.key(KEY_LEFT):
    self.x += 2.0/game.get_fps()
if game.key(KEY_RIGHT):
    self.x -= 2.0/game.get_fps()

これで、上向きの位置は常に同じで、常に直角になるはずです。私が考えていたのは、上下のキーで z 軸を前後に移動し、左右のキーで x 軸を左右に移動することです。実際に起こることは、左右のキーを使用すると、キーによって加速された「目」の周りを立方体が回転することです。上キーを押すと、どこからともなく別のキューブが画面を切り裂き、最初のキューブに当たります。ダウン キーは、謎のクローン キューブを元に戻します。これをローテーションと組み合わせて、ドキュメントに記載されているように、まったく異なる結果を得ることができます。

いったい何が間違っているのですか?

ありがとうございました。

4

1 に答える 1

39

(gluLookAtの「上」ベクトルの背後にある直感は単純です。何かを見てください。今度は頭を90度傾けます。あなたが変わっていない場所では、あなたが見ている方向は変わっていませんが、あなたの画像は網膜には明らかにあります。違いは何ですか?頭のてっぺんが指しているところです。それが上向きのベクトルです。)

しかし、あなたの質問に答えるために:gluLookAt呼び出しは連結されるべきではありません。つまり、どのように機能するかが正確にわからない場合にgluLookAtを使用しても問題がないパターンは次のとおりです。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# do not touch the modelview matrix anymore!

あなたのコードから、あなたはこのようなことをしているようです:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...);
# some stuff..
gluLookAt(...);

gluLookAtは、現在のマトリックスに計算した表示マトリックスを乗算するため、これにより奇妙な結果が生成されます。変換を連結する場合は、glTranslate、glScale、およびglRotatefを機能させる方法を理解することをお勧めします。さらに良いことに、座標変換がどのように機能するかを学び、glMultMatrixに固執する必要があります。

于 2010-07-31T23:40:25.727 に答える