在遊戲中計算兩點距離是踏入三維遊戲制作的基礎之一
這邊來討論一下遊戲用這些可以用來幹甚麼.
初踏入遊戲製作的程序員, 如果沒有數學基礎應該會糾結於 Vector3 這個三維系統所代表的意思.
這邊簡介一下.
- 代表空間 Space
- 世界坐標 World Space
代表整個遊戲世界的方位, e.g. X = 東西, Y = 上下, Z = 南北 - 個人空間 Local Space
代表這個 “物件”, e.g. 玩家的 offset, X = 左右, Y = 上下, Z = 前後.
- 世界坐標 World Space
- 兩點之間的距離 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 長智識.
Pingback: 我的人形控制開發筆記(一) Locomotion – Clonefactor
Pingback: 便當級的怪物 Locomotion + NavMeshAgent – Clonefactor
Pingback: 我的人形開發筆記(四) Locomotion, 被障礙物影響的移動. – Clonefactor