骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 衣谷三国
查看: 2465|回复: 4

[功能与代码] 变革骑砍动画系统之add mesh部件换装动画系统

[复制链接]

215

主题

1038

回帖

1051

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14867
精华
0
互助
93
荣誉
21
贡献
325
魅力
1384
注册时间
2017-11-5
鲜花(435) 鸡蛋(0)
发表于 2025-8-1 20:33:54 | 显示全部楼层 |阅读模式
本帖最后由 vegetto 于 2025-8-1 22:40 编辑

之前讲了骑砍的2D动画系统(利用item/prop/界面overlay mesh各自的set material切换材质贴图),以及顶点动画系统(利用prop/spawned item 利用deform系列的op制作超越战团动作细节的动画,如履带滚动、降落伞、衣服头发飘动、整体怪物载具动画、双截棍等动态武器等等)。

而这次我要介绍一个更加革命性的自研动画系统,add mesh部件换装动画系统。


基本原理:通过agent equip item + cur_item_add_mesh 两个基本操作op组合,形成类似顶点动画效果的复杂模型动画。


核心配套处理:
(1)第一步
module_string文件注册类似如下字符串
("amjb", "a{reg21}"),
作用是利用reg的可操作性,进行加减乘除的数字变化,使得str_amjb可以动态注册a1,a2,a3.。。。。。。。。。。。。。。a1000000等等无穷无尽的不同字母带数字后缀的字符串。
(2)第二步
将类似顶点动画的素材分解成各帧的obj模型导入BRF(最佳方式可以先做md3格式动画,导入brf后进行分解,分解时自动可以加前缀+数字命名);
将brf中的动画序列的静态模型以a1,a2,a3.。。。。。。。。。。。。。。。。。。。。a1000000等等 形成字母+数字后缀的命名方式。
(3)第三步
brf导入一个最简单的模型,比如四面体,然后贴图材质引用全透明,即这种情况游戏中看不见模型形态。
假设这个通用底模在brf里命名叫proprole0,作为衣服绑好骨。
(4)第四步
module_items文件注册itm_proprole0的id,并引用proprole0作为基础模型。加入如下item初始化触发器。


["proprole0", "proprole0", [("proprole0", 0)], itp_type_body_armor|itp_covers_legs|itp_doesnt_cover_hair|itp_can_penetrate_shield|itp_fit_to_head|itp_offset_lance|itp_covers_head|itp_couchable|itp_covers_beard|itp_no_pick_up_from_ground, 9223388534117761038, 250, weight(10.000000)|abundance(100)|difficulty(10)|head_armor(0)|body_armor(0)|leg_armor(0), imodbits_axe, [
    (ti_on_init_item, [
        (store_trigger_param_1, ":var_0"),
        (store_trigger_param_2, ":var_1"),
        (try_begin),
            (agent_get_slot, ":var_2", ":var_0", 602),
            (assign, reg21, ":var_2"),
            (str_store_string, s21, "str_amjb"),
            (1964, s21),
            (val_add, reg21, 1000000),
            (str_store_string, s21, "str_amjb"),
            (1964, s21),
            (val_add, reg21, 1000000),
            (str_store_string, s21, "str_amjb"),
            (1964, s21),
            (val_add, reg21, 1000000),
            (str_store_string, s21, "str_amjb"),
            (1964, s21),
            (val_add, reg21, 1000000),
            (str_store_string, s21, "str_amjb"),
            (1964, s21),
        (try_end),
    ]),
]],
###############以上代码,部分玩家应该知道,我也是txt做的各种mod。
###############我以上示例add mesh 连用了5次,意味着示例中需要5个部件才能展示这个动态模型的一个单帧模型全貌,事实上你可以用1次或连用其他N次,取决于你要附着的模型本身分成几个mesh(由贴图数量决定),所以这样还挺有排列组合的意味,或者你也可以预留空位,就是add mesh多次,然后部分不用的部分附着一个全透明的空模型代替。

