分类: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;}

【Unity】6.8 Quaternion类(四元数)相关推荐

  1. Unity API常用方法和类

    什么是API?--预先设置好的编程接口 事件函数及常用脚本 事件函数的执行顺序 具体可参考:docs.unity.cn/cn/current/Manual/ExecutionOrder.html *函 ...

  2. Unity API常用方法和类的解析

    一.事件函数执行的先后顺序 FixedUpdate每秒执行固定次数,应该将处理跟物理相关的运动的代码放在FixedUpdate中. Update和LateUpdate跟硬件和代码性能有关,每秒执行次数 ...

  3. unity初识之Quaternion和旋转

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

  4. Unity3D - 详解Quaternion类

    一.简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念.四元数的乘法不符合交换律.从明确地角度而言,四元数是复数的不可交 ...

  5. Unity3D - 详解Quaternion类[转载]

    一.简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念.四元数的乘法不符合交换律.从明确地角度而言,四元数是复数的不可交 ...

  6. Quaternion类之美

    Quaternion类 Quaternion类又称四元数,由x, y, z, w 4个分量组成,属于struct类型. Unity中用其存储和表示对象的旋转角度 Quaternion的变换较为复杂,对 ...

  7. About The Quaternion 有关四元数

    About The Quaternion 有关四元数 I took many days to try to understand anything about Quaternion but got n ...

  8. Unity API常用方法和类学习笔记2

    Unity API常用方法和类学习笔记2 ------Mathf & Input & Vector & Random 类Mathf 一.静态变量 print(Mathf.Deg ...

  9. Unity游戏存档-PlayerPrefs类

    对于游戏存档除了XML,Json,Sqlite,unity提供了一个类可以用来存储数据,那就是PlayerPrefs. 这个类对应的API如下 Class Functions类函数 SetInt Se ...

最新文章

  1. 对象分割--Instance-sensitive Fully Convolutional Networks
  2. php 表单提交2次,微信开发之php表单微信中自动提交两次问题解决办法
  3. elasticsearch 索引存储深入详解
  4. 软件开发报价的计算方法[转载]
  5. js 多个input值拼接json字符串
  6. STM32F103单片机modbus通信示例
  7. python和c 的区别-C++/C/JAVA/Python之间的区别?
  8. 线性基(bzoj 2460: [BeiJing2011]元素)
  9. 三维全景技术的基本原理,三维全景虚拟现实图片应用
  10. VMware虚拟机安装使用及系统安装教程
  11. CentOS在ssh远程重装系统的步骤
  12. css彩虹·,web前端入门到实战:纯CSS画动态彩虹
  13. 给大家介绍一个PDF图书下载网站,还有TXT图书下载
  14. 超全的学习资料——Oracle 从入门到精通
  15. 张飞硬件MOSFET驱动电路_sdchguyi_新浪博客
  16. 查看当前目录和上一级目录的命令
  17. springboot集成邮箱配置ssl或tls协议
  18. android系统允许icon角标,安卓手机角标显示方案
  19. 一个执行计划异常变更的案例 - 外传之SQL Profile(上)
  20. 招商银行-FinTech精英训练营初赛-编程题

热门文章

  1. 5G NR中的两套绝对频域位置:GSCN和ARFCN
  2. ORA-01855: AM/A.M. or PM/P.M. required问题排查与解析
  3. Index of school
  4. HTTP缓存及其使用
  5. jQuery 效果 - 动画 animate() 方法
  6. window版docker安装及配置
  7. css垂直居中如何实现
  8. Node.js基础知识普及
  9. LeetCode--Factorial Trailing Zeroes(注意)
  10. java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextAware