Quaternion 类的属性

eulerAngles  欧拉角

Quaternion 类的实例方法

1、SetFromToRotion 函数

2、SetLookRotation 函数

3、ToAngleAxis 函数

Quaternion 类的静态方法

1、Angle方法

2、Dot方法

3、Euler方法

4、FromToRotation方法

5、Inverse方法

6、Lerp方法

7、LookRotation方法

8、RotateToWards方法

9、Slerp方法

Quaternion 类的实例方法

SetFromToRotion 函数

1、public void SetFromToRotion(Vector3 fromDirection, Vector3 toDirection);

可以创建一个从向量fromDirection到向量toDirection的旋转。(fromDirection 和 toDirection 不能为Vector3.zero)

代码示例: m_q.eulerAngles = (45.0, 0.0, 0.0)

        // 向量1Vector3 v1 = new Vector3(2, 3, 4);Debug.DrawRay(Vector3.zero, v1.normalized * 3, Color.red);// 向量2Vector3 v2 = new Vector3(2, -3, -1);Debug.DrawRay(Vector3.zero, v2.normalized * 3, Color.green);// 四元数q1: 向量v1到向量v2的旋转Quaternion q1 = Quaternion.identity;q1.SetFromToRotation(v1, v2);// 设置cube0的旋转为q1m_cube0.rotation = q1;// 得到旋转后cube0坐标系中的变量v1,在世界坐标系中的向量v3Vector3 v3 = m_cube0.TransformDirection(v1);Debug.DrawRay(Vector3.zero, v3.normalized * 2, Color.blue);

由运行结果可以看到v3和v2指向相同,cube0做了如下变换,首先将自身坐标系与世界坐标系一致,然后将自身坐标系中v1指向的方向旋转到v2指向方向。

SetLookRotation 函数

1、public void SetLookRotation(Vector3 v1);

设置Quaternion实例的朝向与向量v1指向的方向相同

2、public void SetLookRotation(Vector3 v1, Vector3 v2);

设置transform.forward(z轴) 方向与v1方向相同,transform.right (x轴)垂直于由 Vector3.zer0、v1和v2这3点构成的平面。v2决定了transform.up(y轴)的朝向,因为当transform.forward和transform.right方向确定后,transform.up的方向总会与V2的方向的夹角小于或等于90度。当V1为Vector3.zero时,方法失效。

代码示例

    void Update(){Vector3 v1 = new Vector3(-3, 3, 3);Vector3 v2 = new Vector3(3, 4, 1);m_q.SetLookRotation(v1, v2);Debug.DrawLine(Vector3.zero, v1, Color.red);Debug.DrawLine(Vector3.zero, v2, Color.green);Debug.Log("m_cube0.forward = " + Vector3.Normalize(m_cube0.forward));Debug.Log("v1 = " + Vector3.Normalize(v1));Debug.Log("angle from m_cube0.right to v1 = " + Vector3.Angle(m_cube0.right, v1));Debug.Log("angle from m_cube0.right to v2 = " + Vector3.Angle(m_cube0.right, v2));Debug.Log("angle from m_cube0.up to v2 = " + Vector3.Angle(m_cube0.up, v2));m_cube0.rotation = m_q;}

ToAngleAxis 函数

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

参数angle为旋转角,参数axis为轴向量。

该函数可以实现将GameObject对象的rotation从Quaternion.identity状态变换到当前状态,只需要将GameObject对象绕着axis轴(世界坐标系)旋转angle角度即可。

代码示例

    public Transform m_cube0;public Transform m_cube1;public Transform m_cube2;public Vector3 m_axis;public float m_angle;public Vector3 m_eulerAngles;void Update(){m_eulerAngles.x += Time.deltaTime * 2.0f;m_eulerAngles.y += Time.deltaTime * 1.0f;m_eulerAngles.z += Time.deltaTime * 3.0f;m_cube0.eulerAngles = m_eulerAngles;m_cube0.rotation.ToAngleAxis(out m_angle, out m_axis);m_cube1.rotation = Quaternion.AngleAxis(m_angle, m_axis);Debug.DrawRay(m_cube1.position, m_cube1.forward * 2, Color.blue);Debug.DrawRay(m_cube1.position, m_cube1.right * 2, Color.red);Debug.DrawRay(m_cube1.position, m_cube1.up * 2, Color.green);}

