1. 程式人生 > >雲風的 BLOG: 用 2d 縮放及斜切變換模擬斜視角下的旋轉

雲風的 BLOG: 用 2d 縮放及斜切變換模擬斜視角下的旋轉

我對牆壁的旋轉很感興趣,一開始以為是預渲染了若干張圖。後來試著解開了 .kwad 資源包(可自行 google 到工具)發現裡面的資源圖片只有一或兩張。ps. 圖片是用 zlib 壓縮過的 RGBA 點陣圖,格式也可以 google 到。

以門為例,只有正面(或背面)的矩形圖片。想來是在引擎中變形為斜視角下需要的平行四邊形。

我簡單推導了一下變換矩陣,需要一點初中平面幾何知識就夠了。

以 30 度傾角為例,x:y 大約是 2:1 。所以斜切變換時的轉角是 arctan(tan(x)/2) 度,變換矩陣為 [1, tan(x)/2, 0 , 1, 0, 0 ]

另外需要先在 x 軸上做一個縮放,縮放比為 cos(x) 。

雖然 tan 在 90 度時會變成無窮大,但是兩個矩陣相乘後,tan 函式消失了,變成了 sin 。最終的變換矩陣為:

[cos(x), sin(x)/2 , 0, 1, 0, 0 ]

我從 Invisible Inc 的資源包裡解了一張門的圖片如下:

wall.png

我們可以用 css 的 transform 給一個變換矩陣 style="transform: matrix(0.707, 0.3535, 0,1,0,0);" ,模擬在 30 度傾角下,旋轉 45 度的效果:

wall.png

當然,因為這個是仿射變換,沒有透視,所以還是會有些怪怪的。

最後,Invisible Inc 是個相當不錯的遊戲,推薦。

創意工場裡有中文 Mod ,但是版本比較老,不推薦。如果想用需要自己改一下。

有兩個問題:

  1. 遊戲的排版引擎是靠空格分詞折行的,漢化 mod 製作的同學不清楚這點,為了避免長句子後半截斷了,結果把字型調的特別小,看起來很難受。其實只需要在長句子的每個漢字後加個空格就可以解決分行的問題了,這個寫個指令碼處理一下翻譯文字即可。另外,字型檔要重新做一下。

  2. 遊戲之前的格式化串是用的 C 風格,比如用 %d 替代執行時要插入的數字。但是最新的引擎改成用 {1} 引用第一個引數,{2} 引用第 2 個引數這樣的了,所以在漢化 mod 用於最新版時,會出現大量 第 %d 天這樣的文字,看不到數字,很乾擾遊戲。需要自己重新在 credit 介面按 ctrl insert, 彈出控制檯,輸入 localize 重新匯出一份文字改一下。

以上我過年在家臨時改了一份,上班後沒帶過來,懶得重新弄了。本來遊戲就不太需要漢化就可以玩的。

ps. 為什麼遊戲引擎要修改文字格式化方案呢?這是因為在不同語言中,單詞的次序可能是不一樣的。在英語裡,說的是 A 導致 B ,換到中文(或其他語言) 中,可能表述方式變成了 B 被 A 導致。兩個詞的次序就反了。如果用 C 風格的格式化,依賴引數傳遞次序,翻譯就亂了。(我簡單校對了一下原來的漢化文字,就有這種亂序錯誤)

另外,升級後的格式化方案還可以對輸入引數做多次引用,以解決一些語言中詞需要變形的需要。比如老版本中,%d turn(s) 在新版本中可以寫成 {1} {1:turn|turns} 。根據第一個引數是否為 1 來選擇使用 turn 還是 turns 。

這些是遊戲做本地化的經驗,在此記錄一筆。