Panda3D ile yaptığımz 3Boyutlu bir uygulamada eğer kameraya bir görev vermezsek kamera yaptığımız ortamda fareyle serbest dolaşabilir.Örneğin araba yarışı oyunu yaptığımız zaman kameranın sürekli arabayı takip etmesini sağlmalıyız, aksi taktirde oyuncu arabayı göremeyecektir.Kameramızın hareketlerini görebilmek için ilk önce Panda3D ye kendi modellerinden olan “environment”ı ekliyoruz.import direct.directbase.DirectStartfrom direct.task import Taskfrom direct.actor import Actorenviron = loader.loadModel(“models/environment”)environ.reparentTo(render)run()
Basit bir çevre oluşturduk. Şimdi sıra geldi kameramızı sabitlemeye. Bilmemiz gereken şey şudurki kameraya görev vermediğimiz anda yine serbest dolaşma moduna geçecektir.Bu yüzden onu bir döngüye sokacağız ve sabitleyeceğiz.def kamera(task):base.camera.setPos(0,0,0) #setPos ile x,y,z koordinatlarını belittikbase.camera.setHpr(0, 0, 0) #setHpr ile açısını belirttikreturn Task.cont #fonksiyonumuzu tekrar çalışması için ayarladıktaskMgr.add(kamera, “kamerayi sabitle”) #kamera adlı fonksiyonun bir defa çalışmasını sağlıyoruz
taskMgr ile aslında daha çok şey yapılabilir ama biz burda sedece fonksiyonu bir kere çapırmayı göreceğiz.Peki neden direk “kamera()” diye fonsiyonu çağırmadık ve “while” ile döngü kurmadık diyecek olursanız, işte şu yüzden;pythonda bir fonksiyonu çağırırsak o fonsiyon bitene kadar fonksiyondan sonrasını çalıştırmaz.Biz while ile sonsuz(biz-durdurmadığımız-sürece) bir döngü kurarsak fonksiyon hiç bitmez. Yani Panda3D yi başlatan “run()” fonksiyonuna asla sıra gelmez.taskMgr ise ana programdan bağımsız olarak bir fonksiyon çalıştırabilir.Peki taskMgr ile ana programdan bağımsız bir fonksiyon yaptık, neden fonksiyonun içinde while kullanmadık derseniz;Çünkü oyun içinde kamera ayarlarımızı değiştirdiğimiz zaman while döngüsü bunu göremeyecektir. Hatta while döngüsü okadar feci şekilde işlemciye abanacaktırki oyun başlatılamayacaktır.Şimdi kameramızda biraz değişiklik yapalım; örneğin sol ok tuşuna bastığımız zaman kameramızı sol doğru döndürelimcamera_derece_x=0 #kameranın x eksenindeki derecesidef kamera(task): #kameramızın sabitlenme fonksiyonubase.camera.setPos(0,0,0)base.camera.setHpr(camera_derece_x, 0, 0) #burada xderecesiyle bütünleştirdikreturn Task.conttaskMgr.add(kamera, “kamerayi sabitle”)def soltus():global camera_derece_x#global değiştek diyerek değerimizi fonksiyon dışındada değiştirebilirizcamera_derece_x+=10base.accept(“arrow_left”,soltus) #sol ok tuşuna basıldığında soltus() fonksiyonunu çalıştır
Artık sol tuşa basıldığında kameramız dönüyor. Bunu diğer tuşlarada uygulayabilirsiniz. Unutmayın 3Boyutlu dünyamızda üç fakrlı eksen, bu üç faklı eksenide farklı dereceleri olabilir