FBX骨骼动画

不要在追寻什么人生的意义,追寻本身就很有意义-《萌菇凉》


本周我们拿出一些可能其他同学也存在的疑问来给大家讲解一下关于FBX骨骼动画的方面东西。我们应该如何去做一个动画系统。


关于绘制

我们首先来看看,我们要绘制动画需要具备什么样的底层基础功能:

  1. 绘制一群三角形的能力(因为无论模型如何复杂,它都是由三角形构成,或许你比较菜鸟,只能绘制21845个三角形(65535除以3),或许你有良好的数据组织,你有一个引擎,你可以突破这些瓶颈)

  2. Shader,你需要一个Shader为你的模型的各个部分进行着色,我们解析过FBX模型的知道,FBX模型里是有很多个节点的,节点上都挂在了Submesh这样的东西,而每个submesh基本上可以对应到某一群三角形的集合。于是乎,我们就需要特定的shader去绘制每个submesh,或许整个模型都可以使用一个shader去绘制。

  3. 动画采样器,或许有的人至今不明白刚体动画和骨骼动画有什么区别,但那又如何。我们来说说动画采样器,动画采样器就是根据时间点的信息,能够插值出动画中影响顶点位置的矩阵数据,然后通过这些矩阵数据计算出某个时刻,各种submesh的顶点的位置。我们通过时间去驱动动画采样器,动画采样器计算出矩阵来影响各个subumesh,就形成了骨骼动画。跟着我们学完了FBX骨骼动画课程的人都知道,你只要是认真学习了,就知道,动画的计算是非常耗时的。因为你需要每个顶点是被多个矩阵影响的,这样一来,每一次模型的所有顶点的重新计算就涉及到多个矩阵的相乘,并且还需要将这些累加的效果应用到所有的顶点数据上去。在CPU上来做这件事情的开销是非常大的。为了让我们的课程逻辑更清晰,我们采用的是OpenGL的固定管线来教学的。任何一个学了可编程管线,并真正掌握了的人,肯定知道如何变通成为可编程管线版。


难点

骨骼动画难的地方不是给模型贴图和解码材质,那些东西只是一个工程学问题,只要有编程功底的人,有足够的能力去组织一套复杂的代码,这些问题都不是问题。骨骼动画难的地方在于矩阵的理解,说具体点,就是那些Cluster上的矩阵是怎么影响到了各部分submesh上的顶点的。理论上难点如下,如果不是下面的问题那么一定是你自己的基础不好,胡思乱想,瞎给自己折腾出来的一些难点:

  1. cluster与骨头的对应关系

  2. cluster与顶点们的对应关系

  3. 这些矩阵如何计算才是正确的骨骼矩阵的公式

  4. 动画采样器是个黑盒,你不理解它是怎么采样出来那些矩阵的。

其中1、2、3点都在我们的FBX骨骼动画课程中做了详细讲解,至于第4点为什么不讲,是因为我们不知道FBX SDK是如何实现动画采样器的,他们不是开源的东西。


动画采样器

关于动画采样器,实际上大家更多的不理解是它到底是个什么。实际上这部分内容不是三言两语能说明白的,你需要系统的学习整个动画理论的知识,而你想要学会动画理论,首先你要理解数学中的大量的插值技术,我们的2D帧动画、3D帧动画、FBX骨骼动画都是某种动画的特例。实际上是可以泛化的,但是由于覆盖的知识面太多,大家也知道,我们这里的内容属于小众内容,有兴趣来学习的都是聪明绝顶的人,一般的程序员是不会来钻这块内容的。因为他们需要的仅仅的是一份工作,来学习这部分高深内容的程序员,更多的是出于求知欲,对于原理的渴望,钻研能让这部分人过的更充实。


常见的误区1

FBX不就是为了游戏而设计的吗?这必然不是,FBX不是慈善家,就跟天下没有免费又好吃的午餐一样,每个人都要生存,有的人堂堂正正的赚钱,有的人通过免费,吸引客源,最终想着别的方法赚钱,但最终都是需要落实到赚钱这件事上。堂堂正正赚钱的,肯定会做好本职的工作,而靠免费来引流赚钱的,肯定免费只是表象,它更多的时间需要思考怎么变现。

回来说FBX,FBX是Adobe的用于存储3D数据的格式,它本身就不是为游戏而设计,之所以大家用FBX动画,一个原因仅仅是它可以支持游戏。


常见的误区2

我不管,我要用C++写出代码,使得我的C++程序读入FBX模型,并渲染出来的时候,能够逼近或者达到在Maya中一样的效果。

这一点但凡有经验的程序员都不会这么想,一般这么想的都是纯理论派,从未真正去接触游戏产业的人。我们有大量的证据可以证明这样做没有任何意义。但你要是想做,并不是不可能。

  1. 你使用Unity导入FBX动画模型或者静态模型去做游戏的时候,是直接把模型丢进Unity里,打包成AssetBundle后,就可以直接用的吗。并非如此,大部分情况都是,你先把模型导入进来,然后给模型各个submesh贴上心仪的材质球,然后改改shader或者调调参数,让模型外观看起来更满意,最后才是打包发布游戏。我们注意到,实际上在3D建模软件中的材质系统,实际上在游戏制作的时候是没什么用的,无论如何我们都需要手动的去调整我们的模型,让它在游戏引擎里看起来更加的精致。为什么会产生这种问题呢?因为,3D建模软件的渲染系统跟游戏的渲染系统是不一样的。他们之间的材质并不能产生一一对应的关系,所以你也不必去为了解码模型的材质而烦恼,因为那个根本不重要。这些你后续手动设置就好了。

  2. 我们现在假设你已经能够做到,在Maya中看到的是什么样子,你自己写的程序中就是什么样子的级别了。但是Maya中那个实时被渲染出来的模型,你觉得好看吗?我们很多程序员小姐姐(不好意思,我们忽略了程序员小哥哥,因为我们是更喜欢妹子的,不喜欢汉子,搅基者滚)不是美术妹子。在3D建模软件中通常具备两套以上的渲染系统,一套是建模用的,这套系统高效,但是画面不那么精致,另一套系统可能是PBRT的,一帧画面可能要八年才渲染的出来(或许是八十年)。具体如何操作,请请教美术妹子。回到写程序的方面,即便你能实现Maya中所有的材质球,那又能如何?你只不过实现了一套渲染出来很挫的画面。


在本文的最后,我们希望同学们回归正轨,不要在无所谓的事情上瞎折腾,那只会让本来应该去谈恋爱的时间,拿来折腾自己。


转载于:https://juejin.im/post/5cc7fa6cf265da038d0b51a2

你可能感兴趣的:(FBX骨骼动画)