当前位置:首页 > 编程开发

3D动画基础

webgou8年前 (2018-04-21)编程开发152

顶点动画

3D动画本质上是模型的顶点轨迹,因此要记录一段动画,最原始的办法就是记录动画过程中所有的顶点信息。但由于肉眼的识别速度和GPU的处理能力都有限,因此有了桢(frame)的概念,帧是模型特定姿态的一个快照。为了进一步减少动画桢的内存占用,我们可以从动画的轨迹中提出中关键帧,保存每一个关键帧的模型网格信息,由引擎来得到平滑的动画效果(关键帧过渡),在关键帧之间平滑过渡的帧叫过渡帧或插值桢。

骨骼动画

针对于人/动物等具备骨骼特征的模型动画的一种优化,由于人的皮肤相对于其所属骨骼的相对偏移固定不变,因此皮肤顶点的空间位置可由其骨骼位置加上其相对偏移得到,所以我们无需记录皮肤上每个顶点信息,而记录对应的骨骼信息,这样我们实际得到的是一段简化版的”线段动画”,谓之骨骼动画。

由于骨骼与骨骼通常只有相对角度,没有相对位移,比如手掌不会脱离肘,因此我们无需单独记录每个骨骼的位置信息,只需记录骨骼与其父关节的相对角度,比如手掌的父骨骼为肘,肘的父关节为臂等,这样,我们需要为模型指定一个根骨骼(比如人体的脊椎),根据根骨骼的位置即可以推算出所有骨骼的位置,以完成正确渲染,为模型顶点绑定其内在骨骼的过程叫做蒙皮(skining),有些顶点可能需要绑定在多个骨骼上,比如关节处的皮肤。

骨骼动画为动画插值运算,逆向运动学得提供了可行性基础。

关于骨骼动画更多参考:http://www.cnblogs.com/kex1n/archive/2011/10/11/2207546.html

动画过渡

在给定的时间内,从一个动画平滑过渡到另一个动画的过程,叫做动画过渡,如在0.2s内,将动画从A切换到B,若动画A当前帧为FA1,动画B起始帧为FB1,我们用F1(W1)+F2(W2)表示一个插值桢,设过渡桢为10桢,那么这里有两种过渡方案:

首尾插值:动画引擎将随时间调整FA1,FB1的权重,对其插值融合,得到插值帧:FA1(1)+FB1(0), FA1(0.9)+FB1(0.1) … FA1(0)+FB1(1)。

交叉插值:动画一边过渡一边插值:FA1(1)+FB1(0), FA2(0.9)+FB2(0.1), … FA11(0)+FB11(1)

动画融合

在美术导入的资源中,只有每个模型的基本的动作,比如走,跑,跳等,而真正运动中需要的远不止这些,比如我们还需要快走,慢跑等,这些动画完全通过美术导出是不切实际的。现在的动画系统提供了一种动画融合机制,即由程序去控制多个动画的权重,插值合成新的动画。比如我们可以通过速度去控制走,跑动画的插值权重,得到我们想要的慢跑动画。另一个例子是CS中的持枪动作,美术可能导出了上下左右前后的持枪动作,对于任意角度,我们可能需要用到1-3个动画,对其进行融合得到对应角度的持枪动作,融合权重由当前角度而定,而如果这时候我们还希望模型能够保持慢跑动作,我们还需要合成下半身的动画,在融合时,模型慢跑动画的上半身动画权重为0,下半身动画权重为1,持枪动画权重相反,这样就得到一个灵活的模型,而美术只导入有限的基础动画即可。

动画过渡和动画融合本质上都用于生成平滑的动画,但前者用于两个动画的平滑切换,通过时间决定动画插值权重,而后者可用于多个动画(融合),并且动画插值权重由程序控制。

动画层

前面提到了CS人物模型的动画融合,它需要用到多个动画,对于慢跑动作,其上半身的融合权重通常为0,而对于持枪动作,其下半身的融合权重为0,但是动画系统仍然会去计算这一部分,造成了不必要的GPU/CPU浪费。如今一些动画系统提供了动画层的概念,可以在一个动画控制器里面存在多个动画状态机,并对它们自动融合。每个动画层可以有身体遮罩(Mask),亦即决定该动画运用于身体的那一部分,禁止哪一部分,被禁止的部分融合权重为0,并且不会参与运算。比如持枪动画层的身体遮罩应禁止下半身。

动画与模型变换

动画本身可由美术导入位移(Postion)和转向(Rotation)信息,这些变换是模型相对于自身坐标系的,要将这些变换运用于模型在世界坐标系的变换,有两种方式:由程序控制和由动画控制。由程序控制是指,程序控制模型的Transform,然后将Transform信息设置到动画系统,由动画系统去展现当前动作,比如走,跑等,这也是最早的动画交互方式。如此程序需要事先精确匹配动画的变换信息,否则可能出现滑步等现象。另外一种方式为了解决这类问题的:由动画控制模型变换,程序去动画系统拉取模型的变换信息,这虽然在表现层上体验更好,但也有一些问题:让渲染层决定了逻辑层,如果渲染帧卡了,会影响到逻辑帧处理。

Unity关于这方面有更灵活的控制,参见:http://blog.csdn.net/cubesky/article/details/39478207

逆向运动学

IK(Inverse Kinematic,逆向运动学,也称反向运动学)主要用于骨骼动画,前面提到,骨骼动画通过根骨骼(也叫模型的根节点)出发,根据其子节点的相对位置(角度)推算出子节点的绝对位置,从手臂到肘到手掌到手指,整个推算结构呈树形。而如果我们已知末节点的位置,逐步推算出所有其它节点的合理位置的过程即为IK。比如人物模型用手触碰一个固定物品,我们需要根据物品的位置,决定模型的动作。

来源:http://wudaijun.com/2016/02/3d-animation/

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=632

标签: unity
分享给朋友:

“3D动画基础” 的相关文章

总线标准

微机中总线一般分为内部总线,系统总线,外部总线.内部总线是微机内部各外围芯片与处理器之间的总线,用于芯片的一级互联;而系统总线是各个插板与系统板之间的总线,用于插件板的一级互连;外部总线是微机和外部之间的总线,微机做为一种设备通过该总线和其它设备进行信息和数据交换,它用于设备一级的互连.从广义上说,…

iOS开发中常见的语句@synthesize obj=_obj的意义详解

  我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一个比较基本的问题,也关乎我们理解Objective-C中对类、类的…

从聊天到交付:我是如何使用 Codex 完成真实工作的

Codex 的价值不只是生成代码或回答问题,而是进入真实工作现场,阅读项目、调用工具、修改文件、验证结果并交付成果。本文结合实际使用过程与社区工作流,介绍如何把 Codex 当作一位可以协作、可以复核、也需要明确边界的数字同事。…

四大图像库:OpenCV/FreeImage/CImg/CxImage .

 本文转载自:http://hi.baidu.com/xiaocuiman/blog/item/6e267c2bc4b1883f5243c108.html...…

Linux下修改PATH的方法

比如要把/etc/apache/bin目录添加到PATH中…

sandy 旋转例子

以下是用sandy 1.2库编写,可以在flash lite 3.1上运行。用cs4开发.由于下载不了源码,不过可以自行新建一fla(flash源文件)文件,然后按照下面方法加载图片: 1.把相应图片导入到库中 2.然后把图片转换成影片,并导出去。 3.用导出的名字替换掉(new MovieSki…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。