DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)

目录

  • 3、Assimp的导入标志
  • 4、网格(Mesh)
  • 5、骨骼动画基础

3、Assimp的导入标志

??一般的模型文件中,大多数情况下在建模时默认都保存成了OpenGL的右手坐标系,即z轴坐标垂直屏幕向外。而在D3D中习惯是左手坐标系,即z轴垂直屏幕向里。左右手坐标系区别如下图所示:

DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
??在本系列教程中,为了保持”D3D祖传的左手风格”,编译Shader时都加上了D3DCOMPILE_PACK_MATRIX_ROW_MAJOR标志,这样Shader中的矩阵都是行主序的,编写变换Sheder程序时,就是用矩阵挨个右乘向量即可,在阅读和理解矩阵变换顺序上就是从左到右的自然阅读顺序,至少我是比较喜欢这样的阅读顺序,跟平时看书的自然顺序是一致的。同时使用这个标志编译Shader后,在使用DirectXMath库生成的矩阵传入Shader时就不用麻烦的做矩阵转置操作了,因为DirectXMath库本身也是行主序操作矩阵的。这样本系列教程中Shader就“一路向西”了。
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
??也就是说只需模拟物体表面的反光特性欺骗过人类孱弱的眼睛基本就达到目的了,也就可以让大家看到所谓“3D”真实感的世界场景了。
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
??在计算机中具体表达这些三角形时,无非就是需要3个代表其顶点位置的向量即可。但是当三角形“首尾相接”甚至“接踵摩肩”的“拼凑”在一起时,就会发现其中好多顶点是多个三角形共用的,这时如果还是简单的为每个三角形重复提供顶点向量,就显得不那么“计算机专业”了。
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
??其中顶点的数组就是示例程序中的Vertex结构体数组,而第二个数组就是程序中的Index数组。大家可以试着计算一下这个简单的例子中节约了多少内存。

??关于网格,这里需要大家进一步理解下面几点:

??1、并不是说“2D面”就一定是平面,这里“2D”的含义是说仅用2个坐标就可以表示这个“面”上任意一点,但这个坐标往往不是简单的平面上的2D坐标。这也是纹理贴图坐标仅用UV两个坐标即可表示的原因。当然这个理解起来有点抽象,它隐藏了“2D面”可能是一个曲面甚至是闭合曲面的前提条件。用两个坐标即可表示任意2D面,其实是一个“拓扑表示”。形象的理解,比如地球上任意一点,在规定了南北极、赤道、本初子午线的条件下,都可以只用经纬度两个坐标就可以定义地球上任意一点,当然前提是已知地球是一个球体,如果假设地球是个“甜甜圈”形状,那么就需要另外规定坐标系统了,此时经纬度的含义(坐标函数)也就完全变了。

DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
??再比如地球的贴图:
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
??3、这种“拓扑变换”,往往也还是一种近似,即假设我们要“包裹”的3D物体近似为其规则的形状,从而忽略很多细节。所以如果只是简单的用这些拓扑后的图片作为纹理“包裹”到网格上之后,依然会看上去很假。比如对于地球我们就假设它是一个“完美的球体”,但其实真实的地球上是有高低起伏变化的复杂地形的。再比如值得我们骄傲的喜马拉雅山脉就不是平坦的,而且这种不平坦是很明显的。并且地球其实是一个两级稍扁而赤道稍鼓的不规则椭球体。再比如人体表面也并不是绝对光滑的,细节上其实至少还有丰富的毛孔等。如果要进一步更真实的模拟这些细节就需要使用辅助的表示细节的“法线贴图”、“位移贴图”等来帮忙。甚至在某些场景中,如复杂地貌的细节表示上,还需要“曲面细分”等技术手段,来进一步细致的近似出物体的表面。从而先从几何角度进一步使模拟光照效果更接近真实物体的光照的几何特性。如下图就是地球表面的“法线贴图”:
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
曲面细分的示例:
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)

5、骨骼动画基础

