掃盲系列 : Vector 矢量

在遊戲中計算兩點距離是踏入三維遊戲制作的基礎之一
這邊來討論一下遊戲用這些可以用來幹甚麼.
初踏入遊戲製作的程序員, 如果沒有數學基礎應該會糾結於 Vector3 這個三維系統所代表的意思.
這邊簡介一下.

  • 代表空間 Space
    • 世界坐標 World Space
      代表整個遊戲世界的方位, e.g. X = 東西, Y = 上下, Z = 南北
    • 個人空間 Local Space
      代表這個 “物件”, e.g. 玩家的 offset, X = 左右, Y = 上下, Z = 前後.
  • 兩點之間的距離 Distance
    e.g. (Vector3.Distance, Vector3.magnitude)
  • 比喻為一個方向 Direction
    所有的方向也是假設以 (0,0,0) 為中心, 以 Local space 的概念來投射出一個方向.
    e.g. Vector3(0,0,1) 就是由 (0,0,0) 指向 (0,0,1) 即是正前方的指向.
    e.g. Vector3(0.5f, 0f, 0.5f) 就是由 (0,0,0) 指向 (0.5, 0, 0) 亦即是前方偏右的指向.

更多的解釋或概念未能一一解釋, 有興趣可以自行探索 Wiki(Vector)
Unity3D 官網的 API https://docs.unity3d.com/ScriptReference/Vector3.html

用作空間記錄時

Vector2 由 2 個 float 組成可以看待為 X, Y 軸.
Vector3 由 3 個 float 組成可以看待為 X, Y, Z 軸.

用作空間時需要留意是代表那一種空間.
世界坐標 World Space – 就是你的遊戲世界上的絕對坐標 absolution position 這個沒有甚麼好爭議的.
如果是子空間 Local Space – 代表的可以是基於任何一件物件 gameobject 的子空間, 留意子間空是需要考慮當前物件的轉向 Rotation 的,
e.g. 物件面向天空時, 正前方就是天空.
這個從計算上可以體現出來.

用作方向記錄時

Vector2 假定由 X=0f, Y= 0f 的位置畫一條直線到坐標.
e.g. { 1, 0 } 就是由 { 0,0 } 連接到 {1, 0} 水平於 X 軸且距離為 1 的橫線.

Vector3 假定由 X=0f, Y=0f, Z=0f 的位置畫一條直線到坐標.
e.g. { 0, 1, 0 } 就是由 {0,0,0} 垂直於 Y 軸且距離為 1 的直線.

方向跟坐標經常會混在一起使用所以編程時這些 Vector 的代表需要好好標示才能避免混淆

取得 Vector 的距離

在 Unity3D 中有 API 取得一支 Vector 的距離.


一般的應用例子 – [方向, 速度]

這個距離也可以與時間一起運算並取得該方向之速度等使用.

  • 上一幀的 GameObject 位置 跟 角度
  • 現在的 GameObject 位置 跟 角度
  • 每次 Update() 系統給的 Time.deltaTime

有幀與幀之間的點就可以進行 vector 運算得到矢量 及其距離, 並以之得到這幀的速度…etc

Vector3 lastFramePosition;

void LateUpdate()
{
    lastFramePosition = transform.position;
}

void Update()
{
    float time = Time.deltaTime;
    Vector3 v = transform.position - lastFramePosition;
    float distance = v.magnitude; // to calculate the distance we moved.
    
    float speed = distance / time;
}

距離, 時間, 速度的關係.

一般的應用例子 – [角度]

角度的 API 運算.

經由 Transfrom.forward 其實可以很輕易的算到兩個矢量之間的角度,
留意的是這部分不包括距離的資源.

以上就是一般的懶人包, 其他的小弟比較懶有人問才再補完….. 還是那句看 document 長智識.

3 Comments

  1. Pingback: 我的人形控制開發筆記(一) Locomotion – Clonefactor

  2. Pingback: 便當級的怪物 Locomotion + NavMeshAgent – Clonefactor

  3. Pingback: 我的人形開發筆記(四) Locomotion, 被障礙物影響的移動. – Clonefactor

發佈留言

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

*

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