Quaternion属性与方法

一,属性:

x、y、z就不说了,只看一个eulerAngles,代码如下:

 public Quaternion rotation = Quaternion.identity;  

 void Start()
{
rotation.eulerAngles = new Vector3(, , );
transform.rotation = rotation;
print(rotation.eulerAngles.y);
}

效果:将物体绕y轴顺时针转30°,效果与transform.eulerAngles相同。物体rotation = (0,30,0)。但是不能直接为transform.rotation.eulerAngle赋值。

二,方法

1,function ToAngleAxis (out angle :float, out axis :Vector3) :void

 public float angle = 0.0F;
public Vector3 axis = Vector3.zero; void Start()
{
transform.eulerAngles = new Vector3(, , );
transform.rotation.ToAngleAxis(out angle, out axis);
print(angle + " " + axis);
}

效果:将物体的旋转角度返回到angles和axis里(物体的z轴和世界坐标z轴的夹角)。
输入:transform.localEulerAngles=(0,0,0);
输出:angle=0, axis=(1,0,0);
输入:transform.localEulerAngles=(0,90,0);
输出:angle=90,axis=(0,1,0);
输入:transform.localEulerAngles=(270,0,0);
输出:angle=90,axis=(-1,0,0)

2,function SetFromToRotation (fromDirection :Vector3, toDirection :Vector3) :void

 private Vector3 _from = Vector3.one;
private Vector3 _to = new Vector3(100f, 200f, 100f);
private Quaternion q;
private Vector3 headUpDir; void Start()
{
q.SetFromToRotation(_from, _to);
transform.rotation=q;
headUpDir=transform.TransformDirection(Vector3.forward);
}

效果:把物体的fromDirection旋转到toDirection
输入:a=Vector3(0,0,1); b=Vector3(0,1,0)//把z轴朝向y轴
输出: q=(-0.7,0,0,0.7); headUpDir=(0,1,0)
输入:a=Vector3(0,0,1); b=Vector3(1,0,0)//把z轴朝向x轴
输出: q=(0,0.7,0,0.7); headUpDir=(1,0,0)
输入:a=Vector3(0,1,0); b=Vector3(1,0,0)//把y轴朝向x轴
输出: q=(0,0,-0.7,0.7); headUpDir=(0,0,1)

3,function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void

 public Transform obj1;
public Transform obj2;
Quaternion q; void Update()
{
q.SetLookRotation(obj1.position, obj2.position);
transform.rotation = q;
}

效果:类似于LookAt()方法,使物体1始终注视着物体2

4, static operator * (lhs : Quaternion, rhs : Quaternion) : Quaternion

 public Transform extraRotation;  

 void Update()
{
transform.rotation *= extraRotation.rotation;
}

效果:组合旋转lhs和rhs。旋转一个点,首先用lhs,然后用rhs旋转,与使用组合旋转相同。注意旋转不可交换: lhs*rhs不等于rhs*lhs。 我理解旋转的角度就是将*号两边的角度加起来。

5,static operator * (rotation : Quaternion, point : Vector3) : Vector3

效果:将一个向量根据rotation旋转到另一个向量。

6,static function Dot (a : Quaternion, b : Quaternion) : float
效果:将两个Quaternion点乘,返回一个float值,意义待补充。

7,static function AngleAxis (angle : float, axis : Vector3) : Quaternion

效果:将物体绕axis旋转angle度。

8,static function FromToRotation (fromDirection :Vector3, toDirection :Vector3) : Quaternion

 transform.rotation = Quaternion.FromToRotation(Vector3.up, transform.forward);  

效果:跟SetFromToRotation差不多,区别是可以返回一个Quaternion。通常用来让transform的一个轴向(例如 y轴)与toDirection在世界坐标中同步。

9,static function LookRotation (forward :Vector3, upwards :Vector3 =Vector3.up) : Quaternion

效果:跟SetLootRotation差不多,区别是可以返回一个Quaternion。

10,static function Slerp (from : Quaternion, to : Quaternion, t :float) : Quaternion

 public Transform from;
public Transform to;
public float speed = 0.1F;
void Update() {
transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.time * speed);
}

效果:球面插值,插值不是等角速度的,而是变速的。 会有越来越慢的感觉。

11,static function Lerp (from : Quaternion, to : Quaternion, t :float) : Quaternion

效果:与Slerp效果差不多,效率比Slerp高但是如果from和to相差过大效果会不好,会返回一个标准化的Quaternion。

12,static function RotateTowards (from : Quaternion, to : Quaternion, maxDegreesDelta :float) : Quaternion

效果:旋转一个角度从from向to。与Slerp基本相同,但这个函数的角速度永远不会超过maxDegreesDelta。负的maxDegreesDelta值将使旋转远离to。

13,static function Inverse (rotation : Quaternion) : Quaternion

效果:返回反向的旋转。

14,static function Angle (a : Quaternion, b : Quaternion) :float

 public Transform target;
void Update(){
float angle = Quaternion.Angle(transform.rotation, target.rotation);
}

效果:返回a和b两者之间的角度。

15,static function Euler (x :float, y :float, z :float) : Quaternion .

 public Quaternion rotation = Quaternion.Euler(, , ); 

效果:把旋转角度变成对应的Quaternion。

三,实例

 var target : Transform;
