向量的計算和基本方法

通過typeof獲取遊戲對象的某個獨特屬性(對象),並且通過FindObjectsOfType來尋找這個對象
Type t = typeof(CapsuleCollider);
CapsuleCollider[] objs = FindObjectsOfType();
建GameObject數組,並將場景中的對象拖拽到對象槽中:做一個數組字段,就可以使Unity之中獲得對象槽。
向量:
模:向量的長度標準化(Normalizing):保持方向不變,將向量的長度變爲1.
單位向量:長度爲1的向量。
零向量:各分量均爲0的向量
Z軸前進1:Vector3.forward
X軸前進1:Vector3.right
Y軸前進1:Vector3.up
0向量:Vector3.zero
創建一個向量
Vector3 v1 = new Vector3(2, 2, 2);
Debug.Log(“向量的長度平方:” + v1.sqrMagnitude);
Debug.Log(“向量的長度:” + v1.magnitude);
在該向量的方向上一個單位向量
Debug.Log(v1.normalized);
爲單位向量賦值可得到精準的x,y,z長度,而不是近似數;
Vector3 v2 = v1.normalized;
Debug.Log(“x:” + v2.x);
Debug.Log(“y:” + v2.y);
Debug.Log(“z:” + v2.z);
向量運算——加減:向量的加法(減法)爲各個分量分別相加(相減)。
Vector3 result = v3 - v4;
向量運算——數乘:向量與一個標量相乘稱爲數乘。數乘可以對向量的長度進行縮放,如果標量大於0,那麼向量的方向不變,若標量小於0,則向量的方向會變爲反方向。
One向量(1,1,1)
Debug.Log(Vector3.one * 5);
向量的角度:
Vector3 v1 = new Vector3(0, 0, 2);
Vector3 v2 = new Vector3(2, 0, 0);
float degrees = Vector3.Angle(v2, v1);
返回向量的長度,最大不超過maxLength所指示的長度:
Vector3 v3 = Vector3.ClampMagnitude(v2, 2);
返回a和b之間的距離:
float distance = Vector3.Distance(v1, v2);
兩個向量之間的線性插值:(下面例子就是說由V4和V2之間,分成4份[0.25],得出(6.5,0,0));
Vector3 v4 = new Vector3(8,0,0);
Debug.Log(“lerp:”+Vector3.Lerp(v4, v2, 0.25f));
當前的地點移向目標:
在void Update ()函數中運行(每幀開始的位置,要移動到的位置,每幀移動的最大距離)
player.transform.position = Vector3.MoveTowards(player.transform.position, end.transform.position,0.1f);
對象從一個座標以弧線移動到另一個座標的案例(Slerp在兩個向量之間球形插值)
(Time.time爲一個遊戲激活就開始計時的變動時間)
Vector3 center = (start.transform.position + end.transform.position) / 2;
center -= new Vector3(0,1,0);(改變中心點,球一直圍繞中心點轉動)
Vector3 startCenter = start.transform.position - center;
Vector3 endCenter = end.transform.position - center;
player.transform.position = Vector3.Slerp(startCenter, endCenter, (Time.time - startTime) / 5);
player.transform.position += center;
向量運算——點乘:兩個向量點乘得到一個標量,數值等於兩個向量長度相乘再乘以兩者夾角的餘弦值。如果兩個向量a,b均爲單位向量,那麼a.b等於向量b在向量a方向上的投影的長度(或者說向量a在向量b方向上的投影)。
a*b=|a||b|Cos(&),&是向量a和b之間的夾角;
a*b=b*a乘法交換律;
詳細查看課件點乘差乘圖片。
(Vector.Dot(v1,v2)向量v1v2的點乘)
下列案例可得兩向量之間的夾角
Vector3 v1 = new Vector3(2,0,0);
Vector3 v2 = new Vector3(-2,0,2);
float dotValue = Vector3.Dot(v1, v2);
Debug.Log(“點乘的結果:” +dotValue);
float temp = dotValue / (v1.magnitude * v2.magnitude);
(求出弧度)
float aCosTemp = Mathf.Acos(temp);
(轉化成角度)
float degrees = Mathf.Rad2Deg * aCosTemp;
Debug.Log(degrees);
向量運算——差乘:
(Vector3.Cross)
Vector3 v1 = new Vector3(1, 3, 5);
Vector3 v2 = new Vector3(4, 6, 3);
Vector3 ret = Vector3.Cross(v1,v2);
Debug.Log(ret);
差乘的算法(詳細見點乘差乘圖片)
v1×v2=y1z2-y2z1+z1x2-z2x1+x1y2-x2y1
obj1.transform.position(父類絕對座標)
obj2.transform.position(子類絕對座標)
obj1.transform.localPosition(父類相對座標)
obj2.transform.localPosition(子類相對座標)
旋轉:(放入Update函數)
(使一個對象以某個軸在某個時間單位內轉多少角度)
obj3.transform.Rotate(new Vector3(0,30,0)*Time.deltaTime);
四元數(Quaternion)
歐拉角(new Vector3(0,30,0))(eulerAngles將一個歐拉角轉換爲四元數)
Quaternion q = Quaternion.identity;(identity同一性旋轉只讀,默認爲不旋轉)
q.eulerAngles = new Vector3(0,30,0) ;
obj3.transform.rotation = q;
按鈕案例(GUI界面)(Button創建一個單次按下按鈕。用戶點擊按鈕事件立即觸發。)(Rect矩陣(X,Y,長,寬))(四元數的左乘)
if (GUI.Button(new Rect(20,20,100,80),”Q_X”))
{
Quaternion q = Quaternion.identity;
q.eulerAngles = new Vector3(30, 0, 0);
transform.rotation = q * transform.rotation;(四元數相乘q = t * p; 這是將一個點先進行t 操作旋轉,然後進行p操作旋轉.)
}
(第二種四元數乘向量)
Quaternion * Vector3,
p : Vector3
t : Quaternion
q : Vector3;
q = t * p; 這是將向量p 進性t 操作旋轉;

發佈了33 篇原創文章 · 獲贊 3 · 訪問量 9882
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章