30 Nisan 2009 Perşembe

OpenGL'de Push ve Pop Matrix


OpenGL kullanılarak geliştirilen bir örnek incelediğinizde glPushMatrix() ve glPopMatrix() komutlarıyla karşılaşmışsınızdır. Daha sonra bunun çok da önemli olmadığını düşünmüş olabilirsiniz, ancak bu komutları kullanmanız işinizi kolaylaştırabilir. Şimdi size kısa bir biçimde bu komutları ne işe yaradığını anlatacağım.

OpenGL ile ilgili kod yazmaya başladığımızda genellikle glLoadIdentity() fonksiyonunu çağırarak birim matrisimizi -diagonal elemanları 1, diğer elemanları 0 olan, 4x4lük matris- yükleriz. Daha sonra çizilecek poligonların, bulundukları yere çizmek için glTranslate, glRotatef gibi fonksiyonları kullanarak istediğimiz yere çizilmesini sağlarız. Örnek olarak bir arabanın gövde ve 4 tekerden oluştuğunu varsayalım. Bu arabayı çizmek için push ve pop matrix fonksiyonlarını kullanmazsak, aşağıdaki şekilde yazmamız gerekir.

glLoadIdentity();
glTranslatef( [Aracın Posizyon Vektörü] );
[Aracın Gövdesini Çizdir]

glLoadIdentity();
glTranslatef( [Aracın Posizyon Vektörü] );
glTranslatef( [Ön Tekerleğin Pozisyon Vektörü] );
[Ön Tekerleği Çizdir]

glLoadIdentity();
glTranslatef( [Aracın Posizyon Vektörü] );
glTranslatef( [Arka Tekerleğin Pozisyon Vektörü] );
[Arka Tekerleği Çizdir]

...

Eğer glPushMatrix() ve glPopMatrix fonksiyonlarını kullanırsak, aynı örnek aşağıdaki hali alır.

glPushMatrix();
  glTranslatef( [Aracın Posizyon Vektörü] );
  glPushMatrix();
    glTranslatef( [Ön Tekerleğin Pozisyon Vektörü] );
    [Ön Tekerleği Çizdir]
  glPopMatrix();
  glPushMatrix();
    glTranslatef( [Arka Tekerleğin Pozisyon Vektörü] );
    [Arka Tekerleği Çizdir]
  glPopMatrix();

  [Aracın Gövdesini Çizdir]
glPopMatrix();

1 yorum: