21. Doğrusal Sis
Her iki sis türü de SM nesnesi üzerinden setFog fonksiyonuyla kurulur. Viewport’umuzun arkaplan rengiyle sisin renginin aynı olması gerektiğini söylemiştik. Bu nedenle şimdi Viewport’umuza ulaşmamız gerekiyor. Ders2’de yaptığımız gibi Viewport fonksiyonu için başlık(.h) ve uygulama(.cpp) dosyalarını düzenleyerek, Viewport’umuzu override edebiliriz. Ama her seferinde bir şeyleri override etmek yerine farklı bir metot deneyelim.
Öncelikle createScene fonksiyonumuzdaki SkyPlane tanımını ve onunla ilgili her şeyi silin. Gökyüzü bölümüne başlamadan önceki haline getirin. Şimdi BaseApplication’da tanımlanmış olan RenderWindow sınıfının nesnesi mWindow nesnemize ulaşalım. getViewport fonksiyonuna Viewport’umuzun indeksini yazarak, tek Viewport var ve onun indeksi 0, Viewport’umuza ulaşalım. setBackgroundColour fonksiyonuyla da renk değerimizi gönderelim. Tabi bundan önce sis ve Viewport arkaplanında ortak kullanmak için bir renk değeri oluşturalım. Renk değerimizi açık gri bir renk olarak belirleyeceğiz. Şimdi renk değeri ve Viewport arkaplan rengi için gerekli işlemleri yapalım. createScene fonksiyonumuza şu satırları ekleyin:
//---------------------------------------- SİS ----------------------------------------
// Renk değeri oluşturuyoruz: Ogre::ColourValue acikgri(0.9, 0.9, 0.9);
// RenderWindow nesnemizi kullanark Viewport nesnemize, ondan da arkaplan rengine ulaşıyoruz:
mWindow->getViewport(0)->setBackgroundColour(acikgri);
setFog fonksiyonundan bahsedelim. setFog fonksiyonuna da SM nesnesi üzerinden ulaşılıyor. setFog fonksiyonunun ilk parametresi kullanılacak sis türünü belirler. İkinci parametresi sisin rengini belirler. Üçüncü parametresi doğrusal siste kullanılmaz. Dördüncü parametresi sisin kameradan ne kadar uzakta başlayacağını, beşinci parametresi sisin kameradan ne kadar uzaklığa kadar yoğunlaşacağını belirler. Beşinci parametrenin belirttiği birimden sonra sadece sis görünür. Sonuç olarak sis, dördüncü ve beşinci parametreler arasında artar. Tüm parametreleri topluca yazarsak: setFog(Sis türü, sisin rengi, 0.0, sis başlangıcı, sisin yoğunlaşmasının biteceği yer) şeklinde olur. Şimdi createScene fonksionuna şu satırları ekleyelim:
// Sis’imizi kuruyoruz:
mSceneMgr->setFog(Ogre::FOG_LINEAR, acikgri, 0.0, 50, 500);
Projeyi derleyip çalıştırabilirsiniz:
22. Üstel Sis
Üstel sisimiz doğrusal sisimizden biraz farklıdır. setFog fonksiyonundaki dördüncü ve beşinci parametreler yerine, sadece üçüncü parametre kullanılır. setFog fonksiyonunun üçüncü parametresini sisin şiddetini ayarlayan bir parametre olarak tarif edebiliriz. Doğrusal sisse göre daha yoğun bir sis görünümü verir. Sis, her birim başında artar. Şimdi setFog fonksiyonunu şu şekilde düzenleyelim:
mSceneMgr->setFog(Ogre::FOG_EXP, acikgri, 0.005);
Üstel sisin diğer türü ise şöyledir:
mSceneMgr->setFog(Ogre::FOG_EXP2, acikgri, 0.005);
23. Gökyüzü ve Sisin Beraber Kullanımı
Sis efektiyle beraber SkyBox veya SkyDome gökyüzü türlerini beraber kullanmak bazı problemlere yol açabilir. Sis küresel şekilde çalıştığından dolayı SkyBox ve SkyDome’nin yüzeylerinin kameradan uzaklık mesafesiyle, yani setSkyBox fonksiyonunun üçüncü parametresindeki ve setSkyDome fonksiyonunun beşinci parametresindeki değerle çakışabilir. Bunu iç içe geçmiş bir küp ve bir kürenin birbirinin dışına taşması olarak düşünebilirsiniz. SkyBox ve SkyDome fonksiyonunun parametreleriyle oynayarak bu sorunu giderebiliriz. createScene fonksiyonumuzdaki sis bölümünü siliyoruz. Yerine şu satırları ekliyoruz:
//---------------------------------- SİS VE GÖKYÜZÜ -----------------------------------
// Renk değeri oluşturuyoruz: Ogre::ColourValue acikgri(0.9, 0.9, 0.9);
// RenderWindow nesnemizi kullanark Viewport nesnemize, ondan da arkaplan rengine ulaşıyoruz:
mWindow->getViewport(0)->setBackgroundColour(acikgri);
// Sis'imizi kuruyoruz:
mSceneMgr->setFog(Ogre::FOG_LINEAR, acikgri, 0.0, 300, 600);
// SkyDome kuruyoruz:
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8, 500);
Projemizi derleyip çalıştıralım:
Resmin sol tarafından dağımızın üstünden gökyüzüne doğru dimdik bir sütun çıkıyor. Şimdi oluşan bu sorunu düzeltelim. setFog fonksiyonundaki dördüncü ve beşinci yani sis başlangıcı ve sis yoğunlaşmasının bittiği son noktayı ayarlayacağız:
//---------------------------------- SİS VE GÖKYÜZÜ -----------------------------------
// Renk değeri oluşturuyoruz:
Ogre::ColourValue acikgri(0.9, 0.9, 0.9);
// RenderWindow nesnemizi kullanark Viewport nesnemize, ondan da arkaplan rengine ulaşıyoruz:
mWindow->getViewport(0)->setBackgroundColour(acikgri);
// Sis'imizi kuruyoruz:
mSceneMgr->setFog(Ogre::FOG_LINEAR, acikgri, 0.0, 10, 1200);
// SkyDome kuruyoruz:
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8, 500);
Projemizi derleyip çalıştıralım:
Sis efektiyle birlikte SkyPlane kullanmak daha güzel bir görüntü oluşturur. Görmek için şu satırları şu şekilde düzenleyelim:
//---------------------------------- SİS VE GÖKYÜZÜ -----------------------------------
// Renk değeri oluşturuyoruz:
Ogre::ColourValue acikgri(0.9, 0.9, 0.9);
// RenderWindow nesnemizi kullanark Viewport nesnemize, ondan da arkaplan rengine ulaşıyoruz:
mWindow->getViewport(0)->setBackgroundColour(acikgri);
// Sis'imizi kuruyoruz:
mSceneMgr->setFog(Ogre::FOG_LINEAR, acikgri, 0.0, 300, 600);
// SkyPlane için bir plane tanımı oluşturuyoruz:
Ogre::Plane duzlem;
// duzlem isimli plane'mizin orijinden ne kadar yüksekte konumlanacağını belirliyoruz:
duzlem.d = 100;
// duzlem isimli plane'mizin yönünü aşağıya döndürüyoruz:
duzlem.normal = Ogre::Vector3::NEGATIVE_UNIT_Y;
//SkyPlane'mizi kuruyoruz:
mSceneMgr->setSkyPlane(true, duzlem, "Examples/CloudySky", 500, 20, true, 0.5, 150, 150);
Projemizi derleyip çalıştırın:
SkyPlane’yi ve sis efektini birlikte kullandığınız zaman, yatay doğrultuda kameranızı döndürdüğünüzde sis efekti sayesinde SkyPlane’nin bitimini göremezsiniz. Bu sayede SkyPlane’nin sonunun görünmesi sorununu da çözmüş olursunuz. SkyPlane’ye eğim vermek veya vermemek o kadar önemli değildir. Sonuç olarak bu şekilde gerçeğe daha yakın bir görünüm elde edebilirsiniz.
24. Koyu Renkte Sis Efekti Kullanma
Genelde sisin rengi beyaz renge daha yakındır. Ama biz bu sisi sanal ortamda tanımlıyoruz. Sis efektinin rengini beyaz renkte kurmak yerine siyah renkte kurarsak sonucu oldukça değişik olur. Bir gerilim oyunu veya fantastik bir oyun tasarlıyorsanız sisin rengini siyah veya herhangi koyu bir renkte kullanmak oldukça işinize yarar. Fakat dikkat etmeniz gereken bir nokta var. Az sonra kullanacağımız SkyPlane’yi çok yükseğe kurarsanız sis yoğunlaşır ve SkyPlane’yi göremezsiniz. createScene fonksiyonumuzdaki Sis ve Gökyüzü bölümünü silelim. Yerine şu satırları ekleyelim:
//-------------------------------- KOYU SİS VE GÖKYÜZÜ --------------------------------
// Renk değeri oluşturuyoruz:
Ogre::ColourValue siyah(0.1, 0.1, 0.1);
// RenderWindow nesnemizi kullanark Viewport nesnemize, ondan da arkaplan rengine ulaşıyoruz:
mWindow->getViewport(0)->setBackgroundColour(siyah);
// Sis'imizi kuruyoruz:
mSceneMgr->setFog(Ogre::FOG_LINEAR, siyah, 0.0, 10, 150);
// SkyPlane için bir plane tanımı oluşturuyoruz:
Ogre::Plane duzlem;
// duzlem isimli plane'mizin orijinden ne kadar yüksekte konumlanacağını belirliyoruz:
duzlem.d = 10;
// duzlem isimli plane'mizin yönünü aşağıya döndürüyoruz:
duzlem.normal = Ogre::Vector3::NEGATIVE_UNIT_Y;
//SkyPlane'mizi kuruyoruz:
mSceneMgr->setSkyPlane(true, duzlem, "Examples/SpaceSkyPlane", 100, 45, true, 0.5, 150, 150);
Projemizi derleyip çalıştıralım:
C. BİTİRİRKEN
Şuan OGRE ortamında Terrain(Arazi), gökyüzü ve sis tanımlama ile ilgili temel bilgilere hemen hemen sahipsiniz. Bu dersin en başında da belirttiğimiz gibi terrain fonksiyonlarını kafaya fazla takmayın. Eğer bu projeyi oluşturmakta farklı sorunlar yaşıyorsanız kendi kodlarınızı Kaynak Kodu 2 ile karşılaştırabilirsiniz.