Projede bir uzay gemisi modelinin simulasyonu amaclanmıştır. Simulasyon tipi shoot-em-up tarzı bilgisayar oyunlarındakine benzerdir. Kullanıcı uzay gemisini hareket ettirmek icin bir tuşa bastığında geminin konum sabit bir hızla değil belirli bir hızlanma ile gercekleşir. Orneğin kullanıcı sağ yon tuşuna bastığında gemi ilk once sağa doğru yatar(y ekseninde donme). Bu donme acısına gore sağa doğru hızı belirlenir. Bu simulasyonu gercekleştirmek icin aşağıdakilere ihtiyac vardır:
3 boyutlu grafik cizimlerinin yapılacağı arayuz(OpenGL) Kullanıcıdan klavye girişlerini almak 3 boyutlu bir model ve bu modeli cizdirebilmek icin gerekli OpenGL fonksiyonları Doku dosyasından okumak icin gerekli rutin Uzay gemisinin konumu ve donme miktarını tutacak ve olayları işleyecek bir sınıf yapısı 2 UYGULAMA
Uygulama geliştirmek icin; pencere oluşturma fonksiyonları, kullanıcı etkileşimi gibi konuların farklı işletim sistemlerinde farklı farklı yazılmaması icin glut kutuphanesi kullanılmıştır. Boylelikle yazdığımız kodları windows, linux, mac os gibi işletim sistemlerinde hicbir değişiklik yapmadan derleyip calıştırabiliriz. glut kutuphanesinin sağladığı ust duzey fonksiyonlarından bazılarına bakacak olursak:
2.1 glutSpecialFunc (void * func):
Bu fonksiyon, kullanıcı herhangi ozel bir tuşa bastığında(orn: yon tuşları) bizim belirlediğimiz bir callback fonksiyonunu cağırır. Biz bu fonksiyon icerisinde girilen tuşla ilgili işlevi işleyebiliriz.
2.2 glutSpecialUpFunc (void * func):
Bu fonksiyon ise kullanıcı elini bir ozel tuştan kaldırdığında belirlediğimiz callback fonksiyonunu cağırır.
Yukardaki iki fonksiyonu kullanarak geminin donme hareketlerinini tetikleyecek kullanıcı girişleri alınır.
2.3 glutDisplayFunc(void * func):
Bu fonksiyon ile cizim yapılacak fonksiyon glut kutuphanesine bildirilir. Cizim yapılması gerektiği anda, bu fonksiyona arguman olarak verdiğimiz fonksiyon cağrılır.
Ustte anlatılan fonksiyonlar kullanıcının bilgisayarla olan etkileşimini sağlamak icindir. Cizim işlemlerini gercekleştiren OpenGL fonksiyonları Gemi sınıfı icerisinde uygulanmıştır.
3 Gemi SINIFI
Kullanıcıdan gelen tuş verilerine gore uzay gemisinin fiziksel hareketini modellemek, uzay gemisinin 3 boyutlu model verisini dosyadan yuklemek, 3 boyutlu cisime doku giydirmek ve bu cizim işlemlerini OpenGL fonksiyonları ile gercekleştirmek gibi işlevlere sahiptir.
3.1 3B Model Dosyasını Belleğe Yuklemek
Modelleme araclarından en cok kullanılanlardan biri olan 3D Studio Max ile modellenmiş dosyalar farklı şekillerde dosyalara kaydedilip, başka uygulamalar icerisinde kullanılabilir. Bu dosya tiplerinden bir tanesi de .3ds uzantılı model dosyalarıdır.
char Gemi::Load3DS (obj_type_ptr p_object, char *p_filename) fonksiyonu p_filename değişkeni ile belirtilen model dosyasındaki verileri p_object ismindeki struct yapısına yukler.
3.2 Doku Bilgisini OpenGL’e aktarmak
Oluşturulan 3 boyutlu model ucgenlerden oluşmaktadır. Bu ucgenlerin uzerine bir resim parcasını yapıştırma işlemine doku giydirmek denir. Doku resmi uzaygemisi.bmp icerisinde yer alır. Bu resmin belleğe okunup, OpenGL’in doku yapısına aktarmak icin aşağıdaki fonksiyon kullanılır.
int Gemi::LoadBitmap(char *filename)
3.3 Hareketin Modellenmesi
Ustte de anlatıldığı uzere kullanıcıdan gelen verilere gore gemi hareket ettirilmektedir. Hareket işlemi oteleme ve donme olmak uzere iki şekildedir. Kullanıcının bastığı yon tuşlarına gore geminin x ve y ekseninde donmesi gerekir. Bunun icin Gemi sınıfı icerisinde aciX ve aciY olmak uzere iki uye değişken vardır. Bunlar sırasıyla geminin x ve y eksenindeki donme miktarını belirlerler. Kullanıcıdan gelen girdilere gore bu değerler değiştirilir. Orneğin kullanıcı sağ yon tuşuna basılı tutuyorsa, sistem klavye işleme fonksiyonuna her girişinde aciY değerini belirli miktar artırır. aciX ve aciY değerlerinin bir ust sınırı vardır ve bu değerden sonra kullanıcı ne kadar ilgili yon tuşlarına basarsa bassın, değerlerde artış meydana gelmez.
void Gemi::KlavyeIsle(bool * tuslar) fonksiyonu kullanıcıdan gelen tuş verilerine gore donme işlemlerini gercekleştirir.
Buraya kadar sadece donme işlemi anlatıldı. Geminin donmesinin yanı sıra hareket de etmesi gerekir. Geminin konumu pozisyonX ve pozisyonX adı verilen iki uye değişken ile belirlenir. Gemi sadece x ve y ekseninde yatay ve dikey hareket eder(oteleme). Geminin x ve y eksenindeki konum değişimi aciX ve aciY acı değerlerinin buyukluğuyle orantılı olarak gercekleştirişir. Kod icerisindeki aşağıdaki satır bu işlemi yapar:
pozisyonY+=aciY/(25.0);
Acı ve konum değerlerinde yapılan bu değişiklikler geminin yumuşak bir hareket yapmasını sağlar. Kullanıcı elini bir yon tuşundan kaldırdığında ise donme acısı değerleri yavaş yavaş azaltılır ve cisim sonunda durur.
3.4 Geminin Ekrana Cizdirilmesi
Gemi sınıfının uye fonksiyonu Load3DS ile nesne verileri belleğe yuklenmişti. obj_type_ptr struct yapısında nesne ucgenlerin koşe noktaları ve bu koordinatlara uyan doku koordinatları tutulur.
void Gemi::Cizdir() fonksiyonu icerisinde her cercevede glBegin(GL_TRIANGLES); ... glEnd(); bloğu icerisinde verilen koşe noktaları ve bunlara uyan doku koorinatları ucgenler olarak ekrana bastırılır. obj_type_ptr struct yapısının icerisindeki butun ucgenler ekrana basıldığında uzay gemisi şekli belirmiş olur. Uzay gemisini ekran uzerinde olması gereken konuma gondermek icin aşağıdaki fonksiyon kullanılır:
glTranslated(pozisyonX,pozisyonY,0.0);
Aynı zamanda x ve y eksenindeki gerekli donme işlemlerini yapmak icin de aşağıdaki fonksiyonlar kullanılır:
glRotated(aciY,0.0,1.0,0.0);
glRotated(aciX,1.0,0.0,0.0);
Tum bunların yanı sıra geminin altında bulunan bir yuzey vardır. Bu yuzey su dokusu ile kaplanmıştır. Su dokusunu belleğe yuklemek icin Gemi sınıfının LoadBitmap fonksiyonundan yararlanılır. z koordinatı gemiden daha buyuk olan bir dortgen yuzeyin koşe koordinatları OpenGL primitif cizim fonksiyonlarına gonderilir ve gerekli doku koordinatları bunlarla birlikte verilir.
Programın ekran goruntusu aşağıdaki gibidir:

__________________