本帖最后由 vegetto 于 2023-1-5 07:44 编辑
当我们要做一些带有动画的特殊武器时,不可避免要采取场景物模拟武器再设置从动运动于人体武器骨骼坐标点的方式,比如需要运行特殊顶点动画的武器(如被用烂的链枷),需要带有碰撞体可以挤压打飞人的武器等等。
本功能魔刀千刃就是采用场景物prop模拟武器设置到使用者手上跟随运动的方式。魔刀千刃的效果,看过b站动画的都知道就是刀刃破碎重组的动画。按理来说这里应该首先考虑顶点动画做这个动画特效,但是实际上并不可取。
因为顶点动画本身的mesh数量有上限,也就是模型点线面没有一丝连接的碎片不可以上百,而魔刀千刃的特性就必须采用破碎动画破成很多。也就是纵使我可以用软件用源动画强行生成,模型本身必然会坍陷或者碎片之间自动生成藕断丝连的连丝。
所以这里考虑采用多个动画分割状态的模型切换显示的方式。也就是打比方模型动画0-9帧数分割10个模型,一个时间点只显示一个模型,另外9个用 scene_prop_set_visibility影身,然后根据时间进程循环往复不同的状态给玩家看到。这也是告诉大家另外一种动画模拟方式。本功能已用于我modhttps://bbs.mountblade.com.cn/thread-2080220-1-1.html,相关模型到我的nnkobject.brf里面找参考看看,但是不可随便提取自用,什么时候把我的飞檐走壁功能也写给你们看看。
魔刀模型动画的制作我是用blender的破碎插件做的,插件用起来比较简单,有多种破碎效果可以选择,然后可以导出fbx,这个自行搜索研究。
以下是代码实例:
module_scene_props.PY添加如下几行
("mdq", sokf_moveable, "mdq", "0", []), #魔刀千刃的手柄部分
("mdq3", sokf_moveable, "mdq3", "0", []), #魔刀千刃剑刃部分完全破碎的模型
("mdq5", sokf_moveable, "mdq5", "0", []),
("mdq7", sokf_moveable, "mdq7", "0", []),
("mdq9", sokf_moveable, "mdq9", "0", []),
("mdq11", sokf_moveable, "mdq11", "0", []),
("mdq13", sokf_moveable, "mdq13", "0", []),
("mdq15", sokf_moveable, "mdq15", "0", []),
("mdq17", sokf_moveable, "mdq17", "0", []),
("mdq19", sokf_moveable, "mdq19", "0", []), #mdq3-19是魔刀千刃剑刃部分由完全破碎的模型到恢复完整剑刃的各个动画过渡阶段分割模型
("mdq21", sokf_moveable, "mdq21", "0", []), #魔刀千刃剑刃部分完全聚合成剑刃形状的模型
module_items.PY添加如下一行
["mdqr", "mo_dao_qian_ren", [("invalid_item", 0), ("mdqr", ixmesh_inventory)], itp_type_one_handed_wpn|itp_primary|itp_secondary, 9223388529554358287, 3, weight(1.500000)|abundance(100)|difficulty(0)|weapon_length(140)|spd_rtng(103)|swing_damage(16, blunt)|thrust_damage(10, blunt), imodbits_none],
#虽然魔刀千刃的武器模型由场景物prop模拟,但是右下角图标由items装备决定,即模型名称mdqr代表的模型是魔刀千刃聚合状态包含手柄的模型。
以下添加到module_mission_templates.PY需要的场景里,比如lead charge 野战,或者直接全部脚本化后每个场景触发器都引用一遍:
触发器(1)-目的-控制魔刀千刃由完全破碎的模型到恢复完整剑刃的各个动画过渡阶段分割模型的切换显示和影身,来形成动画变换效果。
推荐条件采用0.000000, 0.000000, 0.000000,
(get_player_agent_no, ":var_0"), #玩家id设为:var_0
(scene_prop_get_num_instances, ":var_20", "spr_mdq"),
(try_begin), #所有和魔刀千刃有关的场景物模型都刷出一遍
(eq, ":var_20", 0),
(store_add, ":var_21", "spr_mdq21", 1),
(try_for_range, ":var_22", "spr_mdq", ":var_21"),
(agent_get_position, pos10, ":var_0"),
(position_move_y, pos10, -5000),
(position_move_z, pos10, -50000),
(set_spawn_position, pos10),
(spawn_scene_prop, ":var_22"),
(try_end),
(try_end),
(eq, ":var_20", 1),
(agent_get_slot, ":var_1", ":var_0", 412), #玩家自身的412序号agent slot代表对魔刀千刃特定状态的剑刃模型状态切换时间进程的控制
(try_begin),
(is_between, ":var_1", 0, 150),
(val_add, ":var_1", 1),
(agent_set_slot, ":var_0", 412, ":var_1"), #玩家自身的412序号agent slot在0-150不停+1循环到150再归0再循环
(try_begin),
(is_between, ":var_1", 0, 50),
(val_div, ":var_1", 5),
(store_add, ":var_6", "spr_mdq3", ":var_1"), #slot412每变化5(时间量),从spr_mdq3开始序号依次+1,得到的场景物id存于:var_6,50除5共变化10次,mdq3-21刚好10个模型状态,slot412在0-50变化时正好正序依次均匀时间切换完这一组模型
(store_add, ":var_7", "spr_mdq21", 1), #为了下面循环和区间between判断时填区间上限
(else_try),
(is_between, ":var_1", 50, 100),
(assign, ":var_6", "spr_mdq21"), #slot412在0-50变化时,:var_6稳定代表魔刀千刃的最终聚合状态
(store_add, ":var_7", "spr_mdq21", 1), #为了下面循环和区间between判断时填区间上限
(else_try),
(is_between, ":var_1", 100, 150),
(val_sub, ":var_1", 100),
(val_div, ":var_1", 5),
(store_sub, ":var_6", "spr_mdq21", ":var_1"), #slot412每变化5(时间量),从spr_mdq21开始序号依次减1,得到的场景物id存于:var_6,50除5共变化10次,mdq3-21刚好10个模型状态,slot412在0-50变化时正好倒序依次均匀时间切换完这一组模型
(store_add, ":var_7", "spr_mdq21", 1), #为了下面循环和区间between判断时填区间上限
(try_end),
(is_between, ":var_6", "spr_mdq3", ":var_7"),
(scene_prop_get_instance, ":var_8", ":var_6", 0), #:var_6 id的场景物获取实例,该物体即为当前需要切换显示的物体,在mdq3-21中选择
(scene_prop_get_instance, ":var_9", "spr_mdq", 0), #剑柄场景物获取实例
(try_begin),
(agent_slot_eq, ":var_0", 413, 1), #玩家自身的413序号agent slot代表是否手上在使用魔刀千刃
(scene_prop_set_visibility, ":var_8", 1), #需要显示剑刃的特定状态场景物模型
(scene_prop_set_visibility, ":var_9", 1), #显示剑柄场景物模型
(else_try),
(scene_prop_set_visibility, ":var_8", 0), #影身当前需要显示剑刃的特定状态场景物模型
(scene_prop_set_visibility, ":var_9", 0), #影身剑柄场景物模型
(try_end),
(try_for_range, ":var_10", "spr_mdq3", ":var_7"), #循环所有状态的魔刀千刃剑刃部分场景物模型,即循环mdq3-(mdq21+1)
(scene_prop_get_instance, ":var_11", ":var_10", 0), #获取被循环到的剑刃状态场景物模型实例
(agent_get_bone_position, 10, ":var_0", 19, 1), #获取玩家右手武器点(骨骼编号19)的骨骼坐标为pos10
(prop_instance_set_position, ":var_11", pos10), #循环所有状态的魔刀千刃剑刃部分场景物模型设置位置到玩家武器抓握处
(prop_instance_set_position, ":var_9", pos10), #魔刀千刃剑柄部分场景物模型设置位置到玩家武器抓握处
(neg|eq, ":var_11", ":var_8"), #结合下一句看
(scene_prop_set_visibility, ":var_11", 0), #如果循环所有状态的魔刀千刃剑刃部分场景物模型不是slot412循环过程判断的应该显示的剑刃状态,则影身
(try_end),
(else_try),
(agent_set_slot, ":var_0", 412, 0), #如果slot412到150,则归0,即slot412控制了0-150循环的时间过程和对应的时件状态循环
(try_end),
触发器(2)-目的是为了玩家按F和滚轮必定只能装备魔刀千刃,按G丢掉所有装备,其实这个不重要,作为我的测试mod自己的前期设定,实际上只要关注我的触发器(1)由玩家agent slot的413号slot决定是否装备魔刀千刃,也就是slot413为1会按照slot412的进程控制选择显示一个剑刃和剑柄,其他剑刃影身,而slot413为0时所有剑刃和剑柄都影身。所以触发器(2)主要围绕slot413的取值控制根据什么条件变换来的,可以依据自身设想的设定调整。
推荐条件采用0.000000, 0.000000, 0.000000,
(get_player_agent_no, ":var_0"),
(try_for_range, ":var_2", 0, 4),
(agent_get_item_slot, ":var_3", ":var_0", ":var_2"),
(neg|eq, ":var_3", -1),
(neg|eq, ":var_3", "itm_mdqr"),
(agent_unequip_item, ":var_0", ":var_3"),
(try_end), #以上表示把玩家装备的和魔刀千刃无关的武器都移除
(agent_get_animation, ":var_5", ":var_0", 1),
(try_begin),
(agent_slot_eq, ":var_0", 414, 0),
(this_or_next|key_clicked, key_f),
(this_or_next|key_clicked, key_mouse_scroll_up),
(key_clicked, key_mouse_scroll_down),
(agent_set_slot, ":var_0", 414, 1),
(agent_set_slot, ":var_0", 413, 1),
(neg|agent_has_item_equipped, ":var_0", "itm_mdqr"),
(agent_equip_item, ":var_0", "itm_mdqr"),
(agent_set_wielded_item, ":var_0", "itm_mdqr"), #以上表示,slot414只从0变到1一次,即开始战斗玩家不装备武器,所以滚轮或F一下先装备一下魔刀
(else_try),
(agent_slot_eq, ":var_0", 414, 1),
(this_or_next|key_clicked, key_f),
(this_or_next|key_clicked, key_mouse_scroll_up),
(key_clicked, key_mouse_scroll_down),
(agent_set_slot, ":var_0", 413, 1),
(neg|agent_has_item_equipped, ":var_0", "itm_mdqr"),
(agent_equip_item, ":var_0", "itm_mdqr"),
(agent_set_wielded_item, ":var_0", "itm_mdqr"), #以上表示,装备过魔刀后,滚轮或F一下还是只能装备魔刀
(else_try),
(agent_slot_eq, ":var_0", 414, 1),
(key_clicked, key_g),
(agent_set_slot, ":var_0", 413, 0),
(try_for_range, ":var_2", 0, 4),
(agent_get_item_slot, ":var_3", ":var_0", ":var_2"),
(neg|eq, ":var_3", -1),
(agent_unequip_item, ":var_0", ":var_3"),
(try_end),
(else_try), #以上表示,按G会丢弃包括魔刀以内所有武器
(this_or_next|is_between, ":var_5", "anim_ready_swingright_fist", "anim_ready_slashright_twohanded"),
(is_between, ":var_5", "anim_defend_fist", "anim_defend_shield_forward"),
(agent_set_slot, ":var_0", 413, 0),
(try_for_range, ":var_2", 0, 4),
(agent_get_item_slot, ":var_3", ":var_0", ":var_2"),
(neg|eq, ":var_3", -1),
(agent_unequip_item, ":var_0", ":var_3"),
(try_end), #以上表示,如果玩家使用拳击动作,则清除使用魔刀千刃的状态
(try_end),
视频效果
|