游戏动画中欧拉角与万向锁的理解(转)

http://blog.csdn.net/huazai434/article/details/6458257

我在2009年5月份左右拜读了《3D数学基础:图形与游戏开发》,当时对欧拉角中万向锁的概念一直是百思不得其解,也从未遇到过这种情况。书上有这样一句话:“如果您从来没有遇到过万向锁情况,你可能会对此感到困惑,而且不幸的是,很难在本书中讲清楚这个问题,你需要亲身经历才能明白。”今天我用3个多小时的时间再次回想了一下这个问题,总算想明白了,现在把思考的结果分享给大家.

下面我想说明四个问题:

1,什么是欧拉角?

2,万向锁是一种什么现象?

3,游戏动画中遇到万向锁时会发生什么?

4,怎样解决万向锁这个问题?

一,什么是欧拉角?

    用一句话说,欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度。

在这里,坐标系可以是世界坐标系,也可以是物体坐标系,旋转顺序也是任意的,可以是xyz,xzy,yxz,zxy,yzx,zyx中的任何一种,甚至可以是xyx,xyy,xzz,zxz等等等等。。。。。。所以说欧拉角多种多样。欧拉角可分为两种情况:

1,静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。

2,动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。

对于分别绕三个坐标轴旋转的情况,下述定理成立:

物体的任何一种旋转都可分解为分别绕三个轴的旋转,但分解方式不唯一。如:

假设绕y轴旋转为heading,绕x轴旋转为pitch,绕z轴旋转为bank,则先heading45°再pitch90°等价于先pitch90°再bank45°。

二,万向锁是一种什么现象?

对于动态欧拉角,即绕物体坐标系旋转。(静态不存在万向锁的问题)无论heading和bank为多少度,只要pitch为±90°(即绕第二个轴的旋转),就会出现万向锁现象。

为了对这一现象有一个感性的认识,请拿起自己的手机(没有?不会吧)和一支笔(用作旋转轴),亲手做如下的几个旋转。

首先确定手机的物体坐标系朝向,为了方便记忆,我们假设z轴与手机屏幕垂直(手机平放于桌面)指向上方,手机较短的一条边为x轴,较长的一条边为y轴(方向由手机尾部指向头部),物体坐标系的原点是手机左下角的顶点。(注意旋转顺序为zyx)

绕z轴旋转任意角度(注意x和y轴也跟着一起旋转),再绕y轴旋转90°,再绕x轴旋转任意角度。通过多次尝试,你会发现一个共同点:z轴永远是水平的,通俗的说,手机永远也不会立起来!本来我们以为手机会指向任何方向,但实际上手机好像是被锁在桌面上,只能指向水平的某个方向,这个现象就称为万向锁。

而如果绕y轴旋转不等于90°(1°也好89°也好),只要选择适当的绕x和z的角度,就可以让手机指向三维空间中的任何一个方向,手机是自由的,也就不会遇到万向锁现象。

三,游戏动画中遇到万向锁时会发生什么?

之所以会出现万向锁现象,本质原因是,当第二次旋转角度为90°时,第三个轴就被转到了与第一个轴相同的方向,因此手机缺失了一个自由度(竖直方向的自由度缺失),只剩下第一个轴和第二个轴的自由度。而只有两个自由度意味着手机的运动被限制在了二维空间中,因此手机永远立不起来。

在游戏中,当角色旋转的动画触发时,角色就会做一系列连续的旋转变换,每一个变换都要用一组欧拉角来表示,但是不可能吧每一个方位的欧拉角都存储起来,因此动画师定义了一系列关键帧,指定关键帧处角色的方位(用一组欧拉角描述),然后计算机根据时间t对这几组欧拉角进行插值,得到一系列欧拉角。

如果pitch不是±90°,就不会出现万向锁现象,插值后的一系列欧拉角完全可以刻画出我们所期望的角色旋转路径。

如果某个关键帧的pitch即绕第二个轴的旋转为90°,就会遇到万向锁,这时手机只能在水平面内旋转,如果动画师指定下一个关键帧手机的方位不是立起来的,没有任何问题,但如果指定的下一个关键帧的方位是立起来的,会出现什么情况呢?

