前面我介紹了一下netObject類,這篇文章我主要介紹它的子類SceneObject,另外兩個子類Sun和MissionArea比較簡單。在這裡就不多介紹了。從名字就可以看出,SceneObject主要是指情境對象類,包括情境中的天空盒、地形、建築、人物、交通工具、水體等。SceneObject class 在TGE中主要提供了以下幾個功能:1、每個該類對象建立之後都會加入到一個scene graph中。引擎可以通過scene graph高效率的進行物體渲染,用的是BSP演算法。2、提供了一些非常重要的輔助函數,例如設定(擷取)位置、速度、碰撞盒、大小、重量等函數。3、給物體提供了光照。4、提供了碰撞檢測。
一、碰撞檢測
在遊戲中,我們經常需要用到碰撞檢測。例如我們用槍發射一枚子彈,就必須利用碰撞檢測來檢查子彈是否擊中了敵人。在TGE中使用containerRayCast函數來進行檢測。基本原理是:引擎有一個全域的碰撞盒容器,每個sceneObject被建立的時候,不僅會被加入到scene graph進行渲染,而且會被加入到一個碰撞盒容器中,物體的碰撞盒是從模型中解析的。當我們用槍發射子彈時,實際上是在碰撞盒容器中產生一條射線。再利用線面相交檢測演算法,檢測到哪個面最先與射線先交,從而得知該射線所碰撞到的物體。順便說一句,TGE中做一次containerRayCast是很耗計算資源的,特別是在大情境中。所以能不用盡量不要用這個函數。另外TGE中還是先了碰撞盒與碰撞盒的碰撞檢測,具體的實現方法就不多說了。
二、輔助函數
SceneObject給指令碼提供了一些輔助函數,例如getObjectBox(擷取局部座標系下的碰撞盒)、getWorldBox(擷取全局座標系下的碰撞盒)、getForwardVector(獲得向前的速度)、getTransform、getPosition、setTransform、getScale等。利用這些函數我們可以在指令碼中對遊戲對象進行基本的變換,包括對象的位置、朝向、大小等。
三、情境渲染
TGE的渲染流程:GuiTSCtrl::onRender(主介面渲染、每幀調用一次) ——》EditTSCtrl::renderWorld(渲染情境)——》SceneGraph::renderScene(情境樹渲染)———》sceneObject::renderObject(每個物體渲染)。遊戲的每次渲染首先是由主介面發起,然後調用用戶端的全域SceneGraph進行情境渲染,在SceneGraph會根據攝像機的視角進行裁剪,最後再進行單個物體的渲染。每個SceneObject的子類都要重寫renderObject函數。