Unity-数学2-四元数
?
Quaternion.Angle? :?返回a和b兩者之間的角度
? ??聲明形式:public static float Angle ( Quaternion a,? Quaternion b )
? ??它可以計算兩個旋轉之間的夾角。與Vector3.Angle()作用是一樣的。
Quaternion.Euler? :??返回一個旋轉角度,繞z軸旋轉z度,繞x軸旋轉x度,繞y軸旋轉y度
? ??聲明形式:public static Quaternion Euler ( Vector3 euler )
? ? 這個函數可以將一個歐拉形式的旋轉轉換成四元數形式的旋轉。傳入的參數分別是歐拉軸上的轉動角度。
Quaternion.Slerp? :??球形插值,通過t值from向to之間插值。
???聲明形式:public static Quaternion Slerp ( Quaternion from, Quaternion to, float t )
? ??基本意思就是線性地從一個角度旋轉到另一個角度,其中旋轉勻速增加t。
??? 附加內容:很多時候from 和to都不是固定的,而且上一個腳本也不能保證所有角度下的旋轉速度一致。
? ?所以我寫了這個腳本來保證可以應付大多數情況。
Transform target; float rotateSpeed = 30.0f; Quaternion wantedRotation = Quaternion.FromToRotation(transform.position, target.position); float t = rotateSpeed/Quaternion.Angle(transform.rotation, wantedRotation) * Time.deltaTime; transform.rotation = Quaternion.Slerp(transform.rotation, target.rotation, t);? ? 這個腳本可以保證物體的旋轉速度永遠是rotateSpeed。
?? 如果自身坐標和目標之間的夾角是X度,我們想以s=30度每秒的速度旋轉到目標的方向,則每秒旋轉的角度的比例為s/X。?
? ??再乘以每次旋轉的時間Time.deltaTime我們就得到了用來勻速旋轉的t。?
Quaternion.FromToRotation :?從fromDirection到toDirection創建一個旋轉。
?? 聲明形式:public static Quaternion FromToRotation ( Vector3 from, Vector3 to )
? ? 它是得到從一個方向到另一個方向的旋轉。就是轉一個方向,就這么簡單。
Quaternion.identity?? ? :?返回恒等式旋轉(只讀)。這個四元數對于“無旋轉”:這個物體完全對齊于世界或父軸.
Quaternion.operator * :?由另一個四元數來旋轉一個旋轉角度,或由一個旋轉角度來旋轉一個向量.?(x,y,z) :?跟旋轉軸有關,? w? :?與繞旋轉軸旋轉的角度有關.
Quaternion.LookRotation: ( Vector3 forward,? Vector3 upwards = Vector3.up)
?因為它們都要經過代數運算才能得出旋轉軸和旋轉角度? ?
?傳入的兩個參數分別代表前方盯著的方向以及自己的上方向。它可以讓一個GameObject轉動腦袋盯著另一個物體。如:
public Transform target;void Update(){Vector3 relativePos = target.position - transform.position;Quaternion rotation = Quaternion.LookRotation(relativePos);transform.rotation = rotation;}這段代碼就可以讓當前的object時時盯著target不放,當然,你也可以自定義up朝向,這里默認是Vector3.up;
?
詳解Quaternion類:??http://www.cnblogs.com/tgycoder/p/5106463.html?
?
在unity3d中, quaternion?的乘法操作?(operator? * )?有兩種操作:
?? (1) quaternion * quaternion???例如?q = t * p;??這是將一個點先進行t?操作旋轉,?然后進行p操作旋轉.
?? (2) Quaternion * Vector3,?? ? ??例如?p : Vector3;? t : Quaternion;? q : Quaternion;?? q = t * p;???這是將點p?進性t?操作旋轉
?
Quaternion基本數學方程 :?
Q =? i (x * sin(angle/2)) + j (y * sin(angle/2)) + k(z * sin(angle/2)) + cos (angle/2)? (angle?為旋轉角度)
==============================
Q.x? = axis.x * sin (angle / 2)?
Q.y? = axis.y * sin (angle / 2)??
Q.z? = axis.z * sin (angle / 2)
Q.w = cos (angle / 2)?
==============================
只要有角度就可以給出四元數的四個部分值??
例如我想要讓點 M = Vector3(o, p, q)?繞x軸順時針旋轉90度
對應的quaternion數值就應該為:
Q : Quaternion;
Q.x = 1 * sin(90度/2) = sin(45度) = 0.7071
Q.y = 0;
Q.z = 0;
Q.w = cos(90度/2) = cos (45度)? = 0.7071
Q = (0.7071, 0 , 0 , 0.7071);
m = Q * m;?(將點m?繞 x軸(1, 0, 0)?順時針旋轉了90度).
這是quaternion?的最基本用法,主要給出角度,就可以算出Quaternion,然后對點坐標進行旋轉.
—————————————————————————————————————————
1、World Space(世界坐標):?
我們在場景中添加物體(如:Cube),他們都是以世界坐標顯示在場景中的
transform.position?可以獲得該位置坐標。?
?
2、Screen Space(屏幕坐標):?
以像素來定義的,以屏幕的左下角為(0,0)點,右上角為(Screen.width,Screen.height)
Z的位置是以相機的世界單位來衡量的。?
Screen.width? = Camera.pixelWidth?
Screen.height = Camera.pixelHeigth?
鼠標位置坐標屬于屏幕坐標,Input.mousePosition可以獲得該位置坐標,?
手指觸摸屏幕也為屏幕坐標,Input.GetTouch(0).position可以獲得單個手指觸摸屏幕坐標。?
?
3、ViewPort Space(視口坐標):?
視口坐標是標準的和相對于相機的。相機的左下角為(0,0)點,右上角為(1,1)點
Z的位置是以相機的世界單位來衡量的。?
?
4、繪制GUI界面的坐標系:?
這個坐標系與屏幕坐標系相似,不同的是該坐標系以屏幕的左上角為(0,0)點,右下角為(Screen.width,Screen.height)
—————————————————————————————————————————
【四種坐標系的轉換】?
1、世界坐標→屏幕坐標:?
camera.WorldToScreenPoint(transform.position);?
將世界坐標轉換為屏幕坐標。其中camera為場景中的camera對象。?
2、屏幕坐標→視口坐標:?
camera.ScreenToViewportPoint(Input.GetTouch(0).position);?
將屏幕坐標轉換為視口坐標。其中camera為場景中的camera對象。?
3、視口坐標→屏幕坐標:?
camera.ViewportToScreenPoint();?
4、視口坐標→世界坐標:?
camera.ViewportToWorldPoint();
?
轉載于:https://www.cnblogs.com/liusj/p/8026623.html
總結
以上是生活随笔為你收集整理的Unity-数学2-四元数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式(十)------23种设计模式
- 下一篇: 检测日期格式是否为yyyy-MM-dd