Quaternion 类的静态方法

Angle 函数

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

该方法可以计算两个旋转状态a达到b时需要旋转的最小夹角。

代码示例

    private void Update(){// 向量1Vector3 v1 = new Vector3(2, 3, 4);Quaternion q1 = Quaternion.identity;Quaternion q2 = Quaternion.identity;q1.SetLookRotation(v1);float a1, a2;Vector3 v = Vector3.zero;a1 = Quaternion.Angle(q1, q2);q1.ToAngleAxis(out a2, out v);Debug.Log("a1: " + a1);Debug.Log("a2: " + a2 + "  v: " + v);Debug.Log("q1.eulerAngles: " + q1.eulerAngles + " q1: " + q1);Debug.Log("q2.eulerAngles: " + q2.eulerAngles + " q2: " + q2);Debug.DrawRay(Vector3.zero, v1.normalized * 5, Color.red);Debug.DrawRay(Vector3.zero, v.normalized * 5, Color.green);}

Dot 函数

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

该方法可以根据点乘的结果,判断a和b对应欧拉角的关系。

例如有两个Quaternion实例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时,q1和q2对应的欧拉角是相等的,即旋转状态是一致的。特别地,当f = -1时,说明其中一个rotation比另外一个rotation多旋转了360°。

        // 四元数q1, 四元数q2, 四元数q3, 四元数q4Quaternion q1 = Quaternion.Euler(10, 10, 10);Quaternion q2 = Quaternion.Euler(370, 370, 370);Quaternion q3 = Quaternion.Euler(10, 10, 10);Quaternion q4 = Quaternion.Euler(20, 40, 70);Debug.Log("Quaternion.Dot(q1, q2) = " + Quaternion.Dot(q1, q2));Debug.Log("Quaternion.Dot(q1, q3) = " + Quaternion.Dot(q1, q3));Debug.Log("Quaternion.Dot(q1, q4) = " + Quaternion.Dot(q1, q4));

Euler方法

1、public static Quaternion Euler(Vector3 euler);

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

该方法用于返回欧拉角Vector3(ex,ey,ez)对应的四元数Quaternion q(qx,qy,qz,qw)。其对应关系如下:已知PIover180 = 3.141592/180 = 0.0174532925f是计算机图形学中的一个常亮,其变换过程如下:

        float PIover180 = 0.0174532925f;float ex = 30, ey = 40, ez = 50;Quaternion q = Quaternion.Euler(ex, ey, ez);Debug.Log("q.x = " + q.x);Debug.Log("q.y = " + q.y);Debug.Log("q.z = " + q.z);Debug.Log("q.w = " + q.w);ex = ex * PIover180 / 2.0f;ey = ey * PIover180 / 2.0f;ez = ez * PIover180 / 2.0f;float qx = Mathf.Sin(ex) * Mathf.Cos(ey) * Mathf.Cos(ez) + Mathf.Cos(ex) * Mathf.Sin(ey) * Mathf.Sin(ez);float qy = Mathf.Cos(ex) * Mathf.Sin(ey) * Mathf.Cos(ez) - Mathf.Sin(ex) * Mathf.Cos(ey) * Mathf.Sin(ez);float qz = Mathf.Cos(ex) * Mathf.Cos(ey) * Mathf.Sin(ez) - Mathf.Sin(ex) * Mathf.Sin(ey) * Mathf.Cos(ez);float qw = Mathf.Cos(ex) * Mathf.Cos(ey) * Mathf.Cos(ez) + Mathf.Sin(ex) * Mathf.Sin(ey) * Mathf.Sin(ez);Debug.Log("qx = " + qx);Debug.Log("qy = " + qy);Debug.Log("qz = " + qz);Debug.Log("qw = " + qw);

FromToRotation方法

1、public static Quaternion FromToRotation(Vector3 fromDirection,Vector3 ToDirection);

可以创建一个从向量fromDirection到向量toDirection的旋转。(fromDirection 和 toDirection 不能为Vector3.zero)。同SetFromToRotation实例方法的功能一样。

LookRotation方法

1、public static Quaternion LookRotation(Vector3 forward); public static Quaternion

2、LookRotation(Vector3 forward,Vector3 upwards);

参数forward为返回Quaternion实例的forward朝向。该方法和前面讲到的SetLookRotation实例方法的功能是一样。

Inverse方法

1、public static Quaternion Inverse(Quaternion rotation);

该方法可以返回参数rotation的逆向Quaternion值。例如rotation(x,y,z,w),那么Quaternion.Inverse(rotation) = (-x,-y,-z,w)。假设rotation的欧拉角为(a,b,c),则transform.rotation = Quaternion.Inverse(rotation)相当于transform依次绕自身坐标系的z轴、x轴和y轴分别旋转-c°、-a°和-z°。由于是在局部坐标系内的变换,最后transform的欧拉角的各个分量值并不一定等于-a、-b或-c。

Lerp方法 和 Slerp方法

1、public static Quaternion Lerp(Quaternion form, Quaternion to,float t);

2、public static Quaternion Slerp(Quaternion form, Quaternion to,float t);

两种方法的作用都是返回从form到to的插值。当参数t<=0时返回值为from,当参数t>=1时返回值为to。其中Lerp是线性差值,而Slerp是球面插值。

        Quaternion q1 = Quaternion.LookRotation(new Vector3(0, 0, 1));Quaternion q2 = Quaternion.LookRotation(new Vector3(0, 0, -1));m_speed += Time.deltaTime * 0.1f;if (m_speed > 1){m_speed = 1;}m_cube0.rotation = Quaternion.Lerp(q1, q2, m_speed);    // 线性m_cube1.rotation = Quaternion.Slerp(q1, q2, m_speed);   // 球面

RotateToWards方法

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

该方法也是一个插值方法,即从返回参数from到to的插值,且返回值的最大角度不超过maxDegreesDelta。maxDegreesDelta是角度值,不是插值系数,当maxDegreesDelta < 0时,将进行逆向插值即从to到from的方向进行插值计算。

        Quaternion q1 = Quaternion.LookRotation(new Vector3(0, 0, 1));Quaternion q2 = Quaternion.LookRotation(new Vector3(0, 0, -1));m_speed += Time.deltaTime;m_cube0.rotation = Quaternion.RotateTowards(q1, q2, m_speed);


Quaternion类运算符

Quaternion类涉及到两个Quaternion对象相乘和Quaternion对象与Vector3对象相乘,那么就必须重载"*"运算符。

1、public static Quaternion operator *(Quaternion lhs, Quaternion rhs);

2、public static Vector3 operator *(Quaternion rotation, Vector3 point);


两个Quaternion对象相乘

对于两个Quaternion对象相乘主要用于自身旋转变换,例如:

B.rotation *= A.rotation;

B会绕着B的局部坐标系的z、x、y轴按照先绕z轴再绕x轴最后绕y轴的旋转次序,分别旋转A.eulerAngles.z度、A.eulerAngles.x度、和A.eulerAngles.y度。由于是绕着局部坐标系进行旋转,所以当绕着其中一个轴进行旋转时,可能会影响其余两个坐标轴方向的欧拉角(除非其余两轴的欧拉角都为0才不会受到影响)。

        Quaternion q1 = Quaternion.Euler(10, 10, 10);Quaternion q2 = Quaternion.identity;q2 *= q1;Debug.Log(q2.eulerAngles);q2 *= q1;Debug.Log(q2.eulerAngles);

Quaternion对象与Vector3对象

对于Quaternion对象与Vector3对象相乘主要用于自身移动变换,例如

transform.position += tansform.rotation * A;

其中A为Vector3的对象。transform对应的对象会沿着自身坐标系中向量A的方向移动A的模长的距离。transform.rotation与A相乘可以确定移动的方向和距离。

Unity Quaternion相关推荐

  1. 【Unity】6.8 Quaternion类(四元数)

    分类:Unity.C#.VS2015 创建日期:2016-04-20 一.四元数的概念 四元数包含一个标量分量和-个三维向量分量,四元数Q可以记作: Q=[w,(x,y,z)] 在3D数学中使用单位四 ...

  2. Unity中Quaternion的含义及其使用

    官网API文档: file:///Applications/Unity/Unity.app/Contents/Documentation/html/en/ScriptReference/Quatern ...

  3. 浅谈Unity中的rotation和Quaternion的乘法

    动手写游戏以后一个比较切身的体会,就是实际操作能检验很多语言的细节,也许平时看API文档,或者看一些教程的时候并没有深刻的体会,因为大多情况下你只知道了该怎么做,却不知道为什么要这么做,或者怎么想到这 ...

  4. 【Unity】旋转Vector3和Quaternion

    [Unity]旋转Vector3和Quaternion 旋转Vector3 计算一个Vector3绕指定轴旋转指定角度后所得到的向量. /// <summary> /// 计算一个Vect ...

  5. 《UnityAPI.Quaternion四元数》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Quaternion+Angle+Dot+Euler+立钻哥哥++OK++)

    <UnityAPI.Quaternion四元数> 版本 作者 参与者 完成日期 备注 UnityAPI_Quaternion_V01_1.0 严立钻 2020.07.10 #<Uni ...

  6. 面向组件编程之Unity 11.Quaternion.LookRotation 转自lijing_hi

    此函数作用是生成一个四元数表示的三维朝向,然后可以直接把这个朝向赋给游戏对象来变更其朝向,也可以通过线性插值(Quaternion.Slerp 和 Quaternion.Lerp)来实现游戏对象从当前 ...

  7. Unity旋转值Quaternion交换旋转轴

    最近项目上用到一款AR眼镜,其陀螺仪的给出的旋转值与预期有差异.如戴上眼镜左右转动头部时,视角却是沿着脸部朝前的轴旋转的.经过整理发现陀螺仪与Unity相机各轴正确对应关系如下: x(陀)->- ...

  8. unity初识之Quaternion和旋转

    与之前做2d游戏不一样,3d游戏中,角度变换,用四元数来表示和计算 什么是欧拉角 四元数 欧拉旋转 一个女生的文章 unity对于四元数的定义 在学习3d数学或者学习shader的书籍里,都会有一章是 ...

  9. 【Unity技巧】四元数(Quaternion)和旋转

    四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...

