Unity3D-数学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;  这是将一个点先进行操作旋然后进行p操作旋.

   (2) Quaternion * Vector3,       例如 p : Vector3;  t : Quaternion;  q : Quaternion;   q = t * p;   这是将点进性操作旋

 

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

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

1World Space(世界坐标): 

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

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

 

2Screen Space(屏幕坐标): 

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

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

Screen.width  = Camera.pixelWidth 

Screen.height = Camera.pixelHeigth 

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

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

 

3ViewPort Space视口坐标): 

视口坐标是标准的和相对于相机的。相机的左下角为(00)点,右上角为(11)点

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

 

4绘制GUI界面的坐标系: 

这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(00)点,右下角为(Screen.widthScreen.height

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

【四种坐标系的转换】 

1、世界坐标→屏幕坐标: 

camera.WorldToScreenPoint(transform.position); 

将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。 

2、屏幕坐标→视口坐标: 

camera.ScreenToViewportPoint(Input.GetTouch(0).position); 

将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。 

3视口坐标→屏幕坐标: 

camera.ViewportToScreenPoint(); 

4视口坐标→世界坐标: 

camera.ViewportToWorldPoint();

 

posted on 2017-12-12 11:26  小魔一剑  阅读(268)  评论(0编辑  收藏  举报