Unity3D Quaternion各屬性和函數測試
publicQuaternionrotation=Quaternion.identity;voidStart(){rotation.eulerAngles=newVector3(0,30,0);transform.rotation=rotation;print(rotation.eulerAngles.y);}效果:將物體繞y軸順時針轉30°,效果與transform.eulerAngles相同。物體rotation = (0,30,0)。但是不能直接為transform.rotation.eulerAngle賦值。二,方法1,function ToAngleAxis (out angle :float, out axis :Vector3) :void[csharp]view plaincopy
publicfloatangle=0.0F;publicVector3axis=Vector3.zero;voidStart(){transform.eulerAngles=newVector3(0,90,0);transform.rotation.ToAngleAxis(outangle,outaxis);print(angle+""+axis);}效果:將物體的旋轉角度返回到angles和axis里(物體的z軸和世界坐標z軸的夾角)。輸入:transform.localEulerAngles=(0,0,0);輸出:angle=0, axis=(1,0,0);輸入:transform.localEulerAngles=(0,90,0);輸出:angle=90,axis=(0,1,0);輸入:transform.localEulerAngles=(270,0,0);輸出:angle=90,axis=(-1,0,0)2,function SetFromToRotation (fromDirection :Vector3, toDirection :Vector3) :void[csharp]view plaincopy
privateVector3_from=Vector3.one;privateVector3_to=newVector3(100f,200f,100f);privateQuaternionq;privateVector3headUpDir;voidStart(){q.SetFromToRotation(_from,_to);transform.rotation=q;headUpDir=transform.TransformDirection(Vector3.forward);}效果:把物體的fromDirection旋轉到toDirection輸入:a=Vector3(0,0,1); b=Vector3(0,1,0)//把z軸朝向y軸輸出: q=(-0.7,0,0,0.7); headUpDir=(0,1,0)輸入:a=Vector3(0,0,1); b=Vector3(1,0,0)//把z軸朝向x軸輸出: q=(0,0.7,0,0.7); headUpDir=(1,0,0)輸入:a=Vector3(0,1,0); b=Vector3(1,0,0)//把y軸朝向x軸輸出: q=(0,0,-0.7,0.7); headUpDir=(0,0,1)3,function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void[csharp]view plaincopy
publicTransformobj1;publicTransformobj2;Quaternionq;voidUpdate(){q.SetLookRotation(obj1.position,obj2.position);transform.rotation=q;}效果:類似於LookAt()方法,使物體1始終注視著物體24, static operator * (lhs : Quaternion, rhs : Quaternion) : Quaternion[csharp]view plaincopy
publicTransformextraRotation;voidUpdate(){transform.rotation*=extraRotation.rotation;}效果:組合旋轉lhs和rhs。旋轉一個點,首先用lhs,然後用rhs旋轉,與使用組合旋轉相同。注意旋轉不可交換: lhs*rhs不等於rhs*lhs。 我理解旋轉的角度就是將*號兩邊的角度加起來。5,static operator * (rotation : Quaternion, point : Vector3) : Vector3[csharp]view plaincopy
Vector3relativeDirection=Vector3.forward;Vector3absoluteDirection;voidUpdate(){absoluteDirection=transform.rotation*relativeDirection;transform.position+=absoluteDirection*Time.deltaTime;}效果:將一個向量根據rotation旋轉到另一個向量。6,static function Dot (a : Quaternion, b : Quaternion) : float效果:將兩個Quaternion點乘,返回一個float值,意義待補充。7,static function AngleAxis (angle : float, axis : Vector3) : Quaternion[csharp]view plaincopy
voidStart(){transform.rotation=Quaternion.AngleAxis(30,Vector3.up);}效果:將物體繞axis旋轉angle度。8,staticfunctionFromToRotation (fromDirection :, toDirection
: Quaternion[csharp]view plaincopy
transform.rotation=Quaternion.FromToRotation(Vector3.up,transform.forward);效果:跟SetFromToRotation差不多,區別是可以返回一個Quaternion。通常用來讓transform的一個軸向(例如 y軸)與toDirection在世界坐標中同步。9,staticfunctionLookRotation (forward :, upwards :=) : Quaternion效果:跟SetLootRotation差不多,區別是可以返回一個Quaternion。10,staticfunctionSlerp (from : Quaternion, to : Quaternion, t :float) : Quaternion[csharp]view plaincopy
publicTransformfrom;publicTransformto;publicfloatspeed=0.1F;voidUpdate(){transform.rotation=Quaternion.Slerp(from.rotation,to.rotation,Time.time*speed);}效果:球面插值,插值不是等角速度的,而是變速的。 會有越來越慢的感覺。11,staticfunctionLerp (from : Quaternion, to : Quaternion, t :float) : Quaternion效果:與Slerp效果差不多,效率比Slerp高但是如果from和to相差過大效果會不好,會返回一個標準化的Quaternion。12,staticfunctionRotateTowards (from : Quaternion, to : Quaternion, maxDegreesDelta :float) : Quaternion效果:旋轉一個角度從from向to。與Slerp基本相同,但這個函數的角速度永遠不會超過maxDegreesDelta。負的maxDegreesDelta值將使旋轉遠離to。13,staticfunctionInverse (rotation : Quaternion) : Quaternion效果:返回反向的旋轉。14,staticfunctionAngle (a : Quaternion, b : Quaternion) :float[csharp]view plaincopy
publicTransformtarget;voidUpdate(){floatangle=Quaternion.Angle(transform.rotation,target.rotation);}效果:返回a和b兩者之間的角度。15,staticfunctionEuler (x :float, y :float, z :float) : Quaternion .[csharp]view plaincopy
publicQuaternionrotation=Quaternion.Euler(0,30,0);效果:把旋轉角度變成對應的Quaternion。三,實例[javascript]view plaincopy
vartarget:Transform;varedgeBorder=0.1;varhorizontalSpeed=360.0;varverticalSpeed=120.0;varminVertical=20.0;varmaxVertical=85.0;privatevarx=0.0;privatevary=0.0;privatevardistance=0.0;functionStart(){x=transform.eulerAngles.y;y=transform.eulerAngles.x;distance=(transform.position-target.position).magnitude;}functionLateUpdate(){vardt=Time.deltaTime;x-=Input.GetAxis("Horizontal")*horizontalSpeed*dt;y+=Input.GetAxis("Vertical")*verticalSpeed*dt;y=ClampAngle(y,minVertical,maxVertical);varrotation=Quaternion.Euler(y,x,0);varposition=rotation*Vector3(0.0,0.0,-distance)+target.position;//print(rotation+"&&"+rotation*Vector3(0.0,0.0,-distance));transform.rotation=rotation;transform.position=position;}staticfunctionClampAngle(angle:float,min:float,max:float){if(angle<-360)angle+=360;if(angle>360)angle-=360;returnMathf.Clamp(angle,min,max);}非常有意思的一個例子,來自Unity官方工程ShadowDemoProject,效果是可以通過鍵盤使攝像機圍繞一點自由旋轉,類似於在一個球面上運動。[javascript]view plaincopy
varposition=rotation*Vector3(0.0,0.0,-distance)+target.position;這一句非常有意思,也很難理解,完全理解了這一句後,Quaternion在你手裡會變的非常強大!
推薦閱讀:
※網路時代還沒學會對儀器遠程操控?那就太可惜了
※聊天記錄詳解推拉與服從性測試的實例展示與用法
※氣質測試
※愛情測試:你容易患哪種「愛情病」?
※港媒:大橋測試案
