您当前所在位置:首页未命名骑砍mod程序理论独家--物体顶点动画控制原理及应用

骑砍mod程序理论独家--物体顶点动画控制原理及应用

更新:2024-04-23 00:48:35编辑:创享下载归类:未命名人气:4

  前言:在骑砍里大家所接触到的动画大多是骨骼动画,并且是代码程序可控的;还有少量顶点动画,大多数人处理的场合就是大地图的图标以及部分盾***弓箭类的武器;以及shader等手段产生的类似UV材质变化的动画效果。实际上动画对于游戏是一个比较广义的概念,比如粒子的放大缩小、贴图的rgb变化都可以看作动画,并且部分系统能够用代码进行模拟也可以用模型手段做出。所以我将对大家不经常或缺乏必要技术研究支持的顶点动画和2D序列图动画系统作出独家系统研究体系的分享和讲解。

  本贴主要讲下顶点动画。主要是场景物的顶点动画,因为其他武器大地图图标的常规ms不可控并且不是技术盲区可搜索到,所以这些我不讲。

  一、顶点动画模型的制作

  1.骑砍适用的顶点动画即md3格式的动画模型的来历:

  最初来自一款射击游戏鼻祖雷神之锤的续作quake3,基于制作反恐精英cs的半条命1代,steamG胖发家的游戏就是由这个quake1和2代引擎结合编出来的,quake系列123,分别采用的模型格式mdl、md2、md3进化,也就是md3是最古老的真正的3d动画格式,是游戏史上顶点动画向骨骼动画的最后的过渡技术(因为md3其实也算骨骼动画,quake3的人物基本分成upper上半身,lower下半身和head头部,三个部分,每个部分都是纯md3顶点动画,但是有一个cfg文件强行以骨骼模拟的方式在upper与head,lower与upper之间分别构造了一根骨骼,也就是两个单根骨骼动画串了3个顶点动画,所以说这个是骨骼动画过渡的雏形)。

  2.md3动画技术在骑砍深度运用的模型动画技术瓶颈:

  一般对于有一点模型动画软件使用基础的人来说,顶点动画的制作他们会采用模型动画软件对动画模型逐帧导出obj再导入openbrf在满足各帧模型顶点面数坐标一样时全选右键点击“merge frames as in a vertex ani”合成顶点动画模型,这个是一个繁琐的方法,试问,如果帧数成百上千,你该怎么办,如果模型具有多个分割部分对应多个材质贴图,那你还要每个mesh部分分别合成帧,你的工作量又是成倍,甚至你导出后并不能保证各帧模型顶点面数坐标一样。

  3.模型动画技术瓶颈在骑砍如何突破:

  所以我的制作步骤是,先准备好绑定全体动画的动画模型,最佳模型格式是fbx(最好设置成2014二进制格式,ASCII版本整体转换后容易塌陷)或mdl(这个常见半条命反恐精英这种游戏,因为mdl是md3的儿子,转换会比较完美),如果是max请导出fbx,dae等容易被其他动画格式导出塌陷。然后用我的软件资源直接转换md3格式.

  其他建议:如果源动画比较多,最好在max里先等比压缩一下关键帧数量再导出fbx等常规动画模型再转md3.  给个参考数据,单个顶点动画导入brf后的brf文件大小一般是模型面数(单位:万)x关键帧数/5~7 =。。这是警察攻略。(单位MB),也就是打比方我的嘉然模拟器一个嘉然顶点动画模型就是接近20万面的模型x26帧数,结果到达80多兆,所以单体玩家使用的顶点动画模型你可以偶尔有个达到100兆的,但是其他ai单位最好限制在20兆以下。至于brf最大能容纳多大一个顶点动画模型,我最大塞过500兆的,但是塞之前的原始md3模型没这么大,因为塞进去后brf大小会是模型大小扩大后的3~6倍,所以一般往brf塞80兆以上的md3原始文件就容易导致brf奔溃跳出了。至于对性能的影响,这个不能抛开数量谈性能,就是哪怕你一个动画模型200兆,只要你只一个场景加载一两个,不会影响流畅,如果电脑比较好,理想情况是运行还流畅着然后很快到了内存溢出的上限c++run error,所以就看吧,你一个场景加载的这种模型总大小有没有超出1个gb,太多容易跳出。

  然后是关于碰撞体设置的问题,场景物的顶点动画不会改变碰撞体,也就是场景物定义的是什么碰撞体模型,无论怎么播放动画都不会改变,所以这个碰撞体怎么设置要具体对象具体分析,比如和战团差不多的人如果采用跟随agent换皮控制的方式,可以不设实际的场景物碰撞体为空,如果是一些机械类,可以根据本身的形态简化处理,降低负担,比如坦克,你可以两个柱体重合加个杆子,避免直接按原始高面数生成碰撞体,因为场景物控制运动带来的负担受模型面数的影响,碰撞体的面数影响是远大于显示的模型外形本身的。

  4.一些顶点动画模型参考实例:

  我的魔兽争霸modhttps://bbs.mountblade.com.cn/thread-2094063-1-1.html和七龙珠modhttps://bbs.mountblade.com.cn/thread-2093251-1-1.html拥有骑砍界绝大部分的高帧顶点动画模型数量,包含各种生物机械装置战车飞行器以及含有顶点动画的特效模型。你在其他mod基本很少能看到这类模型,有也不超过30帧并且动作种类单一。可以参考看看,但是不要随意提取用到其他mod里.然后下面我具体代码示例的魔兽英雄模型是到第一个链接里找所有human_,orc_,nightelf_,undead_,monster_这些前缀的brf,这些一个brf装一个英雄或普通单位动画模型。然后动画特效一般是eft后缀的brf里。

  二、相关op()

  讲op前先介绍相关参数在brf里的体现:打开有顶点动画模型的brf,选中顶点动画模型看右侧面板的数据,和动画帧数有关的有两个格子的数据排列,右处为帧时刻,是下列op的value或frame要填的数据,也就是动画模型的某帧状态的控制参数,而左侧数据代表的关键帧序号,没有任何op需要这个数据,因为关键帧序号就是一个连续从0开始用于关键帧排序的序号,相连关键帧之间可以填间隔不同的帧时间,比如0号关键帧是0时刻,1号关键帧是5时刻,2号关键帧是15时刻,那么动画第1帧代表的模型形态变到第2帧所用的时间是第0帧变第1帧的2倍时间,但一般为了控制方便,宜设置间隔连续均匀。

  可能大家没处理过,不了解,一般你导入做好的顶点动画模型后各帧时刻参数会均为0或者散乱不成等差数列,所以以前我这个帖子说了下如何快速让顶点动画的各帧序的帧时刻从0开始成差值为10的等差数列https://bbs.mountblade.com.cn/thread-2050522-1-1.html,假如你学会了顶点动画的制作,这个小细节不掌握也会使你在代码控制前的模型处理环节就卡住思路。

  此外注意没有顶点动画的场景物也可以控制帧状态,所以这种特殊的情况可以用来还没有制作动画时随便用一个没有动画的模型先留空写好代码,以及利用顶点动画控制op是可以***作模型在一个帧时刻区间变换时限定总完成时间的特性,构造一个看不见的无动画模型将控制顶点动画来当作一个计时器来使用。但是注意控制顶点动画的场景物可以没有顶点动画但是需要有具体模型,也就是要有点线面,如果你的模型是none空的,顶点动画op强制执行到某帧时刻后你获取的当前帧时刻始终为0。

  prop_instance_deform_to_time                = 2610  # (prop_instance_deform_to_time, , ),

  # value参数代表帧时刻,也就是prop_instance_no场景物id的场景物一次性设置到value这个帧时刻

  prop_instance_deform_in_range               = 2611  # (prop_instance_deform_in_range, , , , ),

  # 强制场景物id的场景物自起点帧时刻向终点帧时刻匀速变化,在(单位千分之一秒)时间内完成一次动画,然后模型便停留在终点帧时刻的形态上。此外注意这里面控制动画变化区间的时候是可以取值到,不要去类比is between、try for range这些取不到终值的op,因为这个是行为***作而不是判断类***作宠物小精灵go。

  prop_instance_deform_in_cycle_loop          = 2612  # (prop_instance_deform_in_cycle_loop, , , , ),

  # 强制场景物id的场景物自起点帧时刻向终点帧时刻匀速变化,在(单位千分之一秒)时间内完成一次动画,然后重新到时刻反复循环动画。也就是与上面的op区别是一个不循环动画一个循环动画,这个你们要结合骨骼动画的机理联系想想。

  prop_instance_get_current_deform_progress   = 2615  # (prop_instance_get_current_deform_progress, , ),

  # 获取场景物正在用2611或2612***作播放顶点动画时,已经播放的百分比0-100取值,实际上,这个用的不多,下面的op具有等效替代作用。

  prop_instance_get_current_deform_frame      = 2616  # (prop_instance_get_current_deform_frame, , ),

  #获取场景物***作播放顶点动画时,当前时点播放到的帧时刻

  该系列op功能的总体分析(为了写方便,下面以op的序号简称):

  1.实际上***作号2611,2612和2616已经可以满足顶点动画控制的需求,***作号2610和2615用的场合不多并且可以被其他3个op等效***作。

  2.的填写与-的差值的关系有一点关系但不多,具体填多少还要看你关键帧动画变化的幅度结合实际行为,比如说同样是两个顶点动画人物的走路动画,一个步伐夸张一个步伐缓慢甚至有切变多动作,或者一个模型走路动画每10帧数动作变化幅度较明显,但另一个模型的走路动画每10帧甚至不仔细看都没怎么动作幅度,所以这两个模型一个特定动画区间的长度相等时,满足我们观感适宜的值很多时候不一定相等。这个要在brf里手动播放帧数记录各行为关键帧起始终止帧时刻时看感觉心中有个估值设置好后到游戏调整。然后如果涉及到动作有被加减速动画速度的条件,比如施法加速技能,那这些值还要进一步变量化控制。

  3.2611和2612代表了顶点动画的不循环和循环,这个要类比骨骼动画smd特别是其标签作用,骨骼动画按照一些标签应付不同场合的需求,需要动作可以循环执行或仅执行一次,然后我们再类比下,骨骼动画强制切换动作是怎么做的,其实采用的是具有高优先级标签的动作去覆盖当前正在执行的动作,优先级高,则直接打断,优先级次一点,可能等当前动作做完续上或不打断。

  所以对于同一个物体的顶点动画中两个不同区间的帧动画进行切换时,***作号2611或2612需要和2616来组合使用,比如某物体假设是一个怪兽,顶点动画总共0-400的帧时间,通过我自己的人为设定,停止发呆动作的帧时刻区间是0-100,走路是101-200(看到没有,因为动画控制可以取终值,所以这个相邻两个区间前一个终值100不可以等于后一个起始值101),攻击是201-300,死亡是301-400。所以这个也表明了大部分情况,你需要把一个顶点动画所有行为压到一个顶点动画模型里,然后记个笔记人为分分类,哪个区间是作什么行为作用的动画来使用。

  这时候你们要联系实际生活和玩过的游戏来想怎么把这不同行为的动画区间控制好,首先动画是抽象行为的具体表象,所以先让总体行为指导动画的触发,比如我看到你腿在动的动画,那当前你就是在走路。则通过行为判断的条件,比如走路(先不区分前后左右跑步还是慢跑,假设上面的怪兽只有一种前进动作,其他靠转弯),那么,(key_is_down, key_W)即按着w键便是一种判断当前是否要执行走路动画的条件。然后就是停止待命动画,一般在动画领域这个动作叫idle动作,是很多动作首先要做的动画,因为你无论是走路还是攻击释放技能,最终执行完这些行为后,都要恢复idle站着等待执行其他行为或就像一些任务型人物就呆在一个地方不动,这也说明了idle是优先级最低的动作,也是几乎所有动作的中转动作行为,所以我们进行顶点动画多区间行为化的模型进行多种动画行为控制时,要先分析不同动画区间代表的不同行为优先级的排序。类似动作A在执行时动作B不执行,动作A执行完毕时如果不继续触发动作A的条件则自动切换到动作C,等等。

  所以代码控制顶点动画的基本思路就是:

  满足动画A(帧时刻范围在(b,c))的条件触发时,op***作号2616得到当前帧数a

