Programlama | Programlama Dilleri | C Programlama Dili |C++

Anasayfa Programlama C / C++ OpenGL Uzay Gemisi Simülasyonu


OpenGL Uzay Gemisi Simülasyonu

1         GİRİŞ

Projede bir uzay gemisi modelinin simülasyonu amaçlanmıştır. Simülasyon tipi shoot-em-up tarzı bilgisayar oyunlarındakine benzerdir. Kullanıcı uzay gemisini hareket ettirmek için bir tuşa bastığında geminin konum sabit bir hızla değil belirli bir hızlanma ile gerçekleşir. Örneğin kullanıcı sağ yön tuşuna bastığında gemi ilk önce sağa doğru yatar(y ekseninde dönme). Bu dönme açısına göre sağa doğru hızı belirlenir. Bu simülasyonu gerçekleştirmek için aşağıdakilere ihtiyaç vardır:

 

  • 3 boyutlu grafik çizimlerinin yapılacağı arayüz(OpenGL)
  • Kullanıcıdan klavye  girişlerini almak
  • 3 boyutlu bir model ve bu modeli çizdirebilmek için gerekli OpenGL fonksiyonları
  • Doku dosyasından okumak için gerekli rutin
  • Uzay gemisinin konumu ve dönme miktarını tutacak ve olayları işleyecek bir sınıf yapısı

 

2         UYGULAMA

Uygulama geliştirmek için; pencere oluşturma fonksiyonları, kullanıcı etkileşimi gibi konuların farklı işletim sistemlerinde farklı farklı yazılmaması için glut kütüphanesi kullanılmıştır. Böylelikle yazdığımız kodları windows, linux, mac os gibi işletim sistemlerinde hiçbir değişiklik yapmadan derleyip çalıştırabiliriz. glut kütüphanesinin sağladığı üst düzey fonksiyonlarından bazılarına bakacak olursak:

2.1      glutSpecialFunc (void * func):

 Bu fonksiyon, kullanıcı herhangi özel bir tuşa bastığında(örn: yön tuşları) bizim belirlediğimiz bir callback fonksiyonunu çağırır. Biz bu fonksiyon içerisinde girilen tuşla ilgili işlevi işleyebiliriz.

2.2      glutSpecialUpFunc (void * func):

 Bu fonksiyon ise kullanıcı elini bir özel tuştan kaldırdığında belirlediğimiz callback fonksiyonunu çağırır.

Yukardaki iki fonksiyonu kullanarak geminin dönme hareketlerinini tetikleyecek kullanıcı girişleri alınır.

2.3      glutDisplayFunc(void * func):

Bu fonksiyon ile çizim yapılacak fonksiyon glut kütüphanesine bildirilir. Çizim yapılması gerektiği anda, bu fonksiyona argüman olarak verdiğimiz fonksiyon çağrılır.

Üstte anlatılan fonksiyonlar kullanıcının bilgisayarla olan etkileşimini sağlamak içindir. Çizim işlemlerini gerçekleştiren OpenGL fonksiyonları Gemi sınıfı içerisinde uygulanmıştır.

3         Gemi SINIFI

Kullanıcıdan gelen tuş verilerine göre uzay gemisinin fiziksel hareketini modellemek, uzay gemisinin 3 boyutlu model verisini dosyadan yüklemek, 3 boyutlu cisime doku giydirmek ve bu çizim işlemlerini OpenGL fonksiyonları ile gerçekleştirmek gibi işlevlere sahiptir.

3.1      3B Model Dosyasını Belleğe Yüklemek

Modelleme araçlarından en çok kullanılanlardan biri olan 3D Studio Max ile modellenmiş dosyalar farklı şekillerde dosyalara kaydedilip, başka uygulamalar içerisinde 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 yükler.

3.2      Doku Bilgisini OpenGL’e aktarmak

Oluşturulan 3 boyutlu model üçgenlerden oluşmaktadır. Bu üçgenlerin üzerine bir resim parçasını yapıştırma işlemine doku giydirmek denir. Doku resmi uzaygemisi.bmp içerisinde yer alır. Bu resmin belleğe okunup, OpenGL’in doku yapısına aktarmak için aşağıdaki fonksiyon kullanılır.

int Gemi::LoadBitmap(char *filename)

3.3      Hareketin Modellenmesi

