纳金网

标题: Quaternion 学习与应用(一) [打印本页]

作者: 会飞的鱼    时间: 2011-11-16 15:53
标题: Quaternion 学习与应用(一)


           今天准备学习和研究下unity3d的四元数 Quaternion
         

           四元数在电脑图形学中用于表示物体的旋转,在unity中由x,y,z,w 表示四个值。
         

           四元数是最简单的超复数。 复数是由实数加上元素 i 组成,其中i^2 = -1 ,。 相似地,四元数都是由实数加上三个元素 i、j、k 组成,而且它们有如下的关系: i^2 = j^2 = k^2 = ijk = -1 , 每个四元数都是 1、i、j 和 k 的线性组合,即是四元数一般可表示为a + bi + cj + dk ,。
         

           具体的四元数知识可从百度、维基等网站了解。
         


            http://baike.baidu.com/view/319754.htm
           


           现在只说说在unity3D中如何使用Quaternion来表达物体的旋转。
         

           基本的旋转我们可以用脚本内置旋转函数transform.Rotate()来实现。
         

           function Rotate (eulerAngles : Vector3, relativeTo : Space = Space.Self) : void
         

           但是当我们希望对旋转角度进行一些计算的时候,就要用到四元数Quaternion了。我对高等数学来说就菜鸟一个,只能用最朴素的方法看效果了。
         

           Quaternion的变量比较少也没什么可说的,大家一看都明白。唯一要说的就是xyzw的取值范围是[-1,1],物体并不是旋转一周就所有数值回归初始值,而是两周。
         

           初始值: (0,0,0,1)
         

           沿着y轴旋转:180°(0,1,0,0) 360°(0,0,0,-1)540°(0,-1,0,0) 720°(0,0,0,1)
         

           沿着x轴旋转:180°(-1,0,0,0) 360°(0,0,0,-1)540°(1,0,0,0) 720°(0,0,0,1)
         

           无旋转的写法是Quaternion.identify
         

           现在开始研究Quaternion的函数都有什么用。
         

           函数
         

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

           Description
         

           Converts a rotation to angle-axis representation
         

           这个函数的作用就是返回物体的旋转角度(物体的z轴和世界坐标z轴的夹角)和三维旋转轴的向量到变量out angle 和out axis
         

           脚本:
         

           var a=0.0;
         

           var b=Vector3.zero;
         

           transform.rotation.ToAngleAxis(a,b);
         

           输入:transform.localEularAngles=(0,0,0);
         

           输出: a=0, b=(1,0,0);
         

           输入:transform.localEularAngles=(0,90,0);
         

           输出:a=90, b=(0,1,0);
         

           输入:transform.localEularAngles=(270,0,0);
         

           输出:a=90, b=(-1,0,0)
         

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

           Description
         

           Creates a rotation which rotates from fromDirection to toDirection.
         

           这个函数的作用是把物体的fromDirection旋转到toDirection
         

           脚本:
         

           var a:Vector3;
         

           var b:Vector3;
         

           var quaternion;
         

           var headUpDir:Vector3;
         

           q.SetFromToRotation(a,b);
         

           transform.rotation=q;
         

           headUpDir=transform.TransformDirection(Vector3.Forward);
         

           输入: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
         

           Description
         

           Creates a rotation that looks along forward with the the head upwards along upwards
         

           Logs an error if the forward direction is zero.
         

           这个函数建立一个旋转使z轴朝向view  y轴朝向up。这个功能让我想起了Maya里的一种摄像机lol,大家自己玩好了,很有趣。
         

           脚本:
         

           var obj1: Transform;
         

           var obj2: Transform;
         

           var quaternion;
         

           q.SetLookRotation(obj1.position, obj2.position);
         

           transform.rotation=q;
         

           然后大家拖动obj1和obj2就可以看到物体永远保持z轴朝向obj1, 并且以obj2的位置来保持y轴的倾斜度。
         

           傻逗我玩了半天 哈哈^^ 这个功能挺实用的。
         

           4)function ToString () : string
         

           Description
         

           Returns a nicely formatted string of the Quaternion
         

           这个一般用不着吧?看不懂的一边查字典去~
         

作者: tc    时间: 2012-3-30 23:21
水。。。

作者: 菜刀吻电线    时间: 2012-4-14 23:21
心中有爱,爱咋咋地

作者: 菜刀吻电线    时间: 2012-4-21 23:25
不错啊 经典

作者: C.R.CAN    时间: 2012-4-21 23:26
我就看看,我不说话

作者: tc    时间: 2012-5-5 23:18
佩服,好多阿 ,哈哈

作者: 奇    时间: 2012-5-27 23:26
先垫一块,再说鸟

作者: C.R.CAN    时间: 2012-7-20 23:27
加精、加亮滴铁子,尤其要多丁页丁页

作者: 奇    时间: 2012-7-22 23:25
俺是新人,这厢有礼了!

作者: 驰骋的风    时间: 2012-7-24 09:35
高手速来赐教!kismet里面怎么加一个延迟DELAY??



unity特效大家PP_武功盖世呀








【严重分享】Unity3D_3.0破解版[安装包][下载]






高手请赐教!用模型做的特效动画材质丢失








antares_universe(vizio)可视化编辑

作者: 菜刀吻电线    时间: 2012-9-7 23:26
“再次路过……”我造一个-----特别路过

作者: C.R.CAN    时间: 2013-2-13 23:32
读铁系缘分,顶铁系友情





欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5