Quaternion属性与方法

一,属性:

x、y、z就不说了,仅仅看一个eulerAngles。代码例如以下:

  1. public Quaternion rotation = Quaternion.identity;  
  2.   
  3. void Start()  
  4. {  
  5. rotation.eulerAngles = new Vector3(0, 30, 0);  
  6. transform.rotation = rotation;  
  7. print(rotation.eulerAngles.y);  
  8. }  

效果:将物体绕y轴顺时针转30°,效果与transform.eulerAngles同样。

物体rotation = (0,30,0)。可是不能直接为transform.rotation.eulerAngle赋值。

二。方法

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

  1. public float angle = 0.0F;  
  2. public Vector3 axis = Vector3.zero;  
  3.   
  4. void Start()  
  5. {  
  6. transform.eulerAngles = new Vector3(0, 90, 0);  
  7. transform.rotation.ToAngleAxis(out angle, out axis);  
  8. print(angle + " " + axis);  
  9. }  

效果:将物体的旋转角度返回到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

  1. private Vector3 _from = Vector3.one;  
  2. private Vector3 _to = new Vector3(100f, 200f, 100f);  
  3. private Quaternion q;  
  4. private Vector3 headUpDir;  
  5.   
  6. void Start()  
  7. {  
  8. q.SetFromToRotation(_from, _to);  
  9. transform.rotation=q;  
  10. headUpDir=transform.TransformDirection(Vector3.forward);  
  11. }  

效果:把物体的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

  1. public Transform obj1;  
  2. public Transform obj2;  
  3. Quaternion q;  
  4.   
  5. void Update()  
  6. {  
  7. q.SetLookRotation(obj1.position, obj2.position);  
  8. transform.rotation = q;  
  9. }  

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

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

  1. public Transform extraRotation;  
  2.   
  3. void Update()  
  4. {  
  5. transform.rotation *= extraRotation.rotation;  
  6. }  

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

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

  1. Vector3 relativeDirection = Vector3.forward;  
  2. Vector3 absoluteDirection;  
  3.   
  4. void Update () {  
  5. absoluteDirection = transform.rotation * relativeDirection;  
  6. transform.position += absoluteDirection * Time.deltaTime;  
  7. }  

效果:将一个向量依据rotation旋转到还有一个向量。

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

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

  1.  void Start(){  
  2.         transform.rotation = Quaternion.AngleAxis(30, Vector3.up);  
  3. }  

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

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

  1. 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 

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

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

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

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

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

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

  1. public Quaternion rotation = Quaternion.Euler(0, 30, 0);  

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

三,实例

  1. var target : Transform;  
  2. var edgeBorder = 0.1;  
  3. var horizontalSpeed = 360.0;  
  4. var verticalSpeed = 120.0;  
  5. var minVertical = 20.0;  
  6. var maxVertical = 85.0;  
  7.   
  8. private var x = 0.0;  
  9. private var y = 0.0;  
  10. private var distance = 0.0;  
  11.   
  12. function Start()  
  13. {  
  14.     x = transform.eulerAngles.y;  
  15.     y = transform.eulerAngles.x;  
  16.     distance = (transform.position - target.position).magnitude;  
  17. }  
  18.   
  19. function LateUpdate()  
  20. {  
  21.     var dt = Time.deltaTime;  
  22.     x -= Input.GetAxis("Horizontal") * horizontalSpeed * dt;  
  23.     y += Input.GetAxis("Vertical") * verticalSpeed * dt;  
  24.       
  25.     y = ClampAngle(y, minVertical, maxVertical);  
  26.        
  27.     var rotation = Quaternion.Euler(y, x, 0);  
  28.     var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;  
  29.     //print(rotation + " && " + rotation * Vector3(0.0, 0.0, -distance));  
  30.     transform.rotation = rotation;  
  31.     transform.position = position;  
  32. }  
  33.   
  34. static function ClampAngle (angle : float, min : float, max : float) {  
  35.     if (angle < -360)  
  36.         angle += 360;  
  37.     if (angle > 360)  
  38.         angle -= 360;  
  39.     return Mathf.Clamp (angle, min, max);  
  40. }  

