【Unity】6.8 Quaternion类(四元数)

分类:Unity、C#、VS2015

创建日期:2016-04-20

一、四元数的概念

四元数包含一个标量分量和—个三维向量分量,四元数Q可以记作:

Q=[w,(x,y,z)]

在3D数学中使用单位四元数来表示旋转,对于三维空间中旋转轴为n,旋转角度为a的旋转,如果用四元数表示,四个分量分别为:

w=cos(a/2)

x=sin(a/2)cos(bx)

y=sin(a/2)cos(by)

z=sin(a/2)cos(bz)

其中bx、by、bz分别为旋转轴的x,y,z分量。

从上面的描述中可以看到四元数表示的旋转并不直观。另外,还可以用欧拉角和矩阵表示旋转。但是每—种表示方法都有真各自的优缺点,下图简单地对这3种旋转的表示方法进行了对比:

由于3种表示旋转的方法都有各自的优缺点,所以在开发过程中需要根据实际需求选择不同的方法。

二、Quaternion类

在Unity中,四元数使用Quaternion类来表示。

下图是Quaternion类提供的变量:

下图是Quaternion类提供的函数:

下面的C#代码演示了如何让某个游戏对象(比如Cube)绕Y轴自转:

float rotateSpeed = 50f; //设置绕y轴自转的速度

void Update()

{

//绕y轴自转

transform.rotation =Quaternion.Euler(0f,rotateSpeed*Time.time,0);

}

三、示例

Transform.rotation为对象在世界坐标系下的旋转,Transform.localRotation为对象在父对象的局部坐标系下的旋转,这两个变量的结果类型均为四元数。因此,只要将四元数的结果赋值给这两个变量(Transform.rotation或者Transform.localRotation),就可以设置游戏对象的旋转了。

下面通过一些例子说明通过四元数控制旋转的基本用法。

1、示例1(Demo8_1_ToAngleAxis.unity)

该例子演示如何得到游戏对象当前旋转的角度-轴。

例子中使用的脚本(AngleAxis.cs)如下:

using UnityEngine;
using System.Collections;
public class ToAngleAxis : MonoBehaviour
{
    public float angle = 0.0f;// 旋转角度
    public Vector3 axis = Vector3.zero;//旋转轴
    void Start()
    {
        transform.rotation.ToAngleAxis(out angle, out axis);
        print(angle);
        print(axis);
    }
}

效果如下图所示:

2、示例2(Demo8_2_QuaternionExample.unity)

下面一行代码演示了如何先将游戏对象的旋转归零:

transform.rotation = Quaternion.identity;

归零后,局部坐标系的坐标轴与世界坐标系的坐标轴是平行的。

该例子把前面的例子综合起来,实现了模拟器太阳升起和落下的过程,同时让对象的前方向朝着target,上方向朝着Vector.up。

效果如下:

3、示例3(Demo8_3_CameraLookAt.unity)

该例子将对象的旋转从from平滑插值到to,以此来模拟摄像机的观察方向从物体a过滤到物体b的效果。

代码如下(CameraLookAt.cs文件):

using UnityEngine;
using System.Collections;

public class CameraLookAt : MonoBehaviour
{
    public Transform from;
    public Transform to;

    //相机观察方向从a过渡到b所需的时间,以秒为单位
    public float tranTime = 20.0f;

    //用于记录开始的时间
    private float startTime;

    void Start()
    {
        startTime = Time.time; // 设置开始时间
    }

    void Update()
    {
        //计算用于插值的系数
        var fracComplete = (Time.time - startTime) / tranTime;
        //平滑插值
        transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, fracComplete);
    }

    Transform[] spawnPoints;

}
时间: 2024-10-09 16:45:31

【Unity】6.8 Quaternion类(四元数)的相关文章

《Unity_API解析》 第八章 Quaternion类

Quaternion又称四元数,由x.y.z和w这4个分量组成,属于struct类型.在Unity中,用Quaternion来存储和表示对象的旋转角度.对于GameObject一般的旋转及移动,可以用Transform中的相关方法实现. Quaternion类实例属性 eulerAngles属性:欧拉角 功能说明 此属性用来返回和设置Quaternion实例对应的欧拉角,说明如下. 1.对GameObject对象的Transform进行欧拉角的变换次序是,zxy轴依次旋转.不同的旋转次序得到的最

