2010-07-31 31 views
14

Benim 3D dünyam için böyle rotasyonları ve şeyleri hesaplamak için karmaşık bir trigonometri almak istemiyorum, bu yüzden gluLookAt hoş bir alternatif gibi görünüyor. Belgelere göre, tek yapmam gereken, kamera pozisyonu için 3 koordinat, üç bakıma bakmam gerekeni ve bir "yukarı" pozisyonu. Sonuncusu, ekranın üst kısmındaki yön çizgisi ile doğru açılarda olmak zorunda olduğunu düşünene kadar hiçbir anlam ifade etmedi.gluLookAt'ı nasıl düzgün kullanırım?

Hiç böyle çalışmıyor. Bazı python kodlarım var.

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)" temelde olması projeksiyon matrisi kurar: Bu, bazı veri ve oyunun bu kısmının girdiğinizde bazı mod kodunu başlatır koddur 45 derece görüş açısı ve yakın ve uzak koordinatlar 0.1 ve 100.

İlk gluLookAt kamerayı doğru konuma yerleştirir.

(0,0,0) ile çizilen bir küp var ve gluLookAt olmadan gayet iyi çalışıyor. o dik açılarla hep olduğu gibi

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

Şimdi böyle olduğunu, yukarı pozisyon daima aynı olmalıdır: Ben çizmek önce bu kodu var. Yapacağımı düşündüğüm şey, z ekseni yukarı ve aşağı tuşlarıyla ileri ve geri hareket ettirmek ve sol ve sağ tuşlarla x ekseni boyunca sağa ve sola doğru hareket etmektir. Aslında ne olur, sol ve sağ tuşlarını kullandığım zaman, küp, anahtarlar tarafından hızlanan "göz" etrafında dönecektir. Yukarı tuşu, ekranın içinden dilimlemek ve ilk küpü çarpmak için başka bir küpten kaynaklanır. Bu anahtar, gizemli klonlanmış küpü geri getiriyor. Bu belgelerin ortaya çıkacağı gibi tamamen farklı bir sonuç vermek için döndürme ile birleştirilebilir.

Dünyada neyin yanlış olduğu?

Teşekkür ederiz.

cevap

37

(gluLookAt'ta "yukarı" vektörün arkasındaki sezgiler basittir: Her şeye bakın. Şimdi kafanızı 90 derece eğin. Değişmediğiniz yerde, baktığınız yön değişmedi, ancak retinadaki görüntünün açıkça görebiliyor. Fark nedir? Kafanızın tepesinin nereye baktığı. Bu yukarı vektör.)

Ancak, sorunuzu yanıtlamak için: gluLookAt çağrıları birleştirilmemelidir. Aşağıdaki Başka bir deyişle, sadece motifi hangi bunu tam olarak nasıl çalıştığını bilmiyorsanız gluLookAt kullanmak Tamam geçerli:

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

O böyle bir şey yapıyoruz kodunuzdan görünüyor:

gluLookAt o hesaplar görüntüleme matrisine geçerli matrisi çarpar çünkü
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(...); 
# some stuff.. 
gluLookAt(...); 

Bu, garip sonuçlar üretecektir. Dönüşümleri birleştirmek istiyorsanız, glTranslate, glScale ve glRotatef'in sizin için nasıl çalışacağını anlamaktan çok daha iyisiniz. Daha da iyisi, koordinat dönüşümlerinin nasıl çalıştığını ve glMultMatrix'e nasıl yapıştığını öğrenmelisiniz.

+0

Çok teşekkür ederim. Şimdi mükemmel çalışıyor. Şimdi daha gelişmiş şeylere geçebilirim. Ancak gluLookAt'ın yavaş olduğunu mu söylüyorsunuz? –

+2

Bu yavaş değil. Bu gluLookAt ciddi OpenGL programlama yaparken hakkında bilmeniz gereken birkaç şeyi gizler. Özellikle, farklı koordinat dönüşümlerini birleştirmeyi öğrenmelisiniz.Bu alışmaya başlıyor ve ilk başta biraz sinir bozucu oluyor, ama sonunda ödüyor: Birçok grafik tekniği, koordinat sistemlerinin akıllıca dönüştürülmesine dayanıyor. Eğer gerçekten kafanı eğmişsen –

+36

+1 –

İlgili konular