天天看點

《Lua遊戲AI開發指南》一2.7 建立一個沙箱Lua腳本

本節書摘來異步社群《lua遊戲ai開發指南》一書中的第2章,第2.7節,作者: 【美】david young(楊) 譯者: 王磊 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

基本的沙箱程式就位之後,我們就可以建立沙箱的建立lua腳本了。首先在腳本檔案夾中建立一個sandbox.lua腳本。

像下面這樣建立一個lua檔案:

沙箱lua腳本必須實作4個全局函數供c++代碼調用,它們分别是sandbox_cleanup、 sandbox_handleevent、 sandbox_initialize和sandbox_update:

有了這些基礎的回調函數,就可以修改sandboxapplication類的lua代碼來建立沙箱了。

在修改任何c++檔案之後,别忘了重新編譯沙箱應用程式。

現在沙箱已經初始化好并且連接配接到了lua腳本,可以開始添加一些基本的幾何體和光照了。沙箱暴露給lua的函數中有一個createplane函數,它可以根據指定的寬度和高度建立一個平面網格,還會相應地建立一個實體半空間并添加到實體模拟中。

一個實體半空間是一個在x和z方向上無限延伸的平面。

建立好平面對象後,我們可以使用core.setmaterial函數來為它設定一個ogre材質。這個材質在media/materials/base.material中定義。

沙箱已經可以處理标準的漫發射、高光和法線貼圖材質類型。還可以在media/materials/ base.material檔案中添加新的材質。

在示例中,我們給新建立的平面賦予了名為ground2的ogre材質。

如果現在運作沙箱,你可能期待看到剛剛建立的平面,但實際上隻會看到一個全黑的螢幕。沙箱中如果沒有光照,即使建立了平面,你也看不到它。

沙箱中沒有光照的話,我們的平面是看不到的。沙箱的核心包提供了函數來建立燈光并設定其漫發射和高光顔色。core.createdirectionallight函數需要兩個參數:沙箱和光照方向向量。使用(1,-1,1)向量可以建立一個向斜下方照射的光源。

注意在使用vector.new(red,green,blue)函數設定光源漫反射和高光時,顔色值是大于1的。這使你可以調整發射光的強度。

現在我們有了一個光源,可以運作沙箱來檢視之前建立的平面了。使用滑鼠可以調整相機的朝向,隻需要按住滑鼠右鍵并拖動滑鼠到想要朝向的方向。也可以使用鍵盤的w、a、s和d鍵來控制相機在沙箱中漫遊。在按下w、a、s和d鍵的同時按住shift鍵,則可以大幅加快相機的移動速度。

看着無盡的黑暗不是一件有趣的事情。我們可以用sandbox.createskybox函數來建立一個天空盒。天空盒是由在ogre材質media/materials/skybox.material中指定的6張紋理來定義的。如果你還不知道天空盒是什麼的話,可以認為天空盒就是一個有6 個面的盒子,每個面上都有一張不同的紋理。當相機在沙箱中移動時,天空盒也會跟着移動,讓它看上去就像真實的天空一樣。

沙箱有多個天空盒材質。你可以在任意的文本編輯器中檢視skybox.material檔案,以了解其他可用的天空盒紋理,以及如何建立全新的天空盒材質。

sandbox.createskybox函數需要傳入3個參數:沙箱本身、ogre材質名和旋轉向量。旋轉向量的機關是角度,它的作用是在我們的天空盒上添加一個初始化的偏移量。在我們的例子中,我們把天空盒旋轉180度來配合之前建立的方向光源:

現在運作沙箱,你會看到一個飄着雲朵的天空和明亮的世界,如圖2-2所示。

《Lua遊戲AI開發指南》一2.7 建立一個沙箱Lua腳本

ogre網格在沙箱中隻是一個可見的幾何體,不包含任何實體表現。在沙箱中添加一個ogre網格隻需要調用core.createmesh函數,傳入ogre網格檔案的路徑和名稱。

分别使用core.setposition和core.setrotation函數設定網格的位置和旋轉:

旋轉函數的參數是一個角度向量,機關是度。例如,vector.new(0,45,0)将讓網格繞y軸旋轉45度。

如果你想讓一個ogre網格參與實體模拟,可以建立一個沙箱對象。sandbox.create object函數會為任何的ogre網格生成一個凸包,并讓它參與實體模拟。

由于為任意網格生成實體表現是在運作時進行的,複雜的網格會延長沙箱的加載時間。在内部實作中,bullet實體引擎會生成一個簡化的近似ogre網格的凸包網格,這兩個網格的頂點不是一一對應的。要記住,任何ogre網格的實體表現都隻是對原網格的近似而不是精确的複制。

現在,我們可以把之前建立的方塊網格轉換為真正的實體模拟對象了。

繼續閱讀