Unity3D - 详解Quaternion类(一)

一.简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念.四元数的乘法不符合交换律.从明确地角度而言,四元数是复数的不可交换延伸.如把四元数的集合考虑成多维实数空间的话,四元数就代表着一个四维空间,相对于复数为二维空间. 四元数 关于四元数的性质.与旋转的关系.球型线性插值的介绍,请阅读3D游戏与计算机图形学中的数学方法-四元数,在此不多做介绍.下面主要介绍的是Unity中的四元数-Quaternion. 在Unity

Unity3D - 详解Quaternion类(二)

OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler方法.FromToRotation方法.Inverse方法.Lerp方法.LookRotation方法.RotateToWards方法和Slerp方法.关于静态的方法的使用就是直接用类名调用其静态方法,例如Quaternion.Angle(q1,q2);下面对这些静态方法做下分析. 1.Angle方

Quaternion:通过API对Quaternion(四元数)类中的方法属性进行测试(一)

1.差值方法Lerp 返回一个四元数,返回From与To的差值,并以Time.detaltime*speed变化着 Quaternion.Lerp(From.rotation,To.Rotation,Time.detaltime*speed); 例如 以下代码中C,D将以A.Rotation为起始点,以B.rotation为结束点以total为速度进行变化 using UnityEngine; using System.Collections; pubilc class Eaxmble:Mono

Unity API 解析(8)—— Quaternion 类

四元数 -- 由x,y,z 和 w 这4个分量组成,属于struct 类型 用来存储和表示对象的选择角度   eulerAngles 属性 -- 欧拉角 对GameObject 对象的Transform进行欧拉角的变换次序是,先绕z轴旋转相应的角度,再绕x轴旋转相应的角度,最后y轴 -- 不同的旋转次序得到的最终状态不同 using UnityEngine; using System.Collections; public class EulerAngle_ts : MonoBehaviour

Unity中的Matrix4x4类

物体平移旋转一般变换底层都是用矩阵来表示的,一般不会用到这个类.有时候需要一些世界坐标与局部坐标转换的时候,可能就要用到了. 1 //创建平移 旋转 缩放矩阵 可以理解为一个坐标系(不知道对不对..) 2 Matrix4x4 mat = Matrix4x4.TRS(new Vector3(1,1,1),Quaternion.Euler(0,90,0),Vector3.one); 3 //得到在这个坐标系点(2,2,2)在世界坐标系的坐标 4 print(mat.MultiplyPoint(new

使用Doxygen + graphviz生成Unity 3d的UGUI类图

下载软件 1) Graphviz,下载地址:http://download.csdn.net/detail/u010953266/8591169 为什么不用官网?一是下载速度慢,二是下载到本地的文件貌似是有损坏的,每次安装都报错,后来直接放弃了,从其它地方搜到的: 2)Doxygen,下载地址:https://sourceforge.net/projects/doxygen/ 3)Unity UGUI的源码,下载地址:https://bitbucket.org/Unity-Technologie

【Unity】常用脚本类的继承关系(入门篇)

前言 学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略. 本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://blog.csdn.net/duzixi Unity常用脚本类继承关系图 对Unity开发稍有了解的朋友都知道,在Unity开发框架中有4个基本层次:工程(应用程序).场景.游戏对象和组件. 在脚本中,整个应用程序和场景由Application类控制:而游戏对象和组件类均继承于Object类. 在Object

【Unity】10.4 类人动画角色的控制

分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 导入角色网格和动画及设置 Avatar 之后,就可以准备开始在游戏中使用它们了.以下部分涵盖 Mecanim 提供的.用于控制及排序动画的主要功能. 二.循环动画片段 使用动画的一个常见操作是确保动画正确循环.例如,表示走路循环的动画片段以类似的姿势开始.结束非常重要(如开始时左脚在地面上,结束时右脚在地面上),这样才能确保不会出现脚滑动或奇怪的不稳定动作.Mecanim为解决此问题提供了方便的工具,让动画片段可基于