Sayfalar

1 Eylül 2010 Çarşamba

ogre3d'deki ilk projemizi anlamlandırma

//———————————-ORNEK KOD ———————————–

#include
#include
class SampleApp : public ExampleApplication
{
public:
SampleApp()
{}

protected:
void createScene(void)
{

mSceneMgr->setSkyBox(true, “Examples/CloudyNoonSkyBox”);
Light* myLight = mSceneMgr->createLight(“Light0″);
myLight->setType(Light::LT_POINT);
myLight->setPosition(0, 40, 0);
myLight->setDiffuseColour(1, 1, 1);
myLight->setSpecularColour(1, 1, 1);
}
};
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include “windows.h”

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else

int main(int argc, char **argv)
#endif

{
SampleApp app;
try
{
app.go();
}
catch( Exception& e )
{
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32

MessageBox( NULL, e.getFullDescription().c_str(), “An exception has occured!”, MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
std::cerr << “An exception has occured: “ << e.getFullDescription();
#endif
}

return 0;
}

//———————————————————————————————

Örnek projemizi oluşturduk ve yukarıdaki kod serisini elde ettik. Şimdi bunları inceleyelim. Bildiğiniz gibi ilk önce main fonksiyonu çalışır ve biz de en alt serideki main() fonksiyonunu bulduk. “SampleApp app;” kodu “SampleApp” sınıfından üretilmiş “app” değişkeni demektir. Try – Catch bloğu arasında “app.go();” tüm işlemi başlatan koddur. Eğer bu süreç başarısızlıkla sonuçlanırsa konsol ekranında hata mesajını verecek olan uyarı kısmı da devamında bulunmaktadır.

Buraya kadar herşey tamamsa, bu “SampleApp” sınıfında ne varmış şimdi ona göz atalım. “class SampleApp : public ExampleApplication” ile Sample sınıfı oluşturulmuş ve Ogre3D ekibinin hazırladığı “ExampleApplication” sınıfı miras alınmıştır. İleriki yazılarda bu sınıf hakkında bilgi vereceğim. O yüzden şimdilik bu sınıfın varlığını ve içinde temel bazı değişkenlerin ( mSceneMgr gibi ) ve fonksiyonların ( go( ) fonksiyonu gibi ) varlığını bilmeniz yeterli olacaktır.

“public” kısmındaki SampleApp() constructor‘unun içinde herhangi bir değişkene atama yapılmamış. Bu biraz keyfi bir durum isterseniz herhangi bir alana, bu public de olabilir private de protected da, bir değişken tanımlayıp, constructor‘una ilk atamayı yapabilir ve fonksiyonlar içerisinde bu değişkenleri kullanabilirsiniz.

“protected” alandaki “void createScene(void) fonksiyonu ExapmleApplication fonksiyonundan miras alınma bir fonksiyon olup işlemlerimizi burada yapacağız.

“mSceneMgr->setSkyBox(true, “Examples/CloudyNoonSkyBox”);” satırı bize şu anda gördüğünüz ortamı vermekte. Üç tür ortam tipi var ( skyBox, SkyDome ve SkyPlane şeklinde ) ancak şimdilik bunlara değinmeyeceğim. Bu ortamın kaplama malzemesi ise “Examples/CloudyNoonSkyBox” tır. “mSceneMgr” ise “SceneManager” sınıfından türetilmiş bir değişkendir. Bu değişkende sahnedeki ışıklar, nesneler, cameralar vb tüm varlıklar tutulur. Bu kod serisinde de “mSceneMgr” değişkeni ortamı tutuyor.

“Light* myLight = mSceneMgr->createLight(“Light0″); kod satırı ise ışık sınıfından türetilmiş olan “myLight” adlı değişkeni “mSceneMgr” değişkenine “Light0″ adı altında ekliyor.

“myLight->setType(Light::LT_POINT); bu ışığın tipini “LT_POINT” olarak belirliyor ( Yine üç tip söz konusu ancak bunlara daha sonra değinmeyi planlıyorum ).

“myLight->setPosition(0, 40, 0); kod satırı da ışığımızın konumunu X,Y,Z olarak ayarlamış bulunuyor. Burada şuna değinmek gerekir. Ogre3D’de X-Z ekseni düzlemi temsil ederken Y ekseni de yukarı – aşağı doğrultusunu temsil etmektedir. Yani ışığımızın an itibariyle X ve Z konumunda 0, Y konumunda yerden 40 br yukarıda olacak şekilde ayarlanmıştır.

“myLight->setDiffuseColour(1, 1, 1);ve “myLight->setSpecularColour(1, 1, 1);kod satırlarının anlatılması benim için biraz daha zahmetli olacak zira tam emin değilim ben de :) ama anladığım kadarı ile specular” değeri yumuşak zeminlerden “diffuse” değeri de düzensiz zeminlerden yansıma olayını temsil ediyor. Parametre olarak aldığı değerler de 0-1 arasında değişiyor. Bu durumda vereceğiniz değerler “0.5″ , ” .42″ , ” 0.63f “ veya da ” .9f” şeklinde parametreler alabilir. Bu değişkenlerin ” f “li olabilmelerinin nedenini ben de bilmiyorum :)

İlk örneğimizin tüm olayı bundan ibaret işte :) şimdilik en azından bir fikir sahibi olmuşsunuzdur bu konu hakkında. İlerleyen yazılarda bu değişkenleri değiştirince oluşabilecek farklılıkları gösterip yeni modeller ekleyip durağanlığı biraz daha renklendireceğiz. Hepimize kolay gelsin :)

2 yorum:

  1. bu ogre nin tam bir oyun motoru olmadığı, sadece render edip akışkan görüntü oluşturabildiği; collision (çarpışma) mantığı dahi olmadığı söyleniyor. bu konuda ne düşünüyorsunuz?

    YanıtlaSil
  2. OGRE (Object-Oriented Graphics Rendering Engine - Nesneye Yönelimli Grafik Render Motoru ) adından da anlaşılacağı üzere tam anlamıyla oyun motorudur diyemem ancak harici kütüphanelere tam performans destek veren de bir motordur. Bu noktada bulletPhysics ile ogre'ye fizik, hydrax ile okyanus, skyx ile atmosfer gece gündüz hareketleri vs. gibi özellikler harici kütüphanelerle sağlanmaktadır. Yeterli c++ bilginiz varsa eğer siz de kendi kütüphanenizi geliştirip eksik olduğunu düşündüğünüz özellikleri yazabilirsiniz. misal collision için fizik kütüphanesini daha kurcalamaya başlamadan önce ben kendime yetecek kadarlık bir sistemi geliştirmiştim; tamamen siyah ve beyaz bir png resimdeki haritayı kontrol etme mantığıyla çalışan bir collision örneğiyidi ve benim projem için işe yarar seviyedeydi :)

    YanıtlaSil