Ogre Kütüphanesi Bölüm-7 Kameralar Işıklar ve Gölgeler-3
UstaDerslik Soru-Cevap Yararlı Araçlar
arama ikon

bilgi UstaDerslik
Bu uyari kutusudur.
Tamam
Anasayfa
İletişim
Üyeler

Ogre Kütüphanesi Bölüm-7 Kameralar Işıklar ve Gölgeler-3

profil
OLENVERDGRUP
BEĞEN(1)
BEĞENME(0)
GÖRÜNTÜLENME(3578)
RAPOR ET
11. Biz Entity’lerimizi tanımlarken hep doğrudan model dosyasının ismini belirttik. Entity tanımının ikinci parametresine hep ogrehead.mesh, ninja.mesh yazarak devam ettik. Bu dosyalar bilgisayarın hangi klasöründe, materiali ne olacak, kaplaması hangi dosyadır hiç ayarlamadık. Çünkü şuana kadar tüm bu model dosyaları için gerekli ayrıntılar tanımlanmıştı. Şuanda ise önceden tanımlanmamış bir model oluşturuyoruz. Bundan dolayı bu modelin gerekli ayarlarını yapacağız. Programımız hep (model) + (materyal) + (kaplama) + … >> ResourceManager >> Entity şeklinde bir yol izliyor. Biz ise her şeyi en baştan oluşturduğumuzdan dolayı (plane’nin ön tanımı) >> MeshManager >> ResourceManager >> Entity şeklinde bir yol izleyeceğiz. Şimdi MeshManager sınıfının üye fonksiyonu olan createPlane fonksiyonunu kuracağız. Parametreleri şöyle olacak: createPlane(isim, grup ismi, (planenin ön tanım nesnesinin ismi), genişlik, yükseklik, X dilimleri, Y dilimleri, normal oluşturma, numTexCoordSets, X kaplama tekrarı, Y kaplama tekrarı, (kaplama koordinatlarının üst doğrultusu)). Bir hayli sıkıcı ve uzun gözükmekte. createPlane parametreleri üzerinde fazla durmayın. Ders3’de daha ayrıntılı olarak plane kullanacağız. createPlane fonksiyonu ile plane’mizin tüm ayrıntılarını oluşturmuş ve ResourceManager’a kaydetmiş olacağız. Yüzeysel olarak parametrelerin kullanımına değinelim. createPlane fonksiyonunun, ilk parametresiyle bundan sonra kullanacağı model adını, ikinci parametresiyle kaynak yönetecisi altında hangi grubun içinde yer alacağını, üçüncü parametresiyle önceki maddede eklediğimiz planenin ön tanımını, dördüncü parametresinde planenin enini, beşinci parametresinde planenin boyunu belirteceğiz. Planemiz 1500x1500 birim boyutunda olacak. Diğer parametreleri Ders3’te açıklayacağız. createScene fonksiyonuna şu satırları ekliyoruz:

// Plane tanımımızdan bir Plane oluşturuyoruz: 
Ogre::MeshManager::getSingleton().createPlane("zemin", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, ilkplanemiz, 1500, 1500, 20, 20, true, 1, 5, 5, Ogre::Vector3::UNIT_Z);


12. Şuan zemin isminde bir model tanımına sahibiz. Entity’mizi oluşturuyoruz. Entity’mizin ilk parametresinde ismini zeminPlanesi ve ikinci parametresinde model dosyasını zemin olarak belirleyeceğiz. SceneNode’yi de tanımlamadan oluşturuyoruz. createScene fonksiyonuna şu satırları ekleyin:

// Plane'miz için Entity ve SceneNode oluşturuyoruz:
Ogre::Entity* zeminPlanesi = mSceneMgr->createEntity("zeminPlanesi", "zemin"); mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(zeminPlanesi);


13. Şimdi zeminPlanesi nesnesinin materyalini kuracağız. OGRE’deki, ogrehead.mesh, ninja.mesh gibi önceden tanımlanmış olan model dosyalarına benzer şekilde önceden tanımlanmış bir materyal scripti kullanacağız. zeminPlanesi nesnemiz için Examples/Rockwall materyal scriptini kuracağız. Ayrıca, gölge dökümümü için setCastShadows fonksiyonunu da kurmalıyız. Ama zeminPlanesi nesnesinin altında gölgesinin düşebileceği herhangi bir Entity yok. Bu yüzden setCastShadows fonksiyonunun boolean değişkenini 0 veya false olarak kuracağız. createScene fonksiyonumuza şu satırları ekleyelim:

