12 第1页 | 共2 页下一页
返回列表 发新帖
查看: 4331|回复: 11
打印 上一主题 下一主题

Quaternion 学习与应用(一)

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2011-11-16 15:53:00 |只看该作者 |倒序浏览


           今天准备学习和研究下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
         

           这个一般用不着吧?看不懂的一边查字典去~
         
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2012-3-30 23:21:14 |只看该作者
水。。。
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2012-4-14 23:21:18 |只看该作者
心中有爱,爱咋咋地
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2012-4-21 23:25:25 |只看该作者
不错啊 经典
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2012-4-21 23:26:20 |只看该作者
我就看看,我不说话
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2012-5-5 23:18:32 |只看该作者
佩服,好多阿 ,哈哈
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2012-5-27 23:26:50 |只看该作者
先垫一块,再说鸟
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

8#
发表于 2012-7-20 23:27:01 |只看该作者
加精、加亮滴铁子,尤其要多丁页丁页
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

9#
发表于 2012-7-22 23:25:54 |只看该作者
俺是新人,这厢有礼了!
回复

使用道具 举报

3795

主题

2

听众

5万

积分

版主

Rank: 7Rank: 7Rank: 7

纳金币
53202
精华
32

活跃会员 优秀版主 推广达人 突出贡献 荣誉管理 论坛元老

10#
发表于 2012-7-24 09:35:12 |只看该作者
高手速来赐教!kismet里面怎么加一个延迟DELAY??



unity特效大家PP_武功盖世呀








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






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








antares_universe(vizio)可视化编辑
回复

使用道具 举报

12 第1页 | 共2 页下一页
返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-2-6 23:28 , Processed in 0.069655 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部