【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; }
【Unity】6.8 Quaternion类(四元数)的更多相关文章
- Unity3D - 详解Quaternion类(一)
一.简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念.四元数的乘法不符合交换律.从明确地角度而言,四元数是复数的不可交 ...
- Unity3D - 详解Quaternion类(二)
OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler ...
- Quaternion:通过API对Quaternion(四元数)类中的方法属性初步学习总结(二)
1.RotateTowards方法 RotateTowards(From.rotation,To.rotation,fspeed) 个人理解:使From的rotation以floatspeed为速度, ...
- 用C++实现一个Quaternion类
提要 四元素是游戏开发中经常使用的用于处理旋转的数学工具,以下就用C++来实现一个四元素类.參考Unity中四元素的接口. 假设没有看之前的 彻底搞懂四元数. 建议先看一下. 代码清单 Quatern ...
- Unity中的Matrix4x4类
物体平移旋转一般变换底层都是用矩阵来表示的,一般不会用到这个类.有时候需要一些世界坐标与局部坐标转换的时候,可能就要用到了. //创建平移 旋转 缩放矩阵 可以理解为一个坐标系(不知道对不对..) M ...
- Unity Singleton 单例类(Unity3D开发之二十)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/47335197 ...
- Unity中对系统类进行扩展的方法
Unity扩展系统类,整合简化代码 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
- 使用Doxygen + graphviz生成Unity 3d的UGUI类图
下载软件 1) Graphviz,下载地址:http://download.csdn.net/detail/u010953266/8591169 为什么不用官网?一是下载速度慢,二是下载到本地的文件貌 ...
- [Unity移动端]Touch类
Touch类的信息只能在移动端(触摸屏)上能够获取,在编辑器上是不能获取到的.因此,为了方便测试,可以打包apk后在模拟器上跑: unity打包apk:https://www.jianshu.com/ ...
随机推荐
- SQL SERVER 2008 “阻止保存要求重新创建表的更改”
在SQL SERVER2008中,新建数据表以后,若再对该表进行更改,则会出现警告信息“不允许保存更改 阻止保存要求重新创建表的更改”,等等,需要进行一下设置: 工具--->选项--->D ...
- 【apache】phpstudy中apache 隐藏入口文件index.php (解决no input file specified错误)
步骤: 下面我说下 apache 下 ,如何 去掉URL 里面的 index.php 例如: 你原来的路径是: localhost/index.php/Index/index改变后的路径是: loca ...
- 强力密码暴力破解工具:hydra
语法: hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FIL ...
- 用dockerfile构建基于centos系统的jar包的镜像
实际示例: [root@master01 home-dataline]# ls dataline.jar Dockerfile jdk-8u181-linux-x64.tar.gz [root@mas ...
- ios中图层的ancorPoint
@interface MJViewController () { CALayer *_layer; } @end @implementation MJViewController - (void)vi ...
- E325 注意 发现交换文件
git中的 交换文件应该是保持当前git的session的一种文件. git中,如果出现这个有两种原因: 1.你开了两个git客户端对同一个git仓库进行了操作.如果是这样的话,退出一个.正常退出,不 ...
- Lua编程笔记
迭代器并没有真正的迭代,真正迭代的是for循环.而迭代器为每次迭代提供成功后的返回值. function allwords(f)for line in io.lines do for word in ...
- 【LeetCode】3. Longest Substring Without Repeating Characters (2 solutions)
Longest Substring Without Repeating Characters Given a string, find the length of the longest substr ...
- IP概念盛行的背后:资本在狂欢,电影想哭泣 IP,英文“Intellectual Property”的缩写,直译为“知识产权”。它的存在方式很多元,可以是一个故事,也可以是某一个形象,运营成功的IP可以在漫画、小说、电影、玩具、手游等不同的媒介形式中转换。
IP概念盛行的背后:资本在狂欢,电影想哭泣 IP容易拉投资.谈合作,甚至还能简化宣发途径,越来越多的人涌入了电影这个产业,争抢IP成为他们进入行业的最快捷的方法.IP盛行暴露出的另一个问题是国产电影原 ...
- 命令行修改MySQL数据库密码
通过MySQL命令行来修改MySQL数据库的密码,下面就为您详细介绍如何使用MySQL命令行来修改密码. 格式:mysqladmin -u用户名 -p旧密码 password 新密码 1.给root加 ...