1964这个op操作号就是cur_item_add_mesh。
一般需要和str_store_string组合使用,因为引用的字符串需是s21这种形式,而不是str_xxx这种。
由于str_amjb=a{reg21},前已设置,那么我们操作reg21的加减乘除变化,利用agent 602号slot(我添加作为控制动画帧数的slot,在MT中另外有触发器控制其变化)。
这样每次人物刚穿着这个衣服proprole0,就会触发添加部件的cur_item_add_mesh指令。
比如agent 602号slot如果取值取0,则会给衣服proprole0添加brf中装载的名称为a0,a1000000,a2000000,a3000000,a4000000这四个模型部件(想象力不到,则参考我附件图片的brf命名情况,我把一个mmd女性动画的头发、脚等部位分成多个同一动画序列的静态各帧mesh)。
但前期工作导入brf中a0,a1000000,a2000000,a3000000,a4000000模型时,需按照部件需要与proprole0搭配的位置摆放好位置,然后也绑定战团身体骨骼admon块,否则无骨骼衣服身体在战团里看不到模型。
为什么要a0,a1000000,a2000000,a3000000,a4000000绑定admon块骨骼,因为这个是腰部的骨骼,绑定模型后人物做大部分动作不会导致模型扭曲,这样切换模型mesh部件时可以显示其原汁原味的形态,而不会遭受战团骨骼动作的拉伸扭曲。

然后类似的agent 602号slot如果取值变成1,那么部件就变成a1,a1000001,a2000001,a3000001,a4000001.

接下来问题来了,大家关注过这个cur_item_add_mesh看注释知道,这个指令只能用于item初始化,误以为在战场只有一次性的效果,无法形成动态的变化。

其实不然,那看接下来第五步
(5)第五步
在module_mission_templates创建 类似0,0,0条件的战场触发器。
循环agent,对需要使用换装动画的agent不断触发agent unequip item/agent equip item操作,使得agent反复卸载重新装备同一个装备,即这个proprole0底模,并用我注册的agent slot602号记录装备重置的次数,并根据agent的行为事件及想要执行的动作事件(比如做飞龙喷火动作),引发agent slot602号的改变及在某一值区间变化,根据这个值区间及特定值,触发事件,根据特定事件,反馈造成值的改变,进而被itm_proprole0的ti_on_init_item初始化触发获取,因为不断重新装备proprole0这件衣服,重新装备的瞬间,itm_proprole0的ti_on_init_item又会重置运行一次,这样循环往复,就会形成类似顶点动画的“幻灯片效果”

(6)其他准备:如果完全用衣服模型替换战团人物外形做怪物,请准备一些手套、头盔、鞋子的屏蔽模型,对相关agent进行强制equip,避免战团原有头、手脚漏泄。

具体module_mission_templates后续再附上,我后面试验的mod改动太复杂,删减精简出来代码太麻烦。反正原理就是这个原理。
相关试验mod就是我最新的西游、变形金刚、英雄联盟、伍六七改。参考视频如下





对于伍六七,我用这个方法重做了魔刀千刃的效果,这样做的优势是,避免了人移动速度快时,用prop做会导致出现,马在前面跑,prop动态武器在后面追的情况。
也就是你也可以底模不像proprole0案例做无形模型,可以做一个有形的衣服,然后动态附着魔刀千刃破碎重组的动态动画分解的各帧模型作为mesh部件,形成动态武器的效果。
这样做不仅克服了过去prop做特殊动态武器时的游戏运行负担,而且可以避免agent与prop的双循环复杂写法,直接通过换装的方式仅仅利用agent循环就把动态武器和人绑定在一起。

----
此外这个操作用于同一个人换装加mesh部件就是动画效果,一人动态千面,批量使用于不同单位,如在itm_proprole0的ti_on_init_item初始化加入对troop id兵种的判断,添加不同mesh部件,就变成“千人千面”效果,两者一结合,就变成“千人动态千面”,让上百人变成飞龙等特殊动画怪物,或者拿着动态的武器(双截棍、滚动的电锯),加会动的翅膀(衣服绑定翅膀部件各帧换装切换)。
这些情况下,你仅仅只需要注册一个item id就可以完成一个人或多个人形态的千变万化,72变。

