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 的乘法操作 * ) 有两种操作:
例如 这是将一个点先进行t 操作旋转, 然后进行p操作旋转.
例如 这是将点p 进性t 操作旋转
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,然后对点坐标进行旋转.
—————————————————————————————————————————
1、World Space(世界坐标):
我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的
transform.position 可以获得该位置坐标。
2、Screen Space(屏幕坐标):
以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height)
Z的位置是以相机的世界单位来衡量的。
Screen.width
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();