UnityAPI.Quaternion四元数

四元数介绍:【Unity技巧】四元数(Quaternion)和旋转 - CSDN博客

Quaternion类

Quaternion类又称四元数,由x, y, z, w 4个分量组成,属于struct类型。

Unity中用其存储和表示对象的旋转角度

Quaternion的变换较为复杂,对于GameObject一般的旋转及移动,可用Transform中相关方法实现

A、Quaternion类实例属性

1、eulerAngles

public Vector3 eulerAngless{ get; set; }

返回或设置Quaternion实例对应的欧拉角

对应GameObject对象的Transform进行欧拉角的变换次序是,先绕Z轴旋转相应角度,再绕X、Y轴旋转相应角度,不同的旋转次序得到的最终最终状态是不同的

对GameObject对象的旋转角进行赋值的方式通常有两种,一种是将Quaternion实例赋值给transform的rotation,第二种是将三维向量代表的欧拉角直接赋值给transform的eulerAngles

//rotations.eulerAngles=new Vector3(0.0f, speed*Time.time, 0.0f);

//A.rotation=rotations;

//eulerAngle=new Vector3(0.0f, speed*Time.time, 0.0f);

//B.eulerAngles=eulerAngle;


B、Quaternion类实例方法

1、SetFromToRotation

public void SetFromToRotation(Vector3 fromDirection, Vector3 toDirection);

创建一个从fromDirection到toDirection的rotation

Quaternion q1=Quaternion.identity;

q1.SetFromToRotation(v1,v2);

transform.rotation=q1;

相当于将GameObject对象进行如下变换,将GameObject对象自身坐标系的x,y,z轴方向和世界坐标系的x,y,z轴方向一致,然后将GameObject对象自身坐标系中向量v1指向的方向旋转到v2方向

不可直接使用transform.rotation.SetFromToRotation(v1,v2)方式进行设置,只能将实例化的Quaternion赋值给transfrom.rotation


2、SetLookRotation

public void SetLookRotation(Vector3 view);

Public void SetLookRotation(Vector3 view, Vector3 up);

对一个Quaternion实例的朝向进行设置

同样不能直接赋值,需要首先实例化一个Quaternion,然后调用方法后,赋值给transfrom.rotation

transform.forward方向与v1方向相同

transform.right垂直于由Vector3.zero, v1和v2三点构成的平面

v2用来决定transform.up的朝向,选取方式使得transform.up的方向和v2方向的夹角小于或等于90度

v1为Vector3.zero时,方法失效


3、ToAngleAxis

public void ToAngleAxis(out float angle, out Vector3 axis);

angle为旋转角,axis为轴向量

将Quaternion实例转换为角轴表示,即要将GameObject对象的rotation从Quaternion.Identity状态变换到当前状态,只需将GameObject对象绕着axis的轴向(指世界坐标系中)旋转angle角度即可。

此方法通常和静态方法AngleAxis(float angle, Vector3 axis)联合使用,使得一个物体的rotation始终和另一个物体的rotation保持一致


C、Quaternion类静态方法

1、Angle

public static float Angle(Quaternion a, Quaternion b);

用于返回从参数a到参数b变换的夹角,即GameObject对象从状态a转换到状态b时需要旋转的最小夹角


2、Dot

public static float Dot(Quaternion a, Quaternion b);

求参数a, b的点乘

q1=(x1,y1,z1,w1)

q2=(x2,y2,z2,w2)

float f=Quaternion.Dot(q1,q2)

f=x1*x2+y1*y2+z1*z2+w1*w2,f的范围为[-1,1]

当f=1时,他们的rotation相等

当f=-1时,其中一个rotation比另一个多旋转乐360度


3、Euler

public static Quaternion Euler(Vector3 euler);

public static Quaternion Euler(float x, float y, float z);

此方法用于返回欧拉角Vector3(x,y,z)对应的四元数Quaternion实例

四元数(qx,qy,qz,qw)与欧拉角(ex,ey,ez)的对应关系:

ex=ex*PIover180/2.0f;

ey=ey*PIover180/2.0f;

ez=ez*PIlover180/2.0f;

qx=sin(ex)cos(ey)cos(ez)+cos(ex)sin(ey)sin(ez);

qy=cos(ex)sin(ey)cos(ez)-sin(ex)cos(ey)sin(ez);

qz=cos(ex)cos(ey)sin(ez)-sin(ex)sin(ey)cos(ez);

qw=cos(ex)cos(ey)cos(ez)+sin(ex)sin(ey)sin(ez);


4、FromToRotation

public static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection);

用来创建一个从参数fromDirection到toDirection的Quaternion变换

功能和实例方法SetFromToRotation相同,只是用法上有些不同


5、Inverse

public static Quaternion Inverse(Quaternion rotation);

用于返回参数rotation的逆向Quaternion值

例如实例rotation=(x,y,z,w)

Inverse(rotatiom)=(-x, -y, -z, w)

效果上,rotation.eulerAngles=(a, b, c)

transform.rotation=Inverse(rotation)相当于transform依次绕自身坐标系的z轴、x轴、y轴分别旋转-c度,-a度和-b度

但由于时局部坐标系内的变换,最后transform的欧拉角的各个分量值并不一定等于-a,-b,-c


6、Lerp

public static Quaternion Lerp(Quaternion from, Quaternion to, float t);

用于返回从参数from到to的线性插值

当t<=0,返回from,当参数t>=1,返回to。执行速度比slerp方法快,一般可代替Slerp方法


7、LookRotation

public static Quaternion LookRotation(Vector3 forward);

public static Quaternion LookRotation(Vector3 forward, Vector3 upwards);

forward为返回Quaternion的forward朝向

用于返回一个Quaternion实例,使GameObject对象的z轴朝向参数forward方向

与方法SetLookRotation功能相同,只是用法上有些不同


8、RotateTowards

public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta);

from为起始,to为结束,参数maxDegreesDelta为每帧最大角度值

用于返回从参数from到参数to的插值,且返回值的最大角度不超过maxDegreesDelta

功能与Slerp相似,只是maxDegreesDelta指角度值,而不是插值系数,<0时,将沿to到from方向插值计算


9、Slerp

public static Quaternion Slerp(Quaternion from, Quaternion to, float t);

用于返回从参数from到to的球面插值

参数t<=0时返回值为from,参数t>=1时返回值为to,一般情况下可用Lerp方法代替

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容