Sayfalar

1 Eylül 2010 Çarşamba

ogre3D ve temel sınıflar ve dosyalar – bölüm 1

Daha önceki “Ogre3D’deki İlk Projemizi Anlamlandirma” başlıklı yazımda da anlattığım gibi Code::Blocks’da yeni bir Ogre projesi oluşturduk ancak bu projemizde herhangi bir değişiklik yapmamıştık.Çünkü daha temel sınıfların ve dosyaların ne işe yaradığından bahsetmedik. Şimdiki yazımda da bu konuya değinmek istiyorum.

Bize herşeyden önce “Ogre.h” adlı dosyamız lazım. Bu sınıf içerisinde diğer “header” dosyalarını “include” etmektedir. Bu sayede “Ogre.h” dosyamız bizim en temel header dosyamızdır.

“OgreRoot.h” dosyasaında tanımlı olan Root sınıfı bu yapının en temel kök dizinini oluşturur. “Root *mRoot;kod satırı sayesinde bu sınıfımızdan bir değişken üretmiş olacağız. Bu kök dizini mantığını iyice dallanmış bir ağaç gibi düşünebilirsiniz. Zira mRoot bizim köklerimiz olurken Plugin‘ler ve Config‘ler ile beslenmektedir. Scene Manager‘ımız ise bizim ağacımızın gövdesi olurken dallarımız yerine de Scene Node‘lar gelmektedir. Scene Node‘lar da Entity‘leri tutmaktadırlar.

Şimdi bu yukarıda gördüğünüz sınıflar ile daha fazlasına ve bazı fonksiyonlara sırasıyla el atalım.

İlk önce ağacımızın gövdesi olan sınıf yapısına bakalım, yani Scene Manager‘a. “OgreSceneManager.h” dosyasında bulunan bu sınıf için, sahneye eklenecek olan tüm nesneleri tutan ana yapıdır diyebilirim sanırım. “SceneManager* mSceneMgr; kod satırı ile sahnemizin yöneticisi olan sınıfımızdan bir değişken üretmiş oluruz.

“OgreEntity.h” dosyasında bulunan sınıf olan Entity sınıfı bizim mesh ( model ) dosyalarımızı tutacak olan sınıftır. Ancak Entity sadece modeli tutmakla yetinir. Ne onun boyutuna karışır ne konumuna ne de başka özelliklerine. Ancak bazı özellikleri için modelimizin Entity özellikleri bize lazım olacaktır. “Entity *mEntity;kod satırı ile bu sınıftan bir değişken üretmiş olacağız.

Şimdi modelin bahsettiğim konum ve boyut özelliklerini ayarlayacak olan sınıfımıza geldi sıra. O da “OgreSceneNode.h” dosyasında bulunan “Scene Node” sınıfımız. Bu sınıftan “SceneNode *mSceneNode; kod satırı ile üreteceğimiz değişkeni Entity‘den ürettiğimiz değişkene bağla diyerek modelimizi tutan mEntity değişkenini mSceneNode değişkenine bağlamış oluyoruz. Bu bağlama işlemi ise şu şekilde yapılmaktadır: “mSceneNode->attachObject(mEntity);

Buraya kadar herşey tamamsa şimdi hoş bir özelliği sağlayacak olan sınıfa geldi sıra. Şöyle ki; ekranı isterseniz birden fazla parçaya bölebilir ve bölünen ekranlara da istediğiniz kameranın görüş açısını ekleyebilirsiniz. Ancak bütün bunlar için bize “OgreRenderWindows.h” dosyasında bulunan “RenderWindow” sınıfı lazım. “RenderWindow* mWindow; satırı ile ihtiyacımız olan değşkenimizi üretmiş olacağız.

“Camera” sınıfı tahmin edebileceğiniz gibi kameraların sınıfıdır ve bu ” Camera* mCamera; “ kod satırı ile bir adet kamera üretilmiştir. Ama bu kamera henüz bir sahneye veya nesneye bağlanmış konumda değildir. Ancak tamınlanmış standart ayarlar geçerlidir. Örneğin konumu X,Y,Z olarak sıfırdır.

Sahnemizin ışığını oluşturacak olan sınıfımız da tahmin edebileceğiniz gibi “OgreLight.h” dosyasında bulunan “Light” sınıfıdır. “Light *mLight;şeklinde bir ışık değişken üretilebilir. Bir önceki yazı olan Ogre3D’deki İlk Projemizi Anlamlandırma adlı yazıda ışığın temel fonksiyonlarından setDiffuseColour()” ve “setSpecularColour()” dan bahsetmiştim ancak ışık türünden bahsetmemiştim. Işığımızın üç farklı tipi var. Bunlardan “LT_POINT” değişkeni her tarafa ışık yayabilen bir kaynak niteliği kazandırmaktadır bizin ışık nesnemize. “LT_SPOT” değişkeni ışığımızı bir spot ( koni misali giderek büyüyüen ) ışık haline döndermektedir. “LT_DIRECTIONAL” değişkeni de doğrulusu ve yarıçapı değişmeden ilerleyen bir ışık kaynağına dönüştürür. Son iki tip için de el feneri misali ışık kaynağının baktığı bir yer olması gerekmektedir. Bu da kamera ve ışık için de geçerli bir fonksiyon olan lookAt() fonksiyonu sayesinde olmaktadır. Bu fonksiyonu yazının devamında anlatacağım.

Ogre ekibi Double tipinde “Real” adı altında kendi değişken tipini tanımlamışlar. Sürekli olarak Real tipinde değişkenler üretildiğini görebilirsiniz ki bende alıştım açıkcası bu tipi kullanmaya