最新文章

  1. tensorflow问题
  2. C++Primer笔记之复制控制
  3. 帷幕的帷是什么意思_“战斗民族”的鲜花礼品凭什么火遍全球?
  4. iOS之深入解析WKWebView加载的生命周期与代理方法
  5. MFC BCGControlBar 库 使用方法
  6. JSON对象转化为JSON字符串
  7. matlab初学者教程_初学者的Hibernate教程
  8. java 按钮垂直居中_WPF按钮中的文本内容未垂直居中
  9. 向量的数量积,向量积,混合积
  10. Python学习教程公开课:好玩的Python
  11. 《Multiobjective Evolutionary Algorithms:A Comparative Case Study and the Strength Pareto Approach》
  12. 第一次软工作业(构建之法)
  13. ElasticSearch教程——proximity match 近似匹配
  14. rm ,rm -rf , rm -f 以及rm 命令的其他参数命令
  15. 北大AI公开课13讲全链接+最强干货盘点:视频+笔记+文字实录
  16. 【nlp学习】中文命名实体识别(待补充)
  17. 国家提的内循环到底是个啥?
  18. 山东电梯维护服务器,山东省质量技术监督局关于建立电梯维护保养单位告知性登记制度的通知...
  19. 禁止查看写好的宏_??智能作业灯T5体验:不在孩子身边,也能辅导小朋友写作业...
  20. 2023上海电力大学计算机考研信息汇总

热门文章

  1. .net core 命令行(仅作记录)
  2. 带头大哥777:为什么现在的 4G 网越来越慢了
  3. Http请求优化之DNS优化
  4. 用eclipse编写html页面,简述Eclipse中的CSS编辑器使用
  5. 黄阶低级 - 《 Java 核心》- 5.1 类、超类和子类(三) - 修改 1 次
  6. 8-zookeeper算法基础(尚硅谷学习笔记)
  7. 解决Parameter ‘MP_OPTLOCK_VERSION_ORIGINAL‘ not found. Available parameters are [param1, et]的问题
  8. C#使用Microsoft.ACE.OLEDB来处理Excel数据
  9. 思维导图 XMind 闯关之路(第07关)插入批注超链接
  10. 《Python编程快速上手》---项目记录(第12章)