??搞明白了“2D面”网格模拟3D物体的原理之后,接着让我们来思考怎么能让这个“静态”的网格进一步能够像真实世界中的物体那样动起来。这里的运动主要分为两大类,一类是说让网格整体动起来,比如汽车的前进、飞机的飞行等,这类运动主要靠常规的位移矩阵变换即可实现,如果加上物理模拟的考量,比如速度、加速度等,这类运动基本就是“刚体运动”,本章就不讨论了。而另一类运动就是需要网格自身进行一些“变形”运动了,比如,3D虚拟人物的走路动作、跑步动作、甚至射击、搏击动作等等,这类动作往往牵扯到网格内顶点的变换。当然还有一类比较特殊的动画,经常用于模拟漫天飞雪、火焰等等,被称之为“粒子”动画,严格来说,它只是说一次控制的小对象比较多,并且还要控制

??所谓网格内顶点的变换,说白了就是网格自身要发生某种“变形”,即网格上至少有一点相对于其它点要发生明显的位置改变。这类运动,根据采用的技术手段不同又可以分为两大类:一类就是本章将要重点介绍的依托“骨骼”的变形运动;另一类就是基于目标网格进行插值变换的变形运动,多用于人物面部表情变化,后续我们再介绍。

DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
??“骨骼动画”的基本思路就是模拟人类或动物骨骼运动从而带动身体动作的过程。刚才我们已经介绍了网格实质是个“画皮”的过程,那么要让这张“皮”进一步动起来,就需要模拟其内部骨头的活动,然后带动表皮运动,这样从外表上看起来就是“画皮”动了起来,并且因为内部模拟的是人类或动物骨头的活动,所以整体看起来就与一个“真人”的活动并无二至了。所以骨骼动画也因此而得名。当然这个思路对于3D动画来说也是最简单直接和自然的一个方法。甚至对于一些没有骨骼的生物,比如章鱼、毛毛虫、昆虫之类在建模时也都人为的加上虚拟的骨骼,从而模拟出这类生物的动作。有些甚至干脆虚拟出类似人体的骨骼就拟人化形成了卡通形象。
DirectX12(D3D12)基础教程(十七)——让小姐姐翩翩起舞(3D骨骼动画渲染【2】)
??“骨骼动画”在具体表示上就是让网格上的顶点分组绑定到虚拟的类似骨骼状排列的具有树状结构的空间点(称为“骨骼”)上,当该“骨骼”依照时间点做相应变动时(就是依照时间轴生成变换矩阵),就会影响绑定到该点上的顶点以一个权重值(Weight)做相应的变动。最终所有骨骼都“动”起来之后,整个网格就依照规则“动”起来。从这个比较绕的描述上来看,其实骨骼动画主要有几个要素:网格、骨骼绑定、时间轴、骨骼变换矩阵、关联顶点及权重、变换顶点。基本的过程就是:骨骼绑定->根据动画序列遍历骨架生成每个骨骼(或关节)变换的矩阵->用变换矩阵变换受影响的顶点。

??由此也可以看出,骨骼动画中虚拟的骨骼实质上并不会形成类似“网格”那种最终可见的像素,本质上它最终就是一组组时间轴上的变换矩阵,但是为了建模的方便,很多3D动画建模软件中,都会将虚拟骨骼的局部坐标系原点链接起来加以显示,形成可视化的骨骼形象。这些原点通常是骨骼系统中的关节点,实质上骨骼能够自由运动的坐标系参考点就是诸多的关节点,所以以关节点作为局部坐标系的原点来表达骨骼的变换是具有天然的描述简单易理解的优势的。

??另外通常因为网格一般是3维结构,并且在动画中都必须要使用时间轴,所以有些时候有些夸张的宣传会将3D动画宣传为4D动漫,其实这种说法也比较合适,至少这提醒了我们,在计算骨骼动画的时候,必须要严格考虑时间轴的问题,即需要4D的思考能力,但这与4D向量啥的没有任何关系,这里只是说3D的网格+1D的时间轴变换=动画。(迪士尼乐园里的4D与这里说的不同,是将加入的真实环境反馈包括力反馈、水雾反馈、声音反馈等称之为4D动漫。)

来源:GamebabyRockSun_QQ

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月16日
下一篇 2021年6月16日

相关推荐