“OgreVector3.h” dosyasında bulunan Vector3 sınıfı da oldukça kullanışlı bir sınıftır. Vector3 sınıfından üretilebilecek bir değişkenin X,Y ve Z şeklinde alt parametreleri de bulunur. Örneğin “Vector3 yeniDegisken; diye bir değişken ürettiğimizde ” yeniDegisken.x=100; yeniDegisken.z=50; demek ile bu vectörün konumunu belirten konuma (” X=100, Y=0, Z=50 “) çekmiş olduk. Ancak Vector3 sınıfından değişken üretmek yerinde yeri geldiğinde ” Vector3(100,0,50) ” şeklinde de kullanmak da tercih edilebilir.

Herşeyden önce dikkat edilmesi gereken bir nokta olarak bahsedyorum, sınıflardan değişken üretmekten ibaret değildir olay. Önemli olan üretilen değişkenlerin ayarlarını yapabilmek ve bu değişkenlere bağlanacak nesneleri ayarlamak ve de onların konumlarını doğru belirleyebilmektir.

Şimdilik bu temel sınıflar iş görür niteliktedir. Sırada bazı temel fonksiyonlarda sıra.

yaw(), pitch() ve roll() fonksiyonları ilk anlatacağım fonksiyon serisi olacaktır. Bu fonksiyonlardan her biri kendine ait olan eksen etrafında nesneleri döndermektedirler.

yaw(Degree(90)); örnek kodunda da görebileceğiniz gibi Y ekseninde 90 derece döndürmüştür. Degree sınıfı ile Radian sınıfı bu fonksiyonlar için parametrelerinde düzenleme yapmanızla uğraşmamanız için varlar. Bu sınıfları ister değişken üretmek için isterseniz de fonksiyon olarak kullanabilirsiniz. Modeli çevirme işlemi bahsettiğim gibi SceneNode’dan ürettiğimiz değişken üzerinden gerçekleşir. Örneğin şu şekilde; “mSceneNode->yaw(Degree(-270));

Nesneleri ölçeklendirme işlemi ise yine SceneNode‘a etkiyen scale(X,Y,Z) fonksiyonu ile gerçekleşir. Parametre olarak 1 girildiği zamna ölçeklendirmede herhangi bir değişiklik olmaz çünkü 1 orjinal boyutu temsil eder. sıfır ve üstü değerleri parametre olarak alabilir. Örneğin “mSceneNode->scale(15 , .5 , 2.86f ); şeklinde parametreler alabilir. Model belirtilen eksende parametre olarak verilen sayı kadar büyür.

Nesnelerin konumunun ayarlanmasını ise iki fonksiyon ile gerçekleştirilebilir. Bunlardan birisi “translate“, diğeri de “setPosition“‘dur. “translate” parametre olarak verilen değer kadar ilerletirken “setPosition” parametre olarak verilen konuma nesnemizi yerleştirir. Örneğin;

  • mSceneNode ->translate(Vector3( 350, 15, 550 ));
  • mSceneNode->setPosition( yeniDegisken.x, 20, yeniDegisken.z );

Şimdi konum belirledik ölçeklendirme yaptık ancak söz konus nesnemiz bir kamera olursa işler biraz daha farklılaşabiliyor. Zira bir kameranın konumu kadar baktığı yeri de önemlidir.Bu duruma çözüm olacak olan fonksiyon da lookAt(X, Y, Z) fonksiyonudur. Örneğin;

mCamera->setPosition( 300,500,400);
mCamera->lookAt(0,100,0);

Şeklinde bir ayarlama yaptığımızı düşünüysek kamerayı 300(X) – 500 (Y) – 400 (Z) konumuna getirdik ve bu kameranın orjinden uzaklığı bu sayede 500√2 br uzakta oldu. Ancak orjinden 100br yukarı bakacak şekilde ayarlandı.

“mSceneMgr->setAmbientLight(ColourValue(1, 1, 1)); kod satırı sayesinde ortamın ışığı ayarlanmaktadır. parametre olarak girilen değerler 0-1 arası değişen değerler olmakla birlikte 1 varlığı 0 yokluğu temsil etmektedir. örnekte RGB tonlarının hepsine 1 değeri parametre olarak girilmiş. Bu durumda ortam aydınlık olacaktır ancak 0 olduğu taktirde ortam zifiri karanlık olacaktır.

Evren tipi olarak standart Code::Blocks Ogre3D projesinde setSkyBox() fonksiyonu kullanılmaktadr. Temelde üç farklı seçenek söz konusudur yine daha önce bahsettiğim gibi. Bunlar:

  • mSceneMgr->setSkyDome(true, “Examples/CloudySky”);
  • mSceneMgr->setSkyBox(true, “Examples/CloudySky”);
  • mSceneMgr->setSkyPlane(true, “Examples/CloudySky”);

SkyBox evreni, temelinde iç yüzeyi boyalı bir kutudan ibarettir. Ancak biz bu kutunun tam orta noktasında yer almaktayız.

SkyDome yine aynı mantıkla çalışmaktadır ancak bu sefer şekil üst yarım küre şeklindedir.

SkyPlane‘de ise durum biraz daha ilginçleşir. Bu bildiğiniz bir düzlemden ibarettir ve özel durumlar çerçevesinde kullanılmak mantıklıdır. Nedir bu özel durumlar dersek; Örneğin derin bir kuyudan yukarı baktığımız zaman gördüğümüz bulutlar buna örnek olabilir. Çünkü kuyudayken bizim için altımızda ne olduğu önemli değildir veya etrafımızda… Önemli olan üst tarafımızda gördüğümüzdür.

Şimdilik temel sınıflar ve fonksiyonlar için anlatabileceklerim bu kadar. Bu yazı serisinin devamında “ExampleApplication.h” sınıfını ele alacaktır.

Hiç yorum yok:

Yorum Gönder