var edgeBorder = 0.1;
var horizontalSpeed = 360.0;
var verticalSpeed = 120.0;
var minVertical = 20.0;
var maxVertical = 85.0; private var x = 0.0;
private var y = 0.0;
private var distance = 0.0; function Start()
{
x = transform.eulerAngles.y;
y = transform.eulerAngles.x;
distance = (transform.position - target.position).magnitude;
} function LateUpdate()
{
var dt = Time.deltaTime;
x -= Input.GetAxis("Horizontal") * horizontalSpeed * dt;
y += Input.GetAxis("Vertical") * verticalSpeed * dt; y = ClampAngle(y, minVertical, maxVertical); var rotation = Quaternion.Euler(y, x, 0);
var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
//print(rotation + " && " + rotation * Vector3(0.0, 0.0, -distance));
transform.rotation = rotation;
transform.position = position;
} static function ClampAngle (angle : float, min : float, max : float) {
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
}

非常有意思的一个例子,来自Unity官方工程ShadowDemoProject,效果是可以通过键盘使摄像机围绕一点自由旋转,类似于在一个球面上运动。

 var position = rotation * Vector3(0.0, 0.0, -distance) + target.position; 

这一句非常有意思,也很难理解,完全理解了这一句后,Quaternion在你手里会变的非常强大!

Unity3D Quaternion各属性和函数测试的更多相关文章

  1. Unity3D Quaternion各属性和函数測试

    Quaternion属性与方法 一,属性: x.y.z就不说了,仅仅看一个eulerAngles.代码例如以下: public Quaternion rotation = Quaternion.ide ...

  2. 【转】Unity3D Transform中有关旋转的属性和方法测试

    Transform有关旋转个属性和方法测试 一,属性 1,var eulerAngles : Vector3 public float yRotation = 5.0F; void Update()  ...

  3. Unity3D中自带事件函数的执行顺序(转)

    原文:http://www.jianshu.com/p/1d93ece664e2 在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行.其执行顺序如下: 编辑器(E ...

  4. Unity3D中自带事件函数的执行顺序

    在Unity3D脚本中,有几个Unity3D自带的事件函数按照预定的顺序执行作为脚本执行.其执行顺序如下: 编辑器(Editor) Reset:Reset函数被调用来初始化脚本属性当脚本第一次被附到对 ...

  5. Unity3D中Mathf数学运算函数总结

    引入: 看到一个案例注意到函数Mathf.SmoothDamp的使用,游戏中用于做相机的缓冲跟踪和boss直升机跟踪士兵.该函数是Unity3D中Mathf数学运算函数中的一个.一些游戏使用了smoo ...

  6. JS---最终版本--封装缓动(变速)动画函数---增加任意多个属性&回调函数&层级&透明度

    封装缓动(变速)动画函数---增加任意多个属性&回调函数&层级&透明度 相较之前的,增加了2个判断,第一个判断是不是透明度,第二个判断是不是zindex, 都不是,就只是普通属 ...

  7. 经典笔试题:用C写一个函数测试当前机器大小端模式

    “用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...

  8. LoadRunner调用java函数测试oracle

    LoadRunner调用java函数测试oracle 测试oracle的方法有很多,可以使用loadrunner的oracle协议直接调用oracle进行测试,也可以调用开发的java程序对oracl ...

  9. Delphi XE2 之 FireMonkey 入门(28) - 数据绑定: TBindingsList: 表达式函数测试: SelectedText()、CheckedState()

    Delphi XE2 之 FireMonkey 入门(28) - 数据绑定: TBindingsList: 表达式函数测试: SelectedText().CheckedState() 示例构想: 用 ...

随机推荐

  1. 【设计模式 - 1】之工厂模式(Factory)

    1      模式简介 1.1    工厂模式作用 工厂模式解决的是"使用new关键字获取对象造成松耦合"的问题. 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏 ...

  2. 提高你30%的设计效率的PPT快捷键

    在编辑幻灯片的状态下: [Ctrl]+[A]选择全部对象或幻灯片 [Ctrl]+[B]应用(解除)文本加粗 [Ctrl]+[C]复制 [Ctrl]+[D]快速复制对象 [Ctrl]+[E]段落居中对齐 ...

  3. TColorPickerButton组件

    http://files.cnblogs.com/xe2011/VCL_TColorPB12.rar 在DELPHI7中可以正常使用 在DELPHI XE5中 下面会有些问题 安装方法 打开 DELP ...

  4. linux lsof命令详解

    linux lsof命令详解 简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访 ...

  5. linux中history命令使用与配置

    history中设置显示命令的执行时间 vi /root/.bashrc HISTTIMEFORMAT="%Y-%M-%D %H:%M:%S" export HISTTIMEFOR ...

  6. 9.26 noip模拟试题

    魔术球问题弱化版(ball.c/.cpp/.pas) 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的球. (1)每次只能在某根柱子的最上面放球. (2) ...

  7. ASP.NET-FineUI开发实践-16(一)

    还是基础的东西,grid全选没有事件,给加个事件,除了需要会复制粘贴外还要点推荐那!   第一步:原理  事件被触发,方法被实现. 对于全选事件,被触发有两种方式可写,一个是通过原生extjs方式触发 ...

  8. postgresql jsonb类型查询

    select * from (select * from ud_order where user_id=10 and status=2unionselect * from ud_order where ...

  9. CentOS 7重装mysql编译过程报错解决方法

    错误记录: [ 82%] Building C object libmysql/CMakeFiles/clientlib.dir/__/sql-common/client.c.o/usr/local/ ...

  10. 如何管理你的 Javascript 代码

    今天不聊技术的问题,咱们来聊聊在前端开发中如何管理好自己的 Javascript 代码.首先,咱们先来说说一般都有哪些管理方式?我相信  seajs . requirejs  对于前端开发者而言都不陌 ...