Local / World Space 空間

Local space 又稱作 Object space 是個人空間.
World space 則是世界空間

所謂的空間轉換念很簡單.
先理解下面的方向概念 :

N = North
E = East
S = South
W = West

F = Forward
R = Right
B = Back
L = Left

假設這裡的 Object space 跟 World space 是方向一致的
你的右手指著西方(L=W), 左手指著東方(R=E), 面對北方(F=N)
需然代表的方位不同, 但它們都是指向同一個方向的.

轉換

如果我們把人物的面向沿 Y 軸轉個 45 度.
變成下圖的樣子, 這個時候空間轉換的概念就要應用上.

如圖, 這個時候, 人物的正前方 “F” 指著的方向是 “NE”
所以 Local space.foward 就是 world 的 NE 方. 
這就是 Local 轉換為 World
同理如果我們要把 World 的 “S” 轉換為 Local 的話就是 “RB” 了.

那制作遊戲時為甚麼重要?

假設你希望人物向某個方向移動, 一般來說我們在做這個功能是希望. e.g. 人物以 F 的方向跑
但實際我們需要求得在世界坐標下的方向才能跑. 這是因為遊戲的坐標系統是以世界坐標為準的…(廢話).
所以 vector 的轉換就顯得重要了.
真要了解的話先要懂甚麼 sin/cos 跟 Matrix 的陣列運算…但遊戲引擎通常會把這些都打包好方便製作.

以 Unity3D 為例, Transform.TransformDirectionTransform.InverseTransformDirection 就是用來轉換的 API

這個圖用看的好像很容易理解, 但在數學上丟是完全不同的.
以個人坐標 Local space 來看的話
向前走 1 unit 是用 xyz = {0f, 0f, 1f} 來代表.
但在上圖的情況 (Y 45 度的轉向下) 把它轉為世界坐標 World space 其實我們需要移動的是
向 NE 走 1 unit 即是 xyz = {0.7f, 0f, 0.7f}

PS: 可以參考一下 我的人形控制開發筆記(一) Locomotion 有更多關於視點跟輸入方向的轉換.

One Comment

  1. Pingback: Quaternion 掃盲 – Clonefactor

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料