// zeminPlanesi'nin materyalini kuruyoruz:
zeminPlanesi->setMaterialName("Examples/Rockwall");

// zeminPlanesi'nin gölge dökümü alınma işlemini kapatıyoruz:
zeminPlanesi->setCastShadows(false);


Şuan tüm createScene fonksiyonumuz şu şekilde görünmeli:

void Ders2::createScene(void) {

// Ambient Light'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0, 0, 0));

// Gölge Tekniğimizi kuruyoruz:
mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);

// Bir Entity oluşturuyoruz ve ona Nija modeli yüklüyoruz:
Ogre::Entity* entNinja = mSceneMgr->createEntity("Ninja", "ninja.mesh");

// Entity'miz için bir SceneNode oluşturuyoruz:
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(entNinja);

// Entity'mizi gölge dökümünün alınması ayarlıyoruz:
entNinja->setCastShadows(true);

// Bir Plane Tanımı oluşturuyoruz:
Ogre::Plane ilkplanemiz(Ogre::Vector3::UNIT_Y, 0);

// Plane tanımımızdan bir Plane oluşturuyoruz:
Ogre::MeshManager::getSingleton().createPlane("zemin", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, ilkplanemiz, 1500, 1500, 20, 20, true, 1, 5, 5, Ogre::Vector3::UNIT_Z);

// Plane'miz için Entity ve SceneNode oluşturuyoruz:
Ogre::Entity* zeminPlanesi = mSceneMgr->createEntity("zeminPlanesi", "zemin"); mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(zeminPlanesi);

// zeminPlanesi'nin materyalini kuruyoruz:
zeminPlanesi->setMaterialName("Examples/Rockwall");

// zeminPlanesi'nin gölge dökümü alınma işlemini kapatıyoruz:
zeminPlanesi->setCastShadows(false); }


Projemizi şimdi derleyip çalıştırabilirsiniz. Ama ekranda hiçbir şey göremeyeceksiniz. Bunun iki nedeni var; ilki Ambient Light’ımızın koyu renkte olması, ikincisi sahnemizde herhangi bir ışık bulunmamasıdır. Ambient Light’ın bir tür renk tonlaması yaptığından bahsetmiştik. Yani Ambient Light tam anlamıyla bir ışık değildir.

14. Işıkları da SceneNode’ler ve Entity’ler gibi SceneManager’e bağlı olarak oluştururuz. Bu işlem için SceneManager nesnemizden createLight fonksiyonunu çağırırız. createLight fonksiyonun parametresinde ışığımızın string türündeki ismini belirleriz. Işık nesneleri kamera nesneleri gibi değillerdir. Eğer sabit koordinata koyacaksanız, setPosition fonksiyonunu kullanarak konumunu belirleyebilirsiniz. Eğer ışığınız hareket edecekse, örneğin karakterin elindeki el fenerinin ışığını kururarken, ışığı bir SceneNode bağlamalısınız. Ancak, kamera nesnelerinde olduğu gibi ışık nesneleri SceneNode’lerin tüm fonksiyonlarını desteklemez. Ayrıca, setDirection fonksiyonuyla ışık nesnenizin yönünü kurabilirsiniz. Şimdi bir ışık oluşturalım. Işığımızın türü PointLight olsun. createScene fonksiyonumuza şu satırları ekleyelim:

// Işık nesnemizi oluşturuyoruz:
Ogre::Light* ilkIsik = mSceneMgr->createLight("ilkPonitLightimiz");

// ilkIsik nesnemizin türünü PointLight olarak belirliyoruz:
ilkIsik->setType(Ogre::Light::LT_POINT);

// ilkIsik nesnesinin konumunu kuruyoruz:
ilkIsik->setPosition(Ogre::Vector3(0, 150, 250));


15. Işığımızın iki renk değerini de kırmızı olarak kuruyoruz. createScene fonksiyonumuza şu satırları ekleyelim:

// ilkIsik nesnemizin renk değerlerini kuruyoruz:
ilkIsik->setDiffuseColour(1.0, 0.0, 0.0);
ilkIsik->setSpecularColour(1.0, 0.0, 0.0);


http://ustaderslik.com/resim/ders/t8376.png

