Write Your Own 3D Engine (4) Chapter 4. 畫一隻猴子

前幾章在定義一個立方體,或是一個三角形時,每個點的座標都是手動寫死在程式裡的。對像立方體的八個點,或三角形的三個點這些當然沒問題,但是比較精細的物件模組,都是上千上萬個點與面的,只用手工打造實在很不符合人性。

免費開源的 3D 模組軟體最有名的是 Blender,這章會利用 Blender 做一隻猴子,然後將所有的點的座標輸出為 Json 格式,再用我們自己做的 3D 引擎畫出來。

Blender 可以在此處下載,安裝完成後,需要再下載一個 json exporter,我用的是這個 https://github.com/nathanfaucett/Blender-JSON-Exporter,使用方法就是下載整個 io_mesh_json 目錄,然後連同目錄名一起複制到 Blender 的 scripts\addon 下面。 我使用的是 2.79 版,所以路徑是 C:\Program Files\Blender Foundation\Blender\2.79\scripts\addons

安裝好了就執行吧,預設的畫面如下。

就是一個立方體。接下來我們要開始畫猴子了,以 Windows 系統來說,在物件上點滑鼠右鍵是選取,請選取中間的立方體,點鍵盤的 Delete 鍵,點確定,先把這個立方體刪除。

接下來,點畫面最左邊,從上面算下來的第二個直立的、寫著 “Create” 的書籤,會看到很多預設的基礎物件,包括了平面、正方體、多角柱體、圓型等等,中間偏下有個 “Monkey” 的物件,點它一下。

如果你刪除立方體後沒有亂點其他東西,猴子就會出現在三條軸線的正中心原點。如果很遺撼的猴子不在正中心,選取猴子拉到正中心吧。順帶一提,滾動滑鼠輪子可以拉進拉遠,按住 Shift + Alt 再滾動滑鼠輪子可以轉視角。

猴子畫好啦 (kind of… XD),如果你剛剛有將 json exporter 安裝好,點左上方的 File、Export、JSON (.json) 輸出成 Json 格式吧。我輸出的檔名叫 monkey.json,可以在 github 裏找到,不過這麼簡單的東西自己做一個吧,把 Blender 用到出神入化的話連自己做一個 Disney 水準的 3D 動畫都不見的不可能呢 (如果你時間多到用不完的話)。

如果你不知道什麼是 JSON,可以用 Notepad++ 或其他文字編輯器打開 monkey.json 看一下。money.json 有好幾個 array,其中跟這章有關的只有 vertices 這一項。

{
  "vertices": 
    [0.46875, -0.757812, 0.242188, 
     0.5, -0.6875, 0.09375, 0.5625, 
     -0.671875, 0.242188, -0.5 ...],   
  ...
}

vertices array 中的符點數字每三個為一點,而每三個點為一個三角形,所以我們在讀取時就一組九個數字連續讀進來的湊一堆三角型就可以了。

理所當然的,C++ 標準函式庫中沒有 JSON 工具,還好外面到處都是,連我自己都有寫一個,JsonW – C++ Wide Character Json Tool 。要用誰的都行,不過我只愛用自己寫的,整個 Library 只有單一一個 header file,沒有 source file,直接 include 進來就能用,連 makefile 都不用動,方便的呢,哈哈。

C++ 實作

先寫一個叫 mesh 的 c++ class 用來放一個物件的所有三角形,在 init() 裏面有用到我說的 Json tool。

unittest.cpp 中的 Sample_3 是使用 mesh 的相關測試。

對 Y 軸旋轉的猴子出現啦!

為什麼只畫線不填滿呢? 因為下一篇才會開始說明如何處理光線啊,如果只是利用上一章說的把所有的三角形全部塗成白色,畫面上只會有一整塊白色讓你根本看不出是沱什麼東西。想要有個像大理石像般美麗的猴子? 看下一章吧!

對了,順帶一題,有發現程式開始變慢了嗎? 有的話關掉 Debug mode 用 Release mode 編程式吧。如果變慢指的是讀取 monkey.json 要花個 1.x 秒,那沒辦法,玩 game 時那長長的 loading time 是有他的原因的。