18. Şimdi de ölçekleme işleminden bahsedelim. Bu işlemi scale *ölçekle+ fonksiyonuyla yapacağız. scale fonksiyonu da 3 boyutlu vektör kullanıyor. Fakat bu sefer X, Y, Z hanelerindeki değerleri koordinat olarak düşünmeyin. Bu sefer bunlar nesnemizin boyutunun kaç kat büyültüleceğini/küçültüleceğini belirliyor. scale fonksiyonu da tıpkı: attachObject, translate, pitch, yaw, roll ve resetOrientation fonksiyonları gibi SN sınıfının üye fonksiyonudur. Kodlarımız şöyle:
// Objelerimizi ölçekliyoruz:
ogreBasi4->getParentSceneNode()->scale(Ogre::Vector3(2, 2, 2));
ogreBasi5->getParentSceneNode()->scale(Ogre::Vector3(3, 3, 3));
ogreBasi6->getParentSceneNode()->scale(Ogre::Vector3(0.5, 0.5, 0.5));
createScene fonksiyonunun tümü:
void Ders1::createScene(void)
{
// Ambient light'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
// Bir ışık kaynağı oluşturuyoruz ve konumunu ayarlıyoruz:
Ogre::Light* ilkIsik = mSceneMgr->createLight("AnaIsik");
ilkIsik->setPosition(20,80,50);
// Entity, SceneNode oluşturuyoruz ve SceneNode’yi Entity’e bağlıyoruz:
Ogre::Entity* ogreBasi = mSceneMgr->createEntity("Bas1", "ogrehead.mesh");
Ogre::SceneNode* basDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu1");
basDugumu->attachObject(ogreBasi);
// İkinci objemizi tanımlıyoruz:
Ogre::Entity* ogreBasi2 = mSceneMgr->createEntity("Bas2", "ogrehead.mesh");
Ogre::SceneNode* basDugumu2 = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu2", Ogre::Vector3(100, 0, 0));
basDugumu2->attachObject(ogreBasi2);
// İlk Ogre başını kaybediyoruz.
ogreBasi->setVisible(0);
// İlk Ogre başını görünür yapıyoruz.
ogreBasi->setVisible(true);
// Üçüncü objemizi oluşturuyoruz:
Ogre::Entity* ogreBasi3 = mSceneMgr->createEntity("Bas3", "ogrehead.mesh");
Ogre::SceneNode* basDugumu3 = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu3");
basDugumu3->attachObject(ogreBasi3);
// ogreBasi3 nesnesi üzerinden onun bağlı olduğu SceneNode’sine ulaşıyoruz ve konumlandırma yapıyoruz:
ogreBasi3->getParentSceneNode()->translate(Ogre::Vector3(-100, 0, 0));
// ogreBasi3 nesnesini yeniden konumlandırıyoruz:
basDugumu3->translate(Ogre::Vector3(75, 0, 0));
// Dördüncü objemizi oluşturuyoruz:
Ogre::Entity* ogreBasi4 = mSceneMgr->createEntity("Bas4", "ogrehead.mesh");
Ogre::SceneNode* basDugumu4 = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu4", Ogre::Vector3(0, 100, 0));
basDugumu4->attachObject(ogreBasi4);
// Beşinci objemizi oluşturuyoruz:
Ogre::Entity* ogreBasi5 = mSceneMgr->createEntity("Bas5", "ogrehead.mesh");
Ogre::SceneNode* basDugumu5 = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu5", Ogre::Vector3(-100, 100, 0));
basDugumu5->attachObject(ogreBasi5);
// Altıncı objemizi oluşturuyoruz:
Ogre::Entity* ogreBasi6 = mSceneMgr->createEntity("Bas6", "ogrehead.mesh");
Ogre::SceneNode* basDugumu6 = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu6", Ogre::Vector3(100, 100, 0));
basDugumu6->attachObject(ogreBasi6);
// Son oluşturduğumuz üç Entity'mizi döndürüyoruz:
ogreBasi4->getParentSceneNode()->pitch(Ogre::Degree(90));
ogreBasi5->getParentSceneNode()->yaw(Ogre::Degree(90));
ogreBasi6->getParentSceneNode()->roll(Ogre::Degree(90));
// Objelerimizin dönme ayarlarını sıfırlıyoruz:
ogreBasi4->getParentSceneNode()->resetOrientation();
ogreBasi5->getParentSceneNode()->resetOrientation();
ogreBasi6->getParentSceneNode()->resetOrientation();
// Objelerimizi ölçekliyoruz:
ogreBasi4->getParentSceneNode()->scale(Ogre::Vector3(2, 2, 2));
ogreBasi5->getParentSceneNode()->scale(Ogre::Vector3(3, 3, 3));
ogreBasi6->getParentSceneNode()->scale(Ogre::Vector3(0.5, 0.5, 0.5));
}
Kodlarımızı derleyip çalıştırın. Uygulamamızın yeni halini inceleyin.
19. createScene fonksiyonunun içindeki her şeyi siliyoruz. Yerine, bir tane E tanımlanmış olan şu kodları yazıyoruz:
void Ders1::createScene(void)
{
// Ambient light'ımızı kuruyoruz:
mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
// Bir ışık kaynağı oluşturuyoruz ve konumunu ayarlıyoruz:
Ogre::Light* ilkIsik = mSceneMgr->createLight("AnaIsik");
ilkIsik->setPosition(20,80,50);
// Entity, SceneNode oluşturuyoruz ve SceneNode’yi Entity’e bağlıyoruz:
Ogre::Entity* ogreBasi = mSceneMgr->createEntity("Bas1", "ogrehead.mesh");
Ogre::SceneNode* basDugumu = mSceneMgr->getRootSceneNode()->createChildSceneNode("BasDugumu1");
basDugumu->attachObject(ogreBasi);
}
20. Şimdi SN’lerde anne-çocuk(parent-child) ilişkisine farklı bir örnek vereceğiz. Normal şartlarda E’ler için oluşturduğumuz SN’leri SM’ın SN’sine bağlıyorduk. Yukarıda geçen tüm kodlarımızda da tüm SN’leri mSceneMgr nesnesinin SN’sine oluşturduk. Şimdi farklı bir işlem yapacağız. Yeni tanımlayacağımız E’yi SM’ın SN’sine oluşturmak yerine ogreBasi nesnesinin SN’sine oluşturacağız. ogreBasi nesnesinin SN’si anne, yeni E’mizin SN’si çocuk olacak. Ayrıca, yeni oluşturduğumuz SN’nin konumu X ekseninde 200. birim olacak. Kodlarımız şu şekilde:
// İkinci objemizi ilk objemize üye olarak tanımlıyoruz:
Ogre::Entity* ogreBasi2 = mSceneMgr->createEntity("Bas2", "ogrehead.mesh");
Ogre::SceneNode* basDugumu2 = basDugumu->createChildSceneNode("BasDugumu2", Ogre::Vector3(200, 0, 0));
basDugumu2->attachObject(ogreBasi2);
21. ogreBasi nesnemizi Z ekseninde 45 derece döndürelim. ogreBasi2 nesnesinin SN’si onun çocuğu olduğu için, onun dönmesinden o da etkilenecek. 16.maddede de dediğimiz gibi ister “basDugumu->…” yoluyla ister “ogreBasi->getParentSceneNode()->…” yoluyla SN’ye ulaşıp aynı işlemi yapabiliyoruz. İstediğiniz yolla yapabilirsiniz:
// İlk objemizi Z ekseninde 45 derece çeviriyoruz:
ogreBasi->getParentSceneNode()->roll(Ogre::Degree(45));
Kodlarımızı derleyip çalıştırın. Uygulamamızın yeni halini inceleyin.
C. FONKSİYON TANITIMI
1. Entity Sınıfının Bazı Üye Fonksiyonları
-setVisible (kurGörünürlük) *10. ve 11. maddeler+ : E’nin sahnede görünüp, görünmeyeceği belirlenir. Boolean değişkeniyle çalışır.
- getParentSceneNode (alAnneSahneDüğümü) *13., 16., 17., 18. ve 21. maddeler+
E’nin bağlı olduğu SN’ye ulaşmamızı sağlar.
2. SceneNode Sınıfının Bazı Üye Fonksiyonları
-createChildSceneNode (oluşturÇocukSahneDüğümü) *4., 9., 12., 13., 15. ve 20. maddeler+
Anne SN’ye bağlı bir çocuk SN oluşturur. Formatı createChildSceneNode(isim, vektör3) şeklindedir. Vektör3 ile konum belirlenirken anne SN temel alınarak konum belirlenir.
- setPosition (kurKonum) [7.madde]
Düğümün, yani SN veya örneğimizdeki Light’ın Node’sinin konumunu kurar. X, Y ve Z değişkenleriyle çalışır. Formatı “…->setPosition(X, Y, Z)” şeklindedir. X, Y, Z değişkenleri Real türündedir.
- translate [12., 13. ve 14. maddeler]
Konumu taşımaya yarar. Formatı “…->translate(X, Y, Z)” şeklindedir. X, Y, Z değişkenleri Real türündedir.
- scale (ölçek) *18. madde+
E’leri boyutlarını büyütüp/küçültmeye yarar. Ölçekleme işlemi yapar. 3 boyutlu vektör ile çalışır. Vektörün parametreleri bu sefer kaç kat ölçeklendirileceğini belirtir. Eğer vektör (1, 1, 1) şeklinde yazılırsa, nesne’ye herhangi bir ölçeklendirme işlemi uygulanmaz. 1’den daha büyük değerlerde nesne büyütülürken, 1’den daha küçük değerlerde nesne küçültülür.
-pitch (fırlatma) *16.madde+
SN’yi X ekseninde döndürür. “Degree(açı)” ile çalışır.
- yaw (sapma) [16.madde]
SN’yi Y ekseninde döndürür. “Degree(açı)” ile çalışır.
- roll (yuvarlama) [16.madde]
SN’yi Z ekseninde döndürür. “Degree(açı)” ile çalışır.
- resetOrientation (yenidenKurYönlendirme) *17.madde+
Yapılan tüm döndürme işlemlerini sıfırlar.
- attachObject (bağlaNesne) *5., 9., 12., 15. ve 20. maddeler+
E’i SN’ye bağlar.
D. BİTİRKEN
Bu dersi bilerek, uzun hazırladık. Genel olarak tüm OGRE yapısı, Entity ve SceneNode sınıflarının ilişkisine dayanıyor. Bundan sonra öğreneceğiniz yeni fonksiyonlar ya döngülerden bahsedecektir ya da bu iki sınıfa benzer fonksiyonlar alacaktır.
Daha ilk ders olduğu için fonksiyon tanıtımları bölümünü kısa tuttuk. Bu bölümü iyice kavramanızı tavsiye ederiz. Fonksiyon Referansları bölümünde bu dersle ilgili fonksiyonlara daha detaylı değindik. Genişletme Bölümü’nde ise OGRE’nin çalışma ortamıyla ilgili bilgiler verdik.