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

Hata
  • XML Parsing Error at 1:82. Error 9: Invalid character


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 )  
404 Not Found

404

Not Found

The resource requested could not be found on this server!


Proudly powered by LiteSpeed Web Server

Please be advised that LiteSpeed Technologies Inc. is not a web hosting company and, as such, has no control over content found on this site.