2015-02-12

【製作進度】3D技術研究1-引擎本體

(第一次在文章裡讓看板娘登場,看這種風格如何)
點此看看板娘介紹
(這篇同時發在巴哈姆特)

艾莉兒:大家好!這是我們第一次在文章裡演出,請各位多指教。
艾莉兒:那開始吧。主人想在下一個遊戲做一個改變:使用3D模型,我們必須追加3D的能力。
所以主人這幾天一直在幫我們升級,這次主人分享他的開發經過。




-1.載入模型檔-


檔案格式用PMD(MikuMikuDance的模型檔),它的構造幾乎就是按照Direct3D和OpenGL函式的需求,只要很少的轉換。
參考資料:PMD檔案格式
先只讀取頂點、index和材質,骨骼和IK沒有使用,現在先不做動態。

艾莉兒:先請Python姊姊解析裡面的資料。



艾莉兒:Python姊姊的報告來了
model name ちび霊夢GL ちび霊夢 Ver.G_L
……
vertexNum 20402
vertex 0.00 10.56 0.74 normal 0.01 0.70 -0.72 texture 0.54 0.14
vertex 0.07 10.55 0.75 normal 0.48 0.65 -0.59 texture 0.55 0.14
vertex 0.24 10.44 1.06 normal 0.99 -0.02 -0.11 texture 0.62 0.12
……
triangleNum 31460
triangle 13 1 9
triangle 12 13 9
triangle 15 0 1
……
material 25
diffuse 0.80 0.80 0.80 1.00 specular 1.00 0.10 0.10 0.10 ambient 0.50 0.50 0.50
toonNumber 6 edgeFlag 1 triangles 1034 fileName r_hair.bmp
diffuse 0.80 0.80 0.80 1.00 specular 6.00 0.10 0.10 0.10 ambient 0.50 0.50 0.50
toonNumber 6 edgeFlag 1 triangles 90 fileName r_cloth.bmp
……
艾莉兒:對人類來說很難懂吧,可是主人說要先了解構造才能繼續做,這樣也有個工具可以看模型的底細。

艾莉兒:再來才開始改造我。

(now coding)
弄好了,讀取模型並用printf輸出其中幾個數值看看。
艾莉兒:……(執行中)(顯示資料),主人,這樣對嗎?
有錯誤,要改一下。
(now coding)
再試試看。
艾莉兒:……(執行中)(顯示資料),現在呢?
好,OK了。

-2.坐標轉換和shader-

之前Cyber Sprite這個2D遊戲就用過矩陣和shader,對這方面並不陌生,但是寫3D程式還是第一次。
把書上和網路上看來的公式寫進去,「投影矩陣[2][2]=(zFar+zNear)/(zNear-zFar)」、「diffuse=法線與光源位置內積」等等的。
打光跳過per-vertex lighting,直接用per-pixel lighting。

艾莉兒,功能追加好了,試試看吧
艾莉兒:好,拿出剛剛載入的模型,看我的!


艾莉兒:總算秀得出東西了,可是我還不會用貼圖,只能先秀我算出的打光強度。

中間卡在一個地方,用OpenGL的glFrustum()算投影矩陣畫面會一片黑,卡了一陣子才發現glFrustum把Z>0視為鏡頭背後,Z<0才在鏡頭前面(即右手坐標系),而我把模型位置Z坐標設為正值。因為想配合PMD的左手坐標系,只能自己算矩陣而不能用OpenGL的函式。
艾莉兒:還有一次開啟depth test畫面也變一片黑,結果是沒幫我配置Z buffer。
嗯,是啊,很多細節是慢慢試才弄對。

-3.貼圖-

首先做個準備,這兩個模型原本的貼圖是BMP和TGA,但艾莉兒能用的是PNG和JPG,所以要把圖檔轉成PNG,並且修改模型檔裡的貼圖檔名(再寫一個Python程式)。
艾莉兒:讀PNG以前就做過,沒問題,幫我改一下shader就好了。


艾莉兒:看起來比較完整了,可是主人還想改一個地方。

-4.修改材質-

這一步用PMXEditor做,修改一些材質的ambient顏色。
艾莉兒:對了,Patchouli的袖子為什麼凹下一塊?
我看看……,有一個頂點的法線有錯,改一下。


我寫了兩種打光演算法,來試試看。
艾莉兒:好的。



艾莉兒:顏色好看多了,不是灰壓壓的。
這來自我畫圖的經驗,暗處不能單純降低明度,彩度和色相也要調整,這裡把皮膚和衣服的ambient設成偏紅,頭髮也有調整,改變材質在暗處的顏色。
艾莉兒:原來畫圖技術也能用在寫程式。

測試用的模型檔
靈夢
Patchouli
分別是3萬多和5萬多面,其實不適合用在遊戲裡。
艾莉兒:對呀,處理這麼多面,這麼多材質的模型好累。



艾莉兒:新招完成啦,不管什麼模型矩陣打光儘管來吧!
艾莉兒:咦,你問鈷寶哪裡去了?沒錯,這次先做引擎本體,也就是我的部分。
主人接著要研究輔助工具,到時候就換鈷寶表現了。

鈷寶:嗯,再來就輪到我了。

下一步是研究編輯模型的軟體,有需要的話自己做輔助工具,把整個生產線架出來。

沒有留言 :

張貼留言