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 * : 由另一个四元数来旋转一个旋转角度,或由一个旋转角度来旋转一个向量.跟旋转轴有关,与绕旋转轴旋转的角度有关.

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类:   

 

unity3d, quaternion 的乘法操作  * ) 有两种操作:

  例如  这是将一个点先进行操作旋然后进行p操作旋.

      例如  这是将点进性操作旋

 

Quaternion基本数学方程 : 

Q =为旋转角度)

==============================

Q.x 

Q.y 

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,然后对点坐标进行旋转.

—————————————————————————————————————————

1World Space(世界坐标): 

我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的

transform.position 可以获得该位置坐标。 

 

2Screen Space(屏幕坐标): 

以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height)

Z的位置是以相机的世界单位来衡量的。 

Screen.width 

Screen.height = Camera.pixelHeigth 

鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标, 

手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。 

 

3ViewPort 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();