骑砍mod程序理论独家--物体顶点动画控制原理及应用

  如果a在(b,c)值域内,也就是你目前就是在执行A动作动画过程中,出现行为条件的改变,则判断你实际需要触发的事件本应该执行什么动作来决定如何执行2611或2612 op***作号,具体循环与否看你的事件触发条件是否是持续的还是一次性事件,比如走路和待机就是持续性事件采用2612循环动作,而非持续施法的技能和攻击行为以及死亡便是非循环单次事件要用2611,其他特殊情况特殊分析。

  然后如果突然又出现了动画B(帧时刻范围在(d,e))的条件触发时,直接按照相同的套路强制执行2611或2612 ***作号,打断当前执行的其他动作,或者等目前执行的单次行为动作事件执行完毕即播放到目前行为动画的尾帧时刻再执行新的动画播放。

  综述就是:同一个顶点动画模型的不同帧时刻区间定义的不同动作的切换,就是靠op***作号2616得到当前帧数作为判断条件是否处于某个行为事件,再根据你实际需要触发的其他行为条件需要强制执行2611或2612 ***作号去转接播放其他帧时刻区间的顶点动画,然后比较优先级,是直接打断当前动画执行还是等原来的执行完。

  三、接下来我把我魔兽争霸的顶点动画人物控制代码写下,作为案例注释助大家理解下。

  首先做顶点动画模型,此处制作过程省略,然后新建一个excel表做笔记

  表格设置的一些解释:

  表格如下:

  ---------------------------------------------------------------------------------------------------------------

  i

  ---------------------------------------------------------------------------------------------------------------

  上面这些表格的内容在刷出顶点动画人物后把类似(scene_prop_set_slot, reg0, 101, 60),结构的所有竖行都复制过去,进行初始化存数据,然后以下涉及镜头控制、stoprun变量控制的dynamic强制停止位移,aaa变量控制的rts等等参数的变化和控制代码写在其他触发器, 因为有很多配套代码要阉割出来比较麻烦,所以有些东西就下面的主体动画控制触发器里注释简单提及一下,不写出来了,主要提供最主要的动画控制代码的一个触发器(脚本)给大家看个整体思路:

  以下添加到module_mission_templates.PY需要的场景里,比如lead charge 野战,或者直接全部脚本化后每个场景触发器都引用一遍:

  条件推荐0.00000,0.00000,0.00000

这样的触手怪你喜欢吗「寄生兽漫画」 每周白嫖计划,Epic网红游戏即刻白嫖!