很有意思的一个样例,来自Unity官方projectShadowDemoProject,效果是能够通过键盘使摄像机环绕一点自由旋转。相似于在一个球面上运动。

  1. 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.identi ...

  2. eclipse下的ssh框架整合过程及測试

    最近在搭建Stuts2+hibernate+spring的框架,网上看的教程,大部分都是非常easy的步骤.没有比較具体的步骤以及每一个步骤完毕之后怎样检查是否配置成功.下面是笔者依据自己搭建的过程进 ...

  3. Jmeter接口測试

    一.创建project.引包 1.创建JAVAproject 2.引入Jmeter中lib\ext基础包:ApacheJMeter_java.jar.ApacheJMeter_core.jar 3.引 ...

  4. JMeter 压力測试使用函数和 CSV 文件參数化 json 数据

            在 http Load Testing 中.json 数据的提交是个让人头疼的问题.本文具体介绍怎样进行 JMeter 的 json 測试提交,以及怎样将其參数化.        St ...

  5. C++高精度性能測试函数

    在实际software开发工作中.我们常常会測试某个module或者function的执行效率.或者是某个算法的时间复杂度(尽管时间复杂度一定程度上依赖于机器性能.但在同一台computer上,经过算 ...

  6. python第三方库系列之十九--python測试使用的mock库

    一.为什么须要mock         在写unittest的时候,假设系统中有非常多外部依赖,我们不须要也不希望把全部的部件都执行一遍.比方,要验证分享到微博的功能,假设每次測试的时候都要真实地把接 ...

  7. DLL程序的创建步骤和測试程序

    首先,创建DLL程序 然后,加入一个导出类 比如: //Test.h #pragma once class AFX_EXT_CLASS Test { public:  Test(void);  ~Te ...

  8. 在Eclipse中使用JUnit4进行单元測试(0基础篇)

    本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...

  9. [WebGL入门]十九,遮挡剔除和深度測试

    注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外.鄙人webgl研究还不够深入,一些专业词语,假设翻译有误.欢迎大家指 ...

随机推荐

  1. C++ operator关键字(重载操作符)

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名.     这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面 ...

  2. 微信小程序 - IOS 仿饿了么"我的",下拉橡皮筋效果

    这个需求是在wepy交流群里有群友提到的. 一个小花样. 注册mixins /** * IOS专用 顶部下拉橡皮筋效果 * 安卓的Page在到达顶部的时候,不能继续下拉...略过 * * 效果见 饿了 ...

  3. JavaScript的gzip静态压缩方法记录

    传统的JS压缩(删除注释,删除多余空格等)提供的压缩率有时还是不尽不意,幸亏现在的浏览器都支持压缩传输(通过设置http header的Content-Encoding=gzip),可以通过服务器的配 ...

  4. WHERE 子句用于规定选择的标准。

    WHERE 子句 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句. 语法 SELECT 列名称 FROM 表名称 WHERE 列 运算符 值 下面的运算符可在 WHERE ...

  5. 负margin应用案例几则(转载+总结)

    (一)自适应布局——左栏改右栏 这里先写个一列固定列宽,另一列自适应的两列布局,效果图: 侧栏移至右边,效果图: 其HTML <div class="wrap"> &l ...

  6. SSH开发环境整合搭建

    1.建立动态web工程,加入必要的jar包. antlr-2.7.7.jar asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar c3p0-0.9.1.2 ...

  7. pychram最新注册码

    2016年的激活码只能用到2017.2.25,于昨日已经过期了. 现提供最新激活码: BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZW ...

  8. VC++ 窗口拆分CSplitterWnd

    前言         当前许多优秀的软件都采用“多视”技术. 所谓“多视”,是指在同一个框架窗口里同时显示多个视图. 通过运用这种技术,可以在框架的有限控件内同时提供用户更大的信息量,并且使得用户界面 ...

  9. CENTOS --5分钟搞定Nginx安装的教程

    1. 安装gcc(centos 7之后一般已自带,可以在第6步失败后再安装) yum install gcc gcc-c++ 2. 安装pcre yum install -y pcre pcre-de ...

  10. m2014-software->Word2010发布博客文章至Cnblogs

    转自:http://www.cnblogs.com/xfiver/archive/2011/12/26/2301591.html 昨夜喝醉,今天早起梳理情绪,看下如何使用word2010直接写cnbl ...