骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 708|回复: 4

[经验与教程] 关于item场景物化控制模拟新粒子系统的思路

[复制链接]

202

主题

984

回帖

986

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14521
精华
0
互助
90
荣誉
18
贡献
325
魅力
775
注册时间
2017-11-5
鲜花(428) 鸡蛋(0)
发表于 2024-2-29 08:26:57 | 显示全部楼层 |阅读模式
本帖最后由 vegetto 于 2024-2-29 09:03 编辑

之前在文章(关于场景物化item装备的具体用处
https://bbs.mountblade.com.cn/thread-2100580-1-1.html)讲了下spawned item生成后具备受大部分prop开头的op操作的能力,也就是spawned item本质近似prop ,但是又可以利用(scene_prop_set_prune_time, <scene_prop_id>, <value>),这操作进行彻底消失(删除),也就是比真正的prop类型物体拥有的控制生命周期的实力,为我们利用spawned item性质物体结合prop类型op操作来模拟粒子系统particle效果提供了较为完善系统的模拟基础。

一、对比原有particle粒子系统支持的参数及对应spawned item套用prop操作可以处理的类似效果
1、粒子模型和数量控制
对于原有particle粒子系统中创建粒子,首先我们要准备粒子模型导入brf,然后particle系统引用名称,填写数量。而对于prop化的spawned item,我们类似的,可以将我们准备好的一系列可以作为特效的模型,包括平面的、立体的、带顶点动画的模型预先导入brf,在module_items文件预先注册一定你认为后期足够不同特效种类数量使用的item模板,
比如
itm_tx1  ............略...........
itm_tx2
.....略..........
itm_tx1000
等等

注意要连续预留模板,因为你刚开始做不一定会想到成百上千特效,也来不及准备这些特效模型,如果你两个特效itm之间夹杂了其他如纯武器类型itm装备,那么你后期特效配置充足后,想要批量多特效调用如下新特效系统,对于某些方面的集中处理就不得不采用枚举法。
预留完成后,通过下面类似触发参考,代码指定使用的粒子模型和数量控制:
初始化阶段触发
(agent_set_slot, ":玩家", slot_存粒子名, ":itm_特效"), #为通用化代码,故将具体itm物体抽象成为不定变量,用变量再展开写各种prop控制操作,这样改此段就可以通用。
执行阶段触发
(agent_get_slot, ":粒子名称", ":玩家", slot_存粒子名),
(scene_spawned_item_get_num_instances, ":数量参数", ":粒子名称"),
(neg|ge, ":数量参数", 最大数量值),
(agent_get_position, pos30, ":玩家"),
  (set_spawn_position, pos30),
(spawn_item, "itm_特效", 0, 默认生命周期),  #生命周期填0则永久显示。
。。。。。。。。。。。。。。。。。。。。。。。。。。。
   (scene_prop_set_slot, reg0, 301, 2810),  #301到底是slot_什么功能自己定
    (scene_prop_set_slot, reg0, 302, 4200),
    (scene_prop_set_slot, reg0, 303, 2810),
    (scene_prop_set_slot, reg0, 304, 6820),
    (scene_prop_set_slot, reg0, 305, 2810),
    (scene_prop_set_slot, reg0, 306, 6820),
    (scene_prop_set_slot, reg0, 307, 10),
    (scene_prop_set_slot, reg0, 308, 860),
    (scene_prop_set_slot, reg0, 309, 100000),
    (scene_prop_set_slot, reg0, 310, 100500),
    (scene_prop_set_slot, reg0, 311, 870),
    (scene_prop_set_slot, reg0, 312, 1110),
    (scene_prop_set_slot, reg0, 313, 100000),
    (scene_prop_set_slot, reg0, 314, 100500),
    (scene_prop_set_slot, reg0, 315, 1120),
    (scene_prop_set_slot, reg0, 316, 1630),
    (scene_prop_set_slot, reg0, 317, 1640),
    (scene_prop_set_slot, reg0, 318, 2130),
(scene_prop_set_slot, reg0, 319, 100000),
一直set到自己需求够用的slot值,略
。。。。。。。。。。。。。。。。。
  (scene_prop_set_visibility, reg0, 0),                       #隐身以免刷出来被你自己看到
  (2612, reg0, 初帧时刻, 末帧时刻, 顶点动画播放速度),  #如果有些特效你要用的时候直接就使用它的一段顶点动画并循环,并且效果无论从起点还是中间开始取消隐身显形播放都差不多,就可以加这句循环播放顶点动画
利用excel表的公式填充功能,将所有你认为下一步可能用到的对spawned item进行的prop类型可变操作的参数进行初始化存储。


2、生命周期控制和渐隐控制
原有particle粒子系统我们知道可以填参数指定刷出粒子后多长时间消失,以及填写alpha变化参数,控制粒子模型外表虚化程度。而对于用prop化的spawned item,类似的我们可以如下处理:
首先利用slot,最好是我第1点初始化的(prop slot_周期变化) 来进行0-特定值的数值变化,另外用一个(prop slot_周期上限 )初始化时限制这个特定值,这样,两个slot统一到这个上限值后,利用 (scene_prop_set_prune_time, <scene_prop_id>, <value>), 来强制消失, <value>为0为立即消失,但是你也可以这么考虑,<value>填大于0的数,延缓消失,然后再同时使用 (scene_prop_fade_in, <scene_prop_id>, <fade_in_time>),来先渐隐。这样即有渐隐不那么突兀的消失效果,又可以利用prune彻底删除以防堆积内存。
此外(scene_prop_fade_out, <scene_prop_id>, <fade_out_time>), (scene_prop_fade_in, <scene_prop_id>, <fade_in_time>),这两个渐出和渐隐的对立效果,如果不和生命周期联系,其实就相当于原有particle粒子系统的alpha参数控制效果。

3、颜色控制
原有particle粒子系统我们知道可以填RGB参数控制粒子模型的贴图颜色变化,依据原有贴图样式调色。
而对于用prop化的spawned item,实际上我们无法做到这一点,但是我们可以使用贴图更换系统,也就是我这个帖子写的动图(序列图)模拟系统
(关于革命性操作贴图变换模拟动图系统在骑砍里的综合应用
具体就不多说了,反正我这么说吧,现在很多游戏其实能做华丽特效的,都不是我们骑砍这种particle粒子爆发像分子布朗运动形式的,比如大型光球,就是靠带动画的粒子模型撑起整个特效模型的骨架,然后周边嵌入正方形片面模型播放序列图(也就是类似动图,比如像传奇合金弹头这些2d游戏,2d会动素材并不是动图,而是像我这样把动图分解成各帧,然后根据帧数切换),通过动图可以产生的不规则比如气体漫流火花等效果,缠绕在立体模型周边,营造这种边缘效果。
4、运动及动画控制
原有particle粒子系统可以通过调整一些参数控制运动,比如重力不就是向下(z)运动,初始速度方向xyz参数就是移动前的特效prop在场景的初始朝向调整,而速度参数就是xyz方向prop_instance_animate_to_position填写参数根据触发间隔的调整,震荡就是记录自己开始做震荡运动前的位置,然后move xyz 值根据触发时间频率来回正负值,进行“晃动”。
首先大量特效spawned item集中控制进行如下代码模板:
(scene_spawned_item_get_num_instances, ":特效模型数量", "itm_特效模型"),
  (ge, ":特效模型数量", 指定刷出上限数量值),
(try_for_range, ":同一特效模型序数", 0, ":特效模型数量"),
         (scene_spawned_item_get_instance, ":特定特效模型对象", "itm_特效模型", ":同一特效模型序数"),
          (scene_prop_slot_eq, ":特定特效模型对象", slot_允许进行操作, 特定值),
       (prop_instance_get_position, pos3, ":特定特效模型对象"),
。。。。。各种针对":特定特效模型对象"进行的prop类型op操作,略。。。。。。。。。。
   (try_end),

比如下面简单写个prop运动参考一下
(prop_instance_get_position, pos2, ":特效模型对象"),
     (try_begin),
        (scene_prop_get_slot, ":旋转值", ":特效模型对象", slot_x旋转量),
        (position_rotate_x, pos2, ":旋转值"),
     (try_end),
     (try_begin),
        (scene_prop_get_slot, ":旋转值", ":特效模型对象", slot_y旋转量),
        (position_rotate_y, pos2, ":旋转值"),
    (try_end),
     (try_begin),
        (scene_prop_get_slot, ":旋转值", ":特效模型对象", slot_z旋转量),
        (position_rotate_z, pos2, ":旋转值"),
     (try_end),
     (try_begin),
        (scene_prop_get_slot, ":平移值", ":特效模型对象", slot_x平移量),
        (position_move_x, pos2, ":平移值"),
     (try_end),
     (try_begin),
        (scene_prop_get_slot, ":平移值", ":特效模型对象", slot_y平移量),
        (position_move_y, pos2, ":平移值"),
    (try_end),
     (try_begin),
        (scene_prop_get_slot, ":平移值", ":特效模型对象", slot_z平移量),
        (position_move_z, pos2, ":平移值"),
     (try_end),
    (prop_instance_animate_to_position, ":特效模型对象", pos2, 运动完成总时间),

也就是说,我在刷spawned item特效物体时利用scene_prop_set_slot, reg0初始化了下运动的平移旋转六种运动分量参数,然后运行特效物体运动时取出来完成运动。
对于重力则对move z进行物理公式化处理参数,对于震荡,则slot构造计时器来指定一段时间进行往复xyz偏移运动。
从一定角度看,运动也是动画的一种,
但是但是但是但是但是但是!!!
particle粒子系统无法操作除运动以外的如顶点动画之类的变形动画,而prop可以,那prop化的spawned item也可以操作顶点动画。比如这个帖子(树根缠绕顶点动画源文件下载和代码使用方法
https://bbs.mountblade.com.cn/thread-2104058-1-1.html),你用particle粒子系统就无法模拟树根缠绕的动画效果,具体顶点动画控制的理论方法可以看此贴(战团-顶点动画综合控制理论体系,独家研究

5、放大缩小
particle粒子系统可以对粒子模型进行放缩,而spawned item利用如下prop操作也可以做到:

(prop_instance_set_scale, 场景物的instance id, x, y, z),  #对场景物品prop进行放大缩小。xyz填数字或变量,是浮点数,假如开头(set_fixed_point_multiplier, 1000), 那么x/1000就是模型x坐标方向拉长的倍数,同理yz,也就是你也可以不均匀放大场景物体,然后注意无论你后面如何反复使用这个op操作,参数的倍数都是按照你的初始倍数来的,比如你连续写了两次(prop_instance_set_scale, reg0, 2000, 2000, 2000), reg0代表的物体还是长宽高原来的两倍。  


6、碰撞障碍物检测
这个是particle粒子系统光靠自身系统不便做到的,而spawned item利用prop操作后可以利用(cast_ray, <destination>, <hit_position_register>, <ray_position_register>, [<ray_length_fixed_point>]),
(position_get_distance_to_terrain, <destination>, <position>),    (position_get_distance_to_ground_level, <destination>, <position>), 这些操作来判断解决。


7、关于计时器
根据我上面几个系统的解释,实际上要做到运动和动画控制等等变化,离不开计时器的控制,可以参考此贴(关于通过顶点顶画构造场景内的计时器和延时触发的做法
我个人觉得,这种依靠场景物类型模型进行各种操作的东西,我们除了slot控制计时器,也可以利用顶点动画本身计时性质来做计时器。
------------------------------------

所以综上,抛去未大量应用未知对系统的负担问题,spawned item利用prop操作后,相比于particle粒子系统,优势是spawned item基本可以做到particle粒子系统所有变化控制特性,并且可以做到particle粒子系统难以直接实现或不能实现的“生命周期自由控制、形变动画控制、贴图样式变化、更自由多变的轨迹控制和中途控制位移停滞、放大缩小等等随心所欲而不用根据时间周期指定朝一个方向改变”等等,缺陷就是需要提前想好各种系统模拟的触发器写法,并综合起来。实际上,对于运动以外的功能,我们利用slot初始化prop的各种特性预存起来调用,对于大部分特效制作是通用的,而对于运动来说,一次性刷出来的多个特效物体不一定都是朝一个位置、一个方向、一个速度发射并做一类运动,比如烟花,就是四面八方发射,所以我们做一个通用化的spawned item新粒子系统的脚本时,要多做几个常用的prop运动控制子脚本来选择。




评分

参与人数 1第纳尔 +20 互助 +1 魅力 +10 收起 理由
Aomine Daiki + 20 + 1 + 10 您的帖子很有价值!

查看全部评分

30

主题

200

回帖

169

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1472
精华
0
互助
20
荣誉
0
贡献
0
魅力
50
注册时间
2015-3-3
鲜花(43) 鸡蛋(0)
发表于 2024-2-29 09:11:15 | 显示全部楼层
居然是热乎,最近还在想有没有可控的粒子效果,你这不就来了吗

29

主题

690

回帖

551

积分

骑士

Rank: 4Rank: 4

UID
3322408
第纳尔
1738
精华
0
互助
67
荣誉
0
贡献
0
魅力
4
注册时间
2022-2-3
鲜花(55) 鸡蛋(0)
发表于 2024-2-29 10:08:02 来自手机 | 显示全部楼层
我这里spawn item接deform类操作符调用顶点动画,但是没反应,挺奇怪的。来自: Android客户端

202

主题

984

回帖

986

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14521
精华
0
互助
90
荣誉
18
贡献
325
魅力
775
注册时间
2017-11-5
鲜花(428) 鸡蛋(0)
 楼主| 发表于 2024-2-29 10:29:08 | 显示全部楼层
112233lyh 发表于 2024-2-29 10:08
我这里spawn item接deform类操作符调用顶点动画,但是没反应,挺奇怪的。

有用,我这样操作过近千帧数人形的动画模型,要么是你动画本身处理不对

29

主题

690

回帖

551

积分

骑士

Rank: 4Rank: 4

UID
3322408
第纳尔
1738
精华
0
互助
67
荣誉
0
贡献
0
魅力
4
注册时间
2022-2-3
鲜花(55) 鸡蛋(0)
发表于 2024-2-29 12:14:28 来自手机 | 显示全部楼层
vegetto 发表于 2024-2-29 10:29
有用,我这样操作过近千帧数人形的动画模型,要么是你动画本身处理不对 ...

是直接spawn一个item然后用deform in range就行了吗,还需不需要别的flag、itp或者什么操作?因为我用你的树根模型也动不了。来自: Android客户端
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-5-1 02:41 , Processed in 0.130908 second(s), 28 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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