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

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

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

profil
OLENVERDGRUP
BEĞEN(1)
BEĞENME(0)
GÖRÜNTÜLENME(1662)
RAPOR ET

B. PRATİK DERS



- Proje Adı: Ders2
- Header dosyası: Ders2.h
- CPP dosyası: Ders2.cpp

Adım adım yapılacak işlemler şu şekilde:

1. Önceki derste SM nesnesini biz tanımlamamıştık. BaseApplication sınıfında otomatik olarak uygulama sihirbazı tarafından tanımlanmıştı. Aynı şekilde bu dersimimizde de kamera nesnemiz otomatik tanımlanmış durumda. Ama biz kamera fonksiyonunu override edeceğiz. mCamera nesnemiz bizim için önceden uygulama sihirbazı tarafından tanımlanmış olan Kamera sınıfının bir nesnesi. Şimdiyse onu, mSceneMgr’ye, yani SM’imize bağlı bir kamera olarak oluşturuyoruz. createCamera fonksiyonun ilk parametresi de kamera nesnesinin string türündeki ismini belirliyor. Biz OyuncuKamerasi ismini verdik. Eğer kamera nesnesini bir pointer “*” olmadan tanımlamaya karar verirseniz SM sınıfının getCamera fonksiyonuyla, kameranın parametresinde aldığı isimini yazarak, kameraya ulaşıp, onu kullanabilirsin. Şimdi uygulama dosyamızı açıyoruz ve createCamera fonksiyonuna şu satırları ekliyoruz:

void Ders2::createCamera(void)
{
// Bir kamera oluşturuyoruz:
mCamera = mSceneMgr->createCamera("OyuncuKamerasi");
}


2. Sonraki işlemimiz kameranın konumunu ve yüzünün dönük olduğu konumu, yani yönünü kurmaktır. Biz sahnemizde az sonra tanımlayacağımız nesneleri orijine göre konumlandıracağız. Yani her şey orijinin civarında olacak. Kameramızı +Z ekseninde iyi bir konuma kurup, yönünü orijine döndüreceğiz. lookAt fonksiyonu sayesinde hiçbir döndürme fonksiyonu kullanmadan kamerayı istediğin yöne döndürebilirsin. Ayrıca, SN’lerde bu fonksiyona sahiptir. E’leri de kamera gibi istediğin yöne döndürebilirsin. createCamera fonksiyonumuzun en altına şu satırları ekliyoruz:

// Kameranın konumunu ve yönünü kuruyoruz:
mCamera->setPosition(Ogre::Vector3(0,10,500));
mCamera->lookAt(Ogre::Vector3(0,0,0));


3. Yakın kırpma mesafesini belirleyelim. createCamera fonksiyonuna şu kodları ekleyelim:
// Yakın Kırpma Mesafesini kuruyoruz:
mCamera->setNearClipDistance(5);


4. Önceki derste hiçbir fonksiyon yazmadığımız halde kameramızı W-A-S-D ve fare ile kontrol edebilmiştik. Çünkü BaseApplication sınıfında createCamera fonksiyonunda kamerayı kontrol etmemizi sağlayan fonksiyonlar mevcuttu. Bu derste ise createCamera fonksiyonunu override ettik. Bu yüzden Ders2 uygulama dosyamızda createCamera fonksiyonunun içine yeniden kontrol fonksiyonlarını yazmalıyız. Şimdi createCamera fonksiyonunun içine şu satırı da ekliyoruz:

// Bir varsayılan kamera kontrolcüsü oluşturuyoruz:
mCameraMan = new OgreBites::SdkCameraMan(mCamera);
void Ders2::createCamera(void) {
// Bir kamera oluşturuyoruz:
mCamera = mSceneMgr->createCamera("OyuncuKamerasi");

// Kameranın konumunu ve yönünü kuruyoruz:
mCamera->setPosition(Ogre::Vector3(0,10,500));
mCamera->lookAt(Ogre::Vector3(0,0,0));

// Yakın Kırpma Mesafesini kuruyoruz:
mCamera->setNearClipDistance(5);

// Bir varsayılan kamera kontrolcüsü oluşturuyoruz:
mCameraMan = new OgreBites::SdkCameraMan(mCamera);
}


5. Bizim için uygulama sihirbazı her zamanki gibi gereken nesneleri tanımlamış durumda. vp nesnesi Viewport sınıfından, mWindow nesnesi RenderWindow sınıfından tanımlanmış nesnelerimizdir. Viewport sınıfının nesnesini tanımlarken adını yine vp koyacağız. Yine BaseApplication sınıfında tanımlanmış olan bir fonksiyonu override edeceğiz. mWindow nesnemize addViewport fonksiyonuyla mCamera nesnemizi ekleyeceğiz. Farklı bir ifadeyle, vp adında oluşturduğumuz Viewport’umuz, durumunu mCamera nesnesine göre belirleyecek. Ders2 uygulama dosyasında createViewport fonksiyonu buluyoruz ve içine şu satırları ekliyoruz:

