纳金网
标题:
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 q
uaternion;
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 q
uaternion;
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