甚至于,你可以考虑战团动作和换装形成的帧动画进行混搭,你可以战团动作做着做着,变成一滩血水的动画,再恢复人形继续做战团动作,或化身飞龙动画又变回人类。
又甚至于,你可以做乳摇效果,比如利用mmd模型生成乳摇的Tpose女性人物,然后导出md3,到brf进行绑骨后分解静态模型mesh,利用我如上的方法,就可以形成有乳摇动画的性感女神。

总之,如果你能感受到“部件换装动画”的强大前景,对战团无疑也是一种新的助力发展,又能做很多新东西。后面有空我再补全我的代码示例。






QQ浏览器截图20250801203706.png
QQ浏览器截图20250801203654.png

215

主题

1038

回帖

1051

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14867
精华
0
互助
93
荣誉
21
贡献
325
魅力
1384
注册时间
2017-11-5
鲜花(435) 鸡蛋(0)
 楼主| 发表于 2025-8-1 20:58:20 | 显示全部楼层
本帖最后由 vegetto 于 2025-8-1 21:36 编辑

接下来介绍下这个操作的局限性和bug问题、相关注意点。

1、身体摇摆问题的解决
如果你只是身体装备局部部件的改变,无所谓,如果整体都置换成为一个全新的动画怪物或LOL英雄人物这种,请注意
因为战团的动作你难以完全控制其不运行,所以如果用换装动作做整体怪物,身体会因为战团动作的腰部运动而晃动模型,比如你按E踢一脚,因为上半身腰部后倾,导致模型也后倾,这时因为你是整体怪物模型替换,就会显的你怪物摇摇晃晃,脚不着地的感觉。
这种情况处理方式如下。
创建一个腰板一直挺直的战团骨骼动画,然后注册action为最优先级的动作,然后循环agent equip换装操作的同时,强制agent set animation 用这个动作,保持各种行为下,腰板处于挺直状态,这样整体替换怪物动画模型时,就不会明显前后左右摇晃身体了。


2、频繁换装导致攻击失效的解决
为什么我上面说做刺客伍六七的魔刀千刃要用衣服性item装备,因为换武器装备时equip有相关的拿武器动作,无法实时用于攻击行为的武器。
而用于衣服等其他装备的部件时,也有bug,就是频繁换装导致人物attack的realse释放攻击动作只能做一半,不能造成伤害,所以攻击时,需要加一个极短的触发计时,在攻击的一瞬间把equip实时高频换装的MT触发器条件暂停下来,攻击完成后再恢复。
以上这个bug主要影响玩家!!!!!


3、频繁换装导致agent无法骑马奔跑。
这个解决不了,就是只对ai有这个问题,一旦ai的agent频繁换装,马就会在原地不动,不会跑了。我的解决方式是,除了玩家自己,其他用了换装动画的agent取消骑马。

4、用多了卡但优点是,如果是顶点动画运行几千帧数的几千面模型,几个agent就崩溃了,而使用部件mesh添加的换装动画,可以运行更多的人物动画。但是也是有上限的。
对于我的电脑,应该还可以,只能运行2000面的人物动画到50人左右,承受这么多人一秒五六个不同动画帧形态的换装频率。
当然,我用这些操作都是偏门的往战团崩溃的极限去挑战,如果你们适当运用的,前景也是挺广大的,至少可以做个动态武器不是。

5、请注意,如果是做动态武器mesh附着在衣服装备上,在BRF里对模型加载的就不是战团的admon腰部骨骼,而是选择右手武器骨骼(itemR)加载,或者自行做动画时适配战团的骨骼动画武器点;其他需要附着特殊部位的同理,根据不同附着部位加载不同的战团骨骼。如果你不加载正确部位的骨骼,那么add的mesh部件就不能完美适配你的衣服身体主体做战团各种骨骼动画时的相应身体部位上。

