Ogre Kütüphanesi Bölüm-8 Terrain - Gökyüzü ve Sis - 5
Geri Dön

Ogre Kütüphanesi Bölüm-8 Terrain - Gökyüzü ve Sis - 5

Anasayfa
17. SkyDome’ler
SkyDome kullandığımızda bir kürenin içindeymiş gibi bir hisse kapılırız. Sanki bir yarım küre üstümüze geçirilmiştir. SkyDome’da tıpkı SkyBox’da olduğu gibi kameramızın etrafına bir küp renderlenir. Farkı, SkyDome renderlenirken yüzeyler eğimliymiş gibi kaplaması renderlenir ve SkyDome küpünün altımızda kalan yüzeyi yoktur. Programınızı derleyip çalıştırdığınızda klavyeden R tuşuna basarak mesh görünümüne geçip inceleyebilirsiniz. SM nesnesi üzerinden çalışan setSkyDome fonksiyonuyla kurulur. İlk ve ikinci parametreler SkyBox parametreleriyle aynıdır. İlki aktif olup olmadığı, ikincisi material scripti’dir. Yalnız şimdi kullanacağımız material’de kaplama hareket ediyor. Kaplama’nın bu hareketi SkyDome’den değil material özelliklerinden kaynaklanıyor. setSkyBox fonksiyonunu silerek yerine setSkyDome fonksiyonumuzu kuralım:


//----------------------------------- GÖKYÜZÜ TANIMI ----------------------------------
// SkyDome'mizi kuruyoruz:
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);


Projemizi derleyip çalıştıralım:
http://ustaderslik.com/resim/ders/tb6lg.png

SkyDome’nin üçüncü parametresi eğim parametresidir. Üçüncü parametrenin değeri arttıkça daha kubbemsi bir görünüm oluşur. Yüzeyler arasındaki geçiş daha yumuşak olur. Üçüncü parametrenin değeri azaldıkça ufuk çizgisi çok uzaktaymış gibi bir his oluşturur. Gökyüzü daha basıklaşır. Üçüncü parametre 2 ila 65 arasında değer alır. Üçüncü parametrede farklı denemeler yapalım. İlk denememizde eğim değeri 2 olsun:

mSceneMgr->setSkyDome(true, "Examples/CloudySky", 2, 8);


http://r1310.hizliresim.com/1g/6/tb6m1.png

İkinci denememizde eğim değerini 64 olarak belirleyelim:
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 64, 8);


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

setSkyDome fonksiyonunun dördüncü parametresi ise kaplamanın kaç kere tekrarlanacağını belirler. Dördüncü parametre, OGRE’de float türünü temsil eden real değişkeni türündedir. En fazla 1234 değerini alır. Dördüncü parametreyi 100 değerine ayarlayarak deniyelim:

mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 100);


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

setSkyDome fonksiyonunun beşinci ve altıncı parametreleri, setSkyBox fonksiyonunun üçüncü ve dördüncü parametreleriyle aynıdır. setSkyDome fonksiyonunun beşinci parametresi SkyDome’nin yüzeylerinin kameraya olan uzaklığıdır. Altıncı parametresi ise çizim önceliği parametresidir.

18. SkyPlane’ler
SkyPlane, diğer iki gökyüzü türümüz olan SkyBox ve SkyDome’den oldukça farklıdır. Ders2’de Ninja’mızın altına bir plane oluşturmuştuk. SkyPlane’yi kullanırken aynı şekilde bir düzlem oluştururuz. Fakat bu sefer düzlemin görüntülenebilen yönü, diğer bir ifadeyle normalinin yönü aşağıya bakıyor. Plane’yi Y ekseninde oldukça yüksek bir yere konumlandırıp, yüzeyine setSkyPlane fonksiyonuyla kaplama atıyoruz. Bu sayede bir gökyüzü etkisi oluşturuyoruz. SkyBox ve SkyDome’de konum girmiyorduk. Her iki tür gökyüzünün konumu kameraya bağlı olarak belirleniyordu. Fakat SkyPlane’de durum biraz farklı. Plane’miz terrainin merkez alarak üstüne konumlanıyor. Ne kadar yüksekte duracağını setSkyPlane fonksiyonuyla değil, oluşturacağımız plane tanımına d isimli bir değer atayarak belirliyoruz.

Daha sonra yine SM nesnemiz üzerinden, setSkyPlane fonksiyonunu çağırıyoruz. İlk parametre SkyBox, SkyDome’de de olduğu gibi standart, SkyPlane’nin aktif olup olmayacağını belirliyor. İkinci parametre setSkyPlane fonksiyonunun kullanacağı plane nesnesini belirliyor. Üçüncü parametre, kullanılacak kaplama için material scripti belirliyor. Dördüncü parametre plane nesnesinin enini ve boyunu belirliyor. Örneğin 1500 değerini girdiğimizde, plane’miz 1500x1500 birim boyutunda oluyor. Beşinci parametre ise tıpkı setSkyDome fonksiyonunun dördüncü parametresinde olduğu gibi kullanılacak kaplamanın kaç kez tekrarlanacağını belirliyor. Topluca ifade etmeye çalışırsak: setSkyPlane(aktif/pasif, plane nesnesi, material script, boyut, kaplama tekrarı) şeklinde oluyor. Şimdi SkyPlane’mizi kuralım. setSkyDome fonksiyonunu createScene fonksiyonundan siliyoruz ve yerine şu satırları yazıyoruz:


//----------------------------------- GÖKYÜZÜ TANIMI ----------------------------------
//------------------------------- PLANE TANIMLAMASI -------------------------------
// 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 = 1000;
// duzlem isimli plane'mizin yönünü aşağıya döndürüyoruz:
duzlem.normal = Ogre::Vector3::NEGATIVE_UNIT_Y;
//------------------------------- SKYPLANE KURULUMU -------------------------------
mSceneMgr->setSkyPlane(true, duzlem, "Examples/SpaceSkyPlane", 1500, 75);


Projemizi derleyip çalıştıralım:
http://ustaderslik.com/resim/ders/tb6np.png

SkyPlane kullandığımız zaman görsellikte bir sorun oluşur. Kamerayla etrafınıza baktığınızda SkyPlane’nin bittiği yeri görebilirsiniz. Eğer projenizde SkyPlane kullanacaksanız etrafınız kapalı olmalı. Örneğin yüksek dağlarla çevrili vadide geçen ya da yüksek duvarlarla çevrili bir kalenin içinde geçen bir bölümde SkyPlane kullanmalısınız. Dikkat ettiyseniz bu oyun bölümlerinde kamerayı döndürdüğünüzde etrafınızı göremezsiniz, karşınıza dağ veya duvar çıkar. Amaç kameranın görebildiği yatay eksenleri kapatmaktır, plane’nin sonunu görmeyi engellemektir. SkyPlane metodunda sadece tek bir yüzey renderlendiği için, diğer ikisi gibi bir küp renderlenmediği için bellekten tasarruf etmiş olursunuz. Şimdi setSkyPlane fonksiyonumuza dönelim. Kullandığımız plane’ye eğim verebiliyoruz. Bunun için tek olan daha küçük karesel yüzeylere parçalıyoruz. Daha sonra eğim vererek kubbemsi bir hava katıyoruz.

setSkyBox fonksiyonunun altıncı parametresi SkyBox ve SkyDome’de de bulunan çizim önceliği parametresidir. Yedinci parametresi plane’mize verilecek olan eğimi belirler. Sekizinci parametresi X doğrultusunda plane’nin kaç parçaya ayrılacağını yani X dilimlerini belirler. Dokuzuncu parametresi ise Y doğrultusunda plane’nin kaç parçaya ayrılacağını yani Y dilimlerini belirler. Parametreleri topluca ifade edersek: setSkyPlane(aktif/pasif, plane nesnesi, material script, boyut, kaplama tekrarı, çizim önceliği, eğim, X dilimleri, Y dilimleri) şeklinde olur. Şimdi setSkyPlane fonksiyonumuzu şu şekilde değiştirelim:

mSceneMgr->setSkyPlane(true, duzlem, "Examples/SpaceSkyPlane", 1500, 50, true, 1.5f, 150, 150);


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

SkyDome tanımlarken kullandığımız hareketli materiali burada da kullanabiliriz. Üçüncü parametreyi “Examples/CloudySky” olarak ayarlayım:

mSceneMgr->setSkyPlane(true, duzlem, "Examples/CloudySky", 1500, 50, true, 1.5f, 150, 150);


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

19. Gökyüzü Türlerinden Hangisi Kullanılmalı
Eğer zemini de gördüğünüz bir oyun bölümü hazırlayacaksanız SkyBox kullanmak en mantıklı seçim olacaktır. Terrain gibi zemini kapatabilecek bir modeliniz varsa SkyDome kullanabilirsiniz. Eğer etrafı dağlarla çevrili bir vadide veya yüksek duvarlara sahip bir kale avlusunda geçen bir oyun bölümü tasarladıysanız SkyPlane kullanmalısınız. SkyPlane ekran kartı işlemcisini yani GPU’yu diğerlerine göre oldukça az kullanır. Bu sayede GPU kullanımından tasarruf edebilirsiniz. Ayrıca, sahnenize sis efekti kurduğunuzda en güzel görünümü SkyPlane verir.

20. SİS
Sanal ortamda sis oluştururken bilmeniz gereken ilk şey, yeni bir görüntü oluşturmadığınızdır. Hayal etmesi biraz zor olacak. Sunum yapılan konferans salonlarını düşünelim. Projektörden perdeye yansıtılan görüntünün daha net görünmesi amacıyla konferans salonunda güneş ışığını engellemesi için oldukça koyu renkte perdeler vardır. Gündüz perdeler çekilerek sunum yapılır. Şimdi konferans salonunda pencerenin yanındaki bir koltuğa oturduğunuzu hayal edin. Salondaki tüm perdeler çekilmiş, ışıklar söndürülmüş ve sunum başlamış. Konferans salonunda sahne haricinde hafif karanlık loş bir hava var. Perdeyi alıyorsunuz ve bir küçük bir delik açıyorsunuz. Açtığınız delikten güneş ışığı içeri girecek ve belirli bir bölgeyi aydınlatacak.

Sanal ortamda kurduğumuz siste tıpkı böyledir. Viewport’un arkaplan rengini sahnedeki nesnelerin üstünde gösterir. Adeta render penceresinde delikler açıp sahneye Viewport’un arkaplan rengini sızdırırız. Peki, bu teknik detayı niye anlattık? Acayip sonuçlar almamak için arkaplan rengi ile sisin rengini aynı kurmak zorunda olduğumuzu belirtmek için anlattık.

OGRE’de iki sis türü vardır. Biri doğrusal sistir. İngilizce adı Linear Fog’dur. İkinci sis türü üstel sistir. Bunun İngilizce adı ise Exponential Fog’dur. Ek olarak, üstel sis iki alt tür destekler. Üstel sisin iki alt türünün farkı çok belirsizdir.



Anasayfa

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