Ogre Kütüphanesi Bölüm-6 En Temel Ogre Yapılarına Giriş-2
Geri Dön

Ogre Kütüphanesi Bölüm-6 En Temel Ogre Yapılarına Giriş-2

Anasayfa
B. PRATİK DERS
Proje Adı: Ders1
1. OGRE’de sahne ile ilgili işlemlerimizi createScene fonksiyonunda yaparız. Uygulama dosyamızı açıp (yani Ders1.cpp) void Ders1::createScene() fonksiyonunun içindeki her şeyi siliyoruz.

void Ders1::createScene(void) 
{
}


2. Projemize ilk olarak AmbientLight’ı kuralım. Bu işlemi yaparken setAmbientLight *kurÇevreselIşık+ ve ColourValue(R, G, B) *RenkDeğeri(K, Y, M)+ fonksiyonlarını kullanıyoruz. mSceneMgr, SM sınıfından türetilmiş bir nesnemiz. İyi de biz böyle bir şey türetmedik nereden çıktı mSceneMgr deyibilirsiniz. Şuan uygulama sihirbazının bizim için hazırladığı nesneleri kullanıyoruz. İlerleyen derslerde bu nesneleri sınıflardan biz türeteceğiz. Kodlarımıza geçelim, AmbientLight’ı gri renkte ayarlıyoruz:

void Ders1::createScene(void) { 
// AmbientLight'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
}


3. Şimdi sahnemize bir E’yi oluşturalım. E’mizi mSceneMgr nesnesi üzerinden createEntity(isim, model) üye fonksiyonu ile oluştururuz. createEntity fonksiyonu SM sınıfının üye fonksiyonudur. createEntity fonksiyonunun ilk parametresinde, E’mizin ismini belirleriz. Her E’nin ismi farklı olmak zorundadır. İkinci parametre ise E’mizin 3D model dosyasını belirler. Dosyanın yerini OGRE nasıl buluyor diye sorabilirsiniz. Bu da uygulama sihirbazımızın bize bir başka kolaylığıdır. İlerleyen derslerde kaynak dizini belirtme vb. işlemlere yer vereceğiz. Kodumuza dönecek olursak, E nesnemizin nesne adını ogreBasi, ismini Bas1 ve model dosyasını ogrehead.mesh olarak belirliyoruz:


void Ders1::createScene(void)
{
// Ambient light'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
// Bir Entity oluşturuyoruz:
Ogre::Entity* ogreBasi = mSceneMgr->createEntity("Bas1", "ogrehead.mesh");


4. Sıra ogreBasi E’miz için bir SN oluşturmaya geldi. Unutmayalım, renderlemek istediğimiz her E’yi mutlaka bir SN’ye bağlamamız gerekiyor. Bu işlem için mSceneMgr nesnemizin üye fonksiyonuyla kendi SN’sine, yani SM’mizin SN’sine ulaşacağız. Sonra bunun üye fonksiyonunu kullanarak, ona bağlı çocuk SN’yi oluşturacağız. E’mizi de çocuk SN’ye bağlayacağız. Teorik dersten hatırlayacağınız gibi hiyerarşik düzene geçtik. Artık anne-çocuk ilişkisini kullanıyoruz. Oluşturacağımız SN, SM türündeki nesnemiz olan mSceneMgr’nin SN’sinin çocuk SN’sidir. Çocuk SN’mizi oluşturuyoruz:


void Ders1::createScene(void) {
// Ambient light'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
// Bir Entity oluşturuyoruz:
Ogre::Entity* ogreBasi = mSceneMgr->createEntity("Bas1", "ogrehead.mesh");
// Entity için SceneNode'mizi oluşturuyoruz:
Ogre::SceneNode* basDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu1");


mSceneMgr üzerinden SN oluşturduk. getRootSceneNode *al.Kök.SahneDüğümü+ fonksiyonunu kullanarak mSceneMgr’nin SN’sine ulaştık. Yani SM’imizin SN’sine ulaşmış olduk. Sonra bu SN’ye createChildSceneNode(isim) *oluştur.Çocuk.Sahne.Düğümü+ fonksiyonuyla çocuk SN oluşturduk. İşte bu çocuk SN, E’mize bağlayacağımız, nesne adı basDugumu, ismi BasDugumu1 olan SN’miz oldu. Tıpkı E’lerdeki gibi SN’lerde farklı isimlere sahip olmak zorundadırlar. get fonksiyonuyla ilgili şöyle bir grafiğimiz var:

http://ustaderslik.com/resim/ders/rshbm.png
Bu grafikte kırmızı şekille çevrili alan mSceneMgr nesnesidir. Sonra get fonksiyonlarından biri olan getRootSceneNode fonksiyonuyla satırı nesneden SN’ye çevirdik. En son da bir SN oluşturduk. Nesne>SN>SN burada get fonksiyonu nesne üzerinde işlem yaparken satırı bir anda SN’ye çevirdi. get fonksiyonunun diğer özelliği de budur.

5. Sıradaki işlemimiz ise oluşturduğumuz E ile SN’yi birbirine bağlamak. Bu işlem için SN’mizin attachObject(Entity) *bağla.Nesne+ üye fonksiyonunu çağıracağız. Parametresine de E’mizin nesne adını yazacağız. basDugumu nesnesi üzerinden attachObject fonksiyonu, parametresi de ogreBasi nesnesi olacak:


void Ders1::createScene(void)
{
// Ambient light'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
// Bir Entity oluşturuyoruz:
Ogre::Entity* ogreBasi = mSceneMgr->createEntity("Bas1", "ogrehead.mesh");
// Entity için SceneNode'mizi oluşturuyoruz:
Ogre::SceneNode* basDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu1");
// Oluşturduğumuz SceneNode'yi Entity'imize bağlıyoruz:
basDugumu->attachObject(ogreBasi);
}


6. Ambient Light’ımızı, E’mizi veSN’mizi oluşturduk. E ve SN’mizi birbirine bağladık. Teorik derste Ambient Light’ın bir tür tonlama yaptığından bahsetmiştik. Bu nedenle sahnemize gerçeğe yakın etki verecek olan bir ışık kaynağı kurmamız gerekiyor. Bu işlemi mSceneMgr nesnemizin üye fonksiyonu olan createLight [oluştur.Işık+fonksiyonuyla yapacağız. Tıpkı E’de ve SN’de olduğu gibi hem bir nesne ismi tanımlayacak hem de bir ışık ismi tanımlayacağız. Nesne ismimiz ilkIsik, ışık ismimiz ise AnaIsik olacak. Işık ismimiz createLight fonksiyonunun ilk parametresinde belirtilecek. Ayrıca, ışıklar da birbirlerinden farklı isimlere sahip olmak zorundalar:


void Ders1::createScene(void)
{
// Ambient light'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
// Bir Entity oluşturuyoruz:
Ogre::Entity* ogreBasi = mSceneMgr->createEntity("Bas1", "ogrehead.mesh");
// Entity için SceneNode'mizi oluşturuyoruz:
Ogre::SceneNode* basDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu1");
// Oluşturduğumuz SceneNode'yi Entity'imize bağlıyoruz:
basDugumu->attachObject(ogreBasi);
// Bir ışık kaynağı oluşturuyoruz:
Ogre::Light* ilkIsik = mSceneMgr->createLight("AnaIsik");
}


7. Işık kaynağımızın sahnenin neresinde duracağını belirleyeceğiz. Yani ışığın X, Y ve Z eksenlerinde konumunu belirleyeceğiz. ilkIsik nesnemizin üye fonksiyonu olan setPosition [kur.Konum] fonksiyonuna X, Y ve Z değerlerini giriyoruz:


void Ders1::createScene(void)
{
// Ambient light'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
// Bir Entity oluşturuyoruz:
Ogre::Entity* ogreBasi = mSceneMgr->createEntity("Bas1", "ogrehead.mesh");
// Entity için SceneNode'mizi oluşturuyoruz:
Ogre::SceneNode* basDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu1");
// Oluşturduğumuz SceneNode'yi Entity'imize bağlıyoruz:
basDugumu->attachObject(ogreBasi);
// Bir ışık kaynağı oluşturuyoruz:
Ogre::Light* ilkIsik = mSceneMgr->createLight("AnaIsik");
// Işık kaynağının konumunu ayarlıyoruz:
ilkIsik->setPosition(20,80,50);
}

Kodlarımızı şimdi derleyip çalıştırabiliriz. W-A-S-D tuşları ve fare ile kamerayı hareket ettirebilirsiniz. ESC tuşuyla programdan çıkış yapabilirsiniz:
http://ustaderslik.com/resim/ders/rshjn.png

8. Kodlarımızı derleyip çalıştırdıktan ve ne yaptığımızı gördükten sonra devam edelim. Bu maddeden itibaren sınıfların farklı üye fonksiyonlarından bahsedeceğiz. OGRE’de E ve SN kullanımındaki temel mantık hemen hemen bu kadar. Öncelikle kod satırlarımızı düzenleyelim. Burada yeni bir şey eklemiyoruz. Sadece önceden yazdığımız kodların sırasını ve yorum satırlarını düzenliyoruz:


void Ders1::createScene(void)
{
// Ambient light'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
// Bir ışık kaynağı oluşturuyoruz ve konumunu ayarlıyoruz:
Ogre::Light* ilkIsik = mSceneMgr->createLight("AnaIsik");
ilkIsik->setPosition(20,80,50);
// Entity, SceneNode oluşturuyoruz ve SceneNode’yi Entity’e bağlıyoruz:
Ogre::Entity* ogreBasi = mSceneMgr->createEntity("Bas1", "ogrehead.mesh");
Ogre::SceneNode* basDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu1");
basDugumu->attachObject(ogreBasi);
}


9. Yukarıdaki kodumuzda bir eksik var. ogreBasi nesnemizin konumunu belirlememişiz. Peki, OGRE konumunu bilmediği ogreBasi nesnemizi nasıl algıladı? OGRE, konum belirtmediğimizde otomatik olarak nesneyi orijine yani (0, 0, 0) noktasına yerleştirir. ogreBasi nesnemizi de konum belirtmediğimiz için aynı şekilde (0, 0, 0) konumuna yerleştirdi. Şimdi ikinci bir E ve bu E’ye bir SN oluşturuyoruz. E’nin nesne adı ogreBasi2, ismi Bas2 ve SN’nin nesne adı basDugumu2, ismi BasDugumu2 olacak. SN’mizi oluştururken bir faklılık yapacağız. İsim parametresinden sonra 3 boyutlu vektör parametresini de yazacağız. Vektörümüz, Vector3(100, 0, 0) [Vector3(X, Y, Z)]olacak. SN’nin ikinci parametresini belirterek, yeni E’mizi X ekseninde 100. birime konumlandıracağız. Tabii SN’yi E’ye bağlamayı da unutmayalım. Bu kodu Ders1::createScene fonksiyonumuzun içine en alta ekleyin:

// İkinci objemizi tanımlıyoruz:
Ogre::Entity* ogreBasi2 = mSceneMgr->createEntity("Bas2", "ogrehead.mesh");
Ogre::SceneNode* basDugumu2 = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu2", Ogre::Vector3(100, 0, 0));
basDugumu2->attachObject(ogreBasi2);

Kodlarımızı derleyip çalıştırın. Uygulamamızın yeni halini inceleyin:
http://ustaderslik.com/resim/ders/rshmt.png



Anasayfa

Tüm Hakları Saklıdır. ©Arleone 2013-UstaDerslik