为了能有一个感性的认识,还是以手机为例,下面我指定了四个关键帧,四个关键帧处手机的方位分别用R0,R1,R2,R3四组欧拉角表示(逆时针为正方向,右手法则):

(注意R0处的物体坐标系与世界坐标系的指向是相同的,我假定z轴向上,x轴向右,y轴指向自己的胸口)

绕z轴旋转角度       绕y轴旋转角度      绕x轴旋转角度

R0:                     0                              0                       0

R1:                    90                             0                       0

R2:                    90                            -90                      0

R3:                     0                              0                       90

请先分别对手机做这四个变换,然后记住手机的这四个方位,想象一下你“期望”的连续的动画应该是什么样子的。

简单说明如下:初始时刻,手机位于桌面上,屏幕朝上,手机头部指向你的胸口,然后,手机在桌面内逆时针旋转90°,知道手机头部指向右侧,然后手机的右边开始高起来,直到与桌面垂直,此时手机头部仍然指向右侧,由于R2的第二次旋转是90°,因此手机进入万向锁模式。然后手机应该背对着你,垂直于桌面站立起来,直到手机是竖直的背对你。

但实际情况是否是这样的呢?

你可以自己尝试对这个四个方位角插值,然后进行旋转,看看得到的路径是否和上述我们所期望的相同。

以下是我的尝试:

求出R0 到R1以及R1到R2的插值,然后旋转,完全符合上面的路径。但是再求出R2到R3的几个插值后,旋转得到的路径与期望不符。比如这两个插值:

z:60  y:60  x:30

z:    45     y:45    x:45.

做这两个旋转,你会发现手机与桌面不垂直,也就是R2到R3的路径与期望的发生了偏移。这就是《3D数学基础:图形与游戏开发》中提到的“路径偏移”和“摄像机抖动”。

总结:如果动画师在某个关键帧处指定了会引发万向锁的方位,则下一个关键帧的方位一旦超出了万向锁的约束范围,则这两个关键帧之间的路径就会发生偏移,反映在角色动画上是旋转偏移,反映在镜头控制上就是镜头抖动。

要获得路径偏移的感性认识,可以参考这个视频:这个视频和我的描述有些不同,该视频使用一个称为万向节的奇怪装置解释的,而我是直接用的物体坐标系但路径偏移都是一样的。

http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html

四,怎样解决万向锁这个问题?

出现这个问题的根本原因是在万向锁情况下对欧拉角的插值不是线性的,因此旋转路径发生偏移。

解决方法是:

将欧拉角转换为四元数,对四元数进行slerp即球面线性插值,再将这一系列四元数转换为对应的欧拉角,而后作用于角色。缺点是耗费一定的内存,但角色可以任意旋转,灵活度高。

时间: 2024-10-18 07:19:04

游戏动画中欧拉角与万向锁的理解(转)的相关文章

游戏动画中欧拉角与万向锁的理解

总结:如果动画师在某个关键帧处指定了会引发万向锁的方位,则下一个关键帧的方位一旦超出了万向锁的约束范围,则这两个关键帧之间的路径就会发生偏移,反映在角色动画上是旋转偏移,反映在镜头控制上就是镜头抖动. 要获得路径偏移的感性认识,可以参考这个视频:这个视频和我的描述有些不同,该视频使用一个称为万向节的奇怪装置解释的,而我是直接用的物体坐标系但路径偏移都是一样的. http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html 怎样解决万向锁这个问题? 出现这个问题的

【最终幻想15 国王之剑】制作介绍1:不再是游戏动画,而是“电影”制作

日文链接:http://cgworld.jp/interview/201606-kgffxv-01intro.html [最终幻想]系列在全世界有着累计销售1亿1500万份的成绩.用与最新的游戏[最终幻想15(FFXV)]同样的世界,事件,角色来描绘的长篇剧场动画[最终幻想15 国王之剑]公开了.包括史克威尔艾尼克斯的第2商务部在内,约50个国内外的强力工作室协作的前作未有的挑战.来看看这些的幕后信息吧. [最终幻想15 国王之剑]的预告视频 STRATEGY:不是游戏动画,而是“电影”制作 [

骨骼蒙皮动画中的坐标变换