6、建议使用我之前分享的顶点动画软件,先做顶点动画,导入brf后加载战团绑骨后,再分解成为各帧静态mesh,为什么呢,这样你有的动画模型原文件可以在brf备份中拉动动画进度条,判断动作的分解,比如你这个动画序列有走路有砍人有技能动作,那么哪个帧数区间是哪个动作呢,分解成静态模型后再数是比较眼花的。


总之,相对于顶点动画,换装动画的最大优势就是,游戏运行负担小一点,并且摆脱agent和prop的双循环写法,直接把人物和换皮动画绑定,另外,对于不同怪物形态或动态武器等等,不用创建不同id的对象,仅仅只需一个item id就可以让一个人或多个人展示不同的样貌及动作状态,正可谓“七十二变”,而prop还有无法完全移除instance id 堆积内存的苦恼(但是请提醒,spawned item也是prop性质,可以借助prop各种op操作,还能额外使用scene prop set prune time完全移除instance id存在本身,也是一种战团新式动画运用的方向,之前也介绍过,可以用于模拟做有生命周期,可控制放大缩小颜色贴图顶点动画的特效系统,此是题外话)。


此外和我之前介绍的2D动画系统一样,再次推广我的素材编序理论,即把brf中的模型、材质及texture的贴图,全部以字母+数字的方式命名,这就好比把模型贴图素材形成了类似于item id、troop id、 party id、prop id等等的序列文件,这样运用set material及add mesh这种op操作时,就能让一个模型承载成千上万无穷无尽的模型部件及贴图图片,仅仅靠一个模型及创建的一个id,就可以呈现千变万化互通的素材。就像troop id一样,能够在代码中循环id,id加减乘除,批量操作不同的素材对象,摆脱“this or next”的枚举写法,真正的解放生产力,富有创造力、变幻力,让战团的一切都拥有模拟其他游戏的动态素材能力,无论是只狼的打击技能特效,还是细节的人物、动植物武器动作,都能游刃有余,信手拈来(当然战团干猛了就run error跳出的尿性是真的没法解决~~~~~~~~~~~~~)






34

主题

237

回帖

196

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1607
精华
0
互助
23
荣誉
0
贡献
0
魅力
85
注册时间
2015-3-3
鲜花(62) 鸡蛋(0)
发表于 2025-9-1 18:28:35 | 显示全部楼层
频繁换装导致agent无法骑马奔跑。
这个解决不了,就是只对ai有这个问题,一旦ai的agent频繁换装,马就会在原地不动,不会跑了。我的解决方式是,除了玩家自己,其他用了换装动画的agent取消骑马。

大佬大佬,这个功能,能作为停马功能吗(关注点不太对)

34

主题

1001

回帖

2556

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2755938
第纳尔
6288
精华
12
互助
13
荣誉
98
贡献
85
魅力
265
注册时间
2016-7-5

骑砍中文站APP会员勋章骑士美德之忠诚勋章[杰出会员精华勋章]骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之正义勋章[杰出会员荣誉勋章]元老骑士勋章

鲜花(250) 鸡蛋(0)
发表于 2025-9-1 18:39:07 来自手机 | 显示全部楼层
剑走偏锋啊

44

主题

101

回帖

224

积分

见习骑士

Rank: 3

UID
3199602
第纳尔
1162
精华
0
互助
36
荣誉
0
贡献
1
魅力
227
注册时间
2020-9-4
鲜花(60) 鸡蛋(0)
发表于 2025-9-5 15:24:52 | 显示全部楼层
战争傀儡阿格兰 发表于 2025-9-1 18:28
频繁换装导致agent无法骑马奔跑。
这个解决不了,就是只对ai有这个问题,一旦ai的agent频繁换装,马就会在 ...

停马直接强制播动作就行了。
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2025-9-13 03:44 , Processed in 0.111903 second(s), 26 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表