Üstte de anlatıldığı üzere kullanıcıdan gelen verilere göre gemi hareket ettirilmektedir. Hareket işlemi öteleme ve dönme olmak üzere iki şekildedir. Kullanıcının bastığı yön tuşlarına göre geminin x ve y ekseninde dönmesi gerekir. Bunun için Gemi sınıfı içerisinde aciX ve aciY olmak üzere iki üye değişken vardır. Bunlar sırasıyla geminin x ve y eksenindeki dönme miktarını belirlerler. Kullanıcıdan gelen girdilere göre bu değerler değiştirilir. Örneğin kullanıcı sağ yön 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 üst sınırı vardır ve bu değerden sonra kullanıcı ne kadar ilgili yön tuşlarına basarsa bassın, değerlerde artış meydana gelmez.

void Gemi::KlavyeIsle(bool * tuslar) fonksiyonu kullanıcıdan gelen tuş verilerine göre dönme işlemlerini gerçekleştirir.

Buraya kadar sadece dönme işlemi anlatıldı. Geminin dönmesinin yanı sıra hareket de etmesi gerekir. Geminin konumu pozisyonX ve pozisyonX adı verilen iki üye değişken ile belirlenir. Gemi sadece x ve y ekseninde yatay ve dikey hareket eder(öteleme). Geminin x ve y eksenindeki konum değişimi aciX ve aciY açı değerlerinin büyüklüğüyle orantılı olarak gerçekleştirişir. Kod içerisindeki aşağıdaki satır bu işlemi yapar:

     pozisyonY+=aciY/(25.0);

Açı ve konum değerlerinde yapılan bu değişiklikler geminin yumuşak bir hareket yapmasını sağlar. Kullanıcı elini bir yön tuşundan kaldırdığında ise dönme açısı değerleri yavaş yavaş azaltılır ve cisim sonunda durur.

3.4      Geminin Ekrana Çizdirilmesi

Gemi sınıfının üye fonksiyonu Load3DS ile nesne verileri belleğe yüklenmişti. obj_type_ptr struct yapısında nesne üçgenlerin köşe noktaları ve bu koordinatlara uyan doku koordinatları tutulur.

void Gemi::Cizdir() fonksiyonu içerisinde her çerçevede glBegin(GL_TRIANGLES); ... glEnd(); bloğu içerisinde verilen köşe noktaları ve bunlara uyan doku koorinatları üçgenler olarak ekrana bastırılır. obj_type_ptr struct yapısının içerisindeki bütün üçgenler ekrana basıldığında uzay gemisi şekli belirmiş olur. Uzay gemisini ekran üzerinde olması gereken konuma göndermek için aşağıdaki fonksiyon kullanılır:

      glTranslated(pozisyonX,pozisyonY,0.0);

Aynı zamanda x ve y eksenindeki gerekli dönme işlemlerini yapmak için de aşağıdaki fonksiyonlar kullanılır:

     glRotated(aciY,0.0,1.0,0.0);

     glRotated(aciX,1.0,0.0,0.0);

Tüm bunların yanı sıra geminin altında bulunan bir yüzey vardır. Bu yüzey su dokusu ile kaplanmıştır. Su dokusunu belleğe yüklemek için Gemi sınıfının LoadBitmap fonksiyonundan yararlanılır. z koordinatı gemiden daha büyük olan bir dörtgen yüzeyin köşe koordinatları OpenGL primitif çizim fonksiyonlarına gönderilir ve gerekli doku koordinatları bunlarla birlikte verilir.

 

Programın Tamamını Aşağıdaki Linkten İndirebilirsiniz

Linki Görebilmeniz İçin Üye Olmanız Gerekmektedir...

Üye Kayıt

Programın ekran görüntüsü aşağıdaki gibidir:

OpenGL Uzay gemisi program görünümü

Yorumlar (5)
  • cllknt
    yazanın eline sağlık iyi uğraşmış
  • hacker2048  - teşekkürler
    elinize sağlık teşekkür ederim :)
  • gerererere
    alıntı lan ne uğraşması 3 satir birsey yazmis
  • Admin
    Alıntı mı? Kodu yazan arkadaşım çok yakınımdır kodu ders yılında öğrencilere labaratuvar çalışması olması amacıyla yazmıştır. Sitedeki bütün kodlar tarafımızdan yazılmıştır. Lütfen basmakalıp yorumlar yapmayalım.
  • kbrkrnz  - Rica
    İyi akşamlar, buna benzer bir proje teslimim var da yarına kadar,projeyi indiremiyorum. Yardımcı olabilir misiniz lütfen. :( :huh: mail adresime de yazabilirsiniz: kubrakurnaz34@gmail.com
Sadece kayıtlı kullanıcılar yorum yazabilir!
Son Güncelleme ( Perşembe, 07 Nisan 2011 21:16 )  
amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım amınıza koyayım