背景知识 模型视图变换 OpenGL没有视图矩阵,只有模型视图矩阵,一般游戏引擎都会抽象出视图矩阵的. 总的变换为: v` = projection * view * mode * v; 父子节点变换 v` = worldMatrix * v = (parentWorldMatrix * localMatrix) * v; 骨骼变换 其实真正表示的关节,而不是骨头,只是骨头比较好理解. 默认姿态网格对象坐标空空变换到骨骼局部坐标空间(offsetMatrix). 完了后又从骨骼空间变换回动画姿态

Cocos2d-x手机游戏开发中-组合动作

动作往往不是单一,而是复杂的组合.我们可以按照一定的次序将上述基本动作组合起来,形成连贯的一套组合动作.组合动作包括以下几类:顺序.并列.有限次数重复.无限次数重复.反动作和动画.动画我们会在下一节介绍,本节我们重点顺序.并列.有限次数重复.无限次数重复和反动 下面我们通过一个实例介绍一下组合动作的使用,这个实例如下图所示,下图是一个操作菜单场景,选择菜单可以进入到下图动作场景,在下图动作场景中点击Go按钮可以执行我们选择的动作效果,点击Back按钮可以返回到菜单场景. 下面我们再看看具体的程序

[C++基础]位运算 游戏开发中的应用

位运算的定义:通俗点说,位运算就是对一个整数在计算机中二进制进行操作. 任何一个整数都可以用二进度的方式来表示的,不同类型的整数它的位数的长度也不一样,INT8或者char是由8个2进度 位表示,INT16或者short是由16个2进度位表示,INT32是由32位状态位表示. 位运算在游戏中的应用 往往,在游戏开发中做位运算的时候,我关注的主要是某一位的值是0,还是1,而并不是去关注这个整数的值是多少. 比如:00100010,这个8位的整数从右到左,它的第一位为0,第二位为1,第三位为0,第六

说说我们的游戏动画设计

游戏美术行情在线 在我国游戏动画行业是比较特殊的行业,是国家大力发展行业,是一个起点低发展快的行业,游戏动画设计制作人才是我国游戏动画发展的不可缺少的一部分.在此背景下,游戏动画人才水涨船高,成为人才市场上最紧俏的人才之一.加上游戏动画产业范围广.衍生品多,.拓展空间大,所以我国游戏动画设计制作人才需求量非常大. 目前游戏美术培训机构多以3dmax游戏动画制作课程为主,那到底什么是3dmax游戏动画制作呢? 我们制作的过程分成九个步骤,分别是: 一.模型检查:检查模型是否符合动作制作要求以及项目

【张宴】PHP在金山游戏运营中的应用

PPT下载地址1(国外服务器):http://blog.s135.com/attachment/201105/2011phptc_zy.zip PPT下载地址2(国内服务器):http://ishare.iask.sina.com.cn/f/15231659.html 原文:http://blog.s135.com/2011phptc/ 大家好,现在我来跟大家分享的是PHP在金山游戏运营中的,包括团队开发,以及像系统结 构,设计,运营平台这些信息.我议题主要有两个,一个是在金山游戏官方网站做的一

位运算 游戏开发中的应用

位运算的定义: 通俗点说,位运算就是对一个整数在计算机中二进制进行操作. 位运算的原理是很简单的,百度百科里就能找到它的一些基本的用法,以及相关的运算符号. 大部分刚刚进入到游戏行业里的程序员,你问他什么叫位运算,他都懂,但实际中往往却不记得去使用它. 任何一个整数都可以用二进度的方式来表示的,不同类型的整数它的位数的长度也不一样,INT8或者char是由8个2进度位表示,INT16或者short是由16个2进度位表示,INT32是由32位状态位表示. 位运算在游戏中的应用 往往,在游戏开发中做

英雄联盟设计师:游戏动画压缩如何保质量

转自:http://www.gamelook.com.cn/2015/08/226312 Gamelook报道/不论是哪个平台的游戏,开发商最为头疼的问题之一就是包体大小,因为它不仅影响玩家硬件的存储空间,还直接决定玩家从发现到体验游戏的时间差.而游戏动画则是占用资源最大的部分,所以如何压缩动画是所有开发者都需要面对的问题. 最近,<英雄联盟>开发商Riot Games发布了相关的技术贴,设计师Jaewon Jung通过博客的形式讨论了如何在不降低动画质量的情况下进行动画压缩的话题,并且在文章