// Tüm pencereye bir Viewport oluşturuyoruz: 
Ogre::Viewport* vp = mWindow->addViewport(mCamera);


6. Şimdi bir arkaplan rengi belirleyeceğiz. Bu uzayımızın rengi olacak. Kamera tarafından Viewport’a düşürülen görüntümüzde sadece sahnedeki nesnelerimizin olduğunu, Viewport’u eni boyu olan bir fotoğraf karesi gibi olduğunu düşünebilirsiniz. Yani arkaplanı saydam olan bir resim çekiyormuş gibi düşünebilirsiniz. Arkaplan rengini kurarak uzayımıza bir renk atamış olacağız:

// Uzayımızın rengini/arkaplan rengini kuruyoruz:
vp->setBackgroundColour(Ogre::ColourValue(0,0,0));


7. Sıra kameramızın en-boy oranını kurmaya geldi. Kameramızın en-boy oranını Viewport’umuzun genişliğine ve yüksekliğine oranlayacağız. Kamera ve Viewport arasındaki ilişkiyi şuan çok hızlı geçiyoruz. İlerleyen derslerde daha kapsamlı ele alacağız. mCamera nesnesinin setAspectRatio üye fonksiyonuna, vp nesnemizin genişlik/yükseklik oranını hesaplatarak Real değişken türünde kuracağız. Eğer kameranın en-boy oranı ile Viewport’un genişliğini ve yüksekliğini neden oranladığımız hakkında aklınıza takılanlar varsa fazla üzerinde durmayın. Bu konu hakkında, bu ders için tek yapmanız gereken aşağıdaki satırı createViewport fonksiyonuna ekleyip geçmek:

// Kameranın en-boy oranını Viewport'a eşliyoruz: 
mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));


Şimdi tüm createViewport fonksiyonumuz şu şekilde görünmeli:

void Ders2::createViewports(void) {

// Tüm pencereye bir Viewport oluşturuyoruz:
Ogre::Viewport* vp = mWindow->addViewport(mCamera);

// Uzayımızın rengini/arkaplan rengini kuruyoruz:
vp->setBackgroundColour(Ogre::ColourValue(0,0,0));

// Kameranın en-boy oranını Viewport'a eşliyoruz:
mCamera->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));

}


Şuan projemizi derleyip çalıştırabilirsiniz. Ama karşınıza içi siyah olan bir pencere çıkacak. Çünkü henüz createScene fonksiyonunda görüntülemek için herhangi bir Entity tanımlamadık.

8. Sahnemizde gölgeleri açmak için SM nesnemizin üye fonksiyonu olan setShadowTechnique fonksiyonunu kurarız. Bu fonksiyonun parametresine üç gölge tekniğinden birinin ismi yazılır. Ayrıca, gölge dökümünün alınmasını istediğimiz Entity’lerimiz için de onların setCastShadows üye fonksiyonlarını kurarız. Şimdi sahnemize Ambient Light’ımızı ve gölge tekniğimizi kuralım. createScene fonksiyonunun içine şu satırları ekliyoruz:

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

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


9. Şimdi sahneye bir Entity oluşturacağız. Entity’mize bir nija modeli yükleyeceğiz. Ayrıca setCastShadows fonksiyonunu da kurarak, gölge dökümünü alacağız. Ninja Entity’miz için SceneNode oluştururken herhangi bir nesne ismi belirlemeyeceğiz. Önceki derste oluşturduğumuzdan farklı bir şekilde SceneNode oluşturacağız. Biz herhangi bir tanımlama yapmadan bir SceneNode oluşturduğumuzda, SceneManager ona bir sıra numarası, yani indeks atayacak. Peki, bu şekilde bir tanımı ne zaman kullanırız? Örneğin şuan Ninja’yı hareket ettirmeyecek veya döndürmeyeceğiz. Sadece sahnede görünmesini istiyoruz. Böyle durumlarda SceneNode tanımı yapmadan direk olarak SceneManager SceneNodesine, çocuk SceneNode oluşturabilirsiniz. Burada da böyle yaptık. createScene fonksiyonumuza şu satırları ekleyelim:

// 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);


10. Nijamızın gölgesinin üstüne düşüceği bir yüzeye ihtiyacımız var. Bu nedenle bir plane oluşturacağız. Planenin yüzey normalini +Y eksenine dönük olarak kuracağız. Yani renderlenebilen yüzeyi yukarı bakacak. Orijinin üzerine yerleştireceğiz. Bu işlemler için MeshManager sınıfını kullanacağız. Basitçe bu sınıftan da bahsetmiş olacağız. Şimdi bir plane nesnesinin ön tanımını oluşturalım. İsmi de ilkplanemiz olsun. İlk parametre de yüzey normalinin yönünü belirleyeceğiz. UNIT_Y, +Y eksenini işaret ediyor. Eğer -Y ekseni için yapacak olsaydık NEGATIVE_UNIT_Y yazacaktık. createScene fonksiyonuna şu satırları ekliyoruz:

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



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