Projemizi derleyip çalıştırabilirsiniz. Işık kaynağının oluşturduğu etkiyi sahnemizdeki nesnelerin üzerinde görebiliriz. Fakat ışık kaynağının kendisini asla göremeyiz.

16. Şimdi bir DirectionalLight ekleyelim. Bu yeni ışığımızın rengi ise sarı olsun. ilkIsik nesnemizi oluştururken yaptıklarımızın aynısı yapıyoruz. Fakat bu sefer renk değerleri ve ışık türü farklı kurulacak. DirectionalLight ile ilgili bilmemiz gereken bir şey daha var. DirectionalLight ışığının çok çok uzak bir yere konumlandırıldığı varsayılır. Bu yüzden DirectionalLight nesnesine konum kuramayız. setDirection fonksiyonuyla sadece onun yönünü kurabiliriz. Şuan ise –y ve +z eksenlerinde 45 derecelik bir açı oluşturan bir DirectionalLight kuracağız. createScene fonksiyonuna şu satırları ekleyelim:

// ikinciIsik nesnemizi directionalLight türünde, sarı renkte, Ninja'nın yüzüne doğru 45 derece açıyla kuruyoruz:
Ogre::Light* ikinciIsik = mSceneMgr->createLight("directionalLightimiz");
ikinciIsik->setType(Ogre::Light::LT_DIRECTIONAL);
ikinciIsik->setDiffuseColour(Ogre::ColourValue(0.25, 0.25, 0));
ikinciIsik->setSpecularColour(Ogre::ColourValue(0.25, 0.25, 0));
ikinciIsik->setDirection(Ogre::Vector3( 0, -1, 1 ));


http://ustaderslik.com/resim/ders/t837d.png

Projemizi derleyip çalıştırabiliriz. DirectionalLight kaynağının etkisinin fazla belirgin olmadığını göreceksiniz.

17. Üç ışık türümüzden sonuncusu olan SpotLight’ı da kuralım. SpotLight, sahip olduğu fonksiyonlar bakımından pointLight ve DirectionalLight’ın bir tür karışımıdır. Hem ışığımıza setPosition fonksiyonuyla bir konum kurarız. Hem de setDirection fonksiyonuyla ışığımıza bir yön belirtiriz. Diğer iki ışık türünde olmayan bir de setSpotlightRange fonksiyonuyla da etki merkezlerini, farklı bir ifadeyle ışık etkisinin iç ve dış dairelerini kurarız. Şimdi bir SpotLight ekleyelim. SpotLight’ımızın rengini mavi olarak belirliyoruz. createScene fonksiyonuna şu satırları da ekleyin:

// ucuncuIsik nesnemizi spotLight türünde, mavi renkte, Ninja'nın sol omuzuna doğru 45 derece açıyla, belirlediğimiz konuma, iç dairesi 35 dış dairesi 50 derece olacak şekilde kuruyoruz: 
Ogre::Light* ucuncuIsik = mSceneMgr->createLight("spotLightimiz");
ucuncuIsik->setType(Ogre::Light::LT_SPOTLIGHT);
ucuncuIsik->setDiffuseColour(0, 0, 1.0);
ucuncuIsik->setSpecularColour(0, 0, 1.0);
ucuncuIsik->setDirection(-1, -1, 0);
ucuncuIsik->setPosition(Ogre::Vector3(300, 300, 0));
ucuncuIsik->setSpotlightRange(Ogre::Degree(35), Ogre::Degree(50));


Projemizi şimdi derleyip çalıştırabilirsiniz.

http://ustaderslik.com/resim/ders/t837p.png

C. BİTİRİRKEN



Şuan OGRE ortamında kamera, ışık ve gölge tanımlama ile ilgili temel bilgilere hemen hemen sahipsiniz. Genişletilmiş Bölüm’de deyebileceğiniz bazı işlemlere yer verdik. Ayrıca, eğer bu projeyi oluşturmakta farklı sorunlar yaşıyorsanız kendi kodlarınızı Kaynak Kodu ile karşılaştırabilirsiniz.



Kod
Kalın
Vurgu
Resim
Video
Url
CEVAPLA
Tüm Hakları Saklıdır. ©Arleone 2013-2014 UstaDerslik






Giriş
Şifremi Unuttum...
Şifre Talep
  Kuralları Kabul Ediyorum.
Kaydol