骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

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

[经验与教程] 战团-关于利用场景物及界面系统制作各种神奇特效并灵活控制的理论体系(未写完)

[复制链接]

202

主题

984

回帖

986

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14521
精华
0
互助
90
荣誉
18
贡献
325
魅力
775
注册时间
2017-11-5
鲜花(428) 鸡蛋(0)
发表于 2023-1-6 11:25:14 | 显示全部楼层 |阅读模式
本帖最后由 vegetto 于 2023-1-6 17:28 编辑

前言:大家对于骑砍游戏里的特效用的最多的是粒子系统,而粒子系统特效用的最多的形式是颗粒状的布料运动,但是特效其实实现的方法还有很多,比如场景物模拟,add missle的箭矢类物品发射模拟以及shader,甚至界面presentation系统。
首先先谈谈我们对于特效的实际需求和表现形式。其实很多情况我们是需要一个或若干组合的特效模型根据我们的需要,对于特定的主体对象的部位或特定的位置,选择一个相对位置释放显示其特效模型或模型组的外在特征,并对于特效模型可能需要进行一些简单运动(平移、旋转,带有抛物线的喷射
,需要或不需要重力阻力影响,及某个范围的随机往复震荡运动),需要或不需要改变贴图颜色和透明度,甚至需要或不需要直接改变贴图,需要或不需要放大缩小,需不需要具体的形态动画如骨骼(X)和帧动画。而前面大部分的需求可以被粒子系统满足,少部分需求可以被shader和missle箭矢类物品满足,但是场景物系统却可以满足我前面几乎所有需求的控制,但是对相关理论体系的掌握要求更全面,至于界面系统主要是用于需要屏幕面前的一些特写类的状态类效果(比如用烂的血屏),使用场合比较特殊但是也有很大的应用潜力。


所以我们把特效也要看作一个广义的概念,什么是特效,服务我们特定含有或不含有模型的对象为增强其表现力而进行一切状态变化的其他模型或模型组,所形成的视觉表象。



对于粒子系统教程比较多,我只说一点想法:粒子采用颗粒状小模型(一般不需要肉眼可见单体模型外表构成)大量组成布料运动形式表现特效时,类似物理学的布朗运动,每个粒子模型像是一个水分子形成流体的感觉,可以做一些流动绵密比如水雾雪,但是大家往往忽略用少量大型模型(需要肉眼可见单体模型外表构成)直接作为特效,也就是以大型模型整体外观的颜色RGB和透明度alpha变化来做,比如我七龙珠利用一个环形齿轮状的模型添加了放大和透明度改变的参数来做气功波打击地面的沙浪波以及龙珠对拳打出的气浪就是一个纸片模型微微放大一段时间显示再消失,还有大家在某些奇幻mod玩到的闪电等等瞬发型技能效果,就是一个大的片面mesh模型某些保持有贴图显示的平面正对镜头来显示一段时间。所以说对于粒子系统特效的表现形式,就是利用自己运动放缩颜色透明度在特定时间的改变,小模型靠数量堆雾气态流体效果,大模型可以是复杂的有棱有角的3d模型(比如哈劳斯本人的模型当粒子射,这个是玩笑打比方)也可以是只有一个单面的就像界面系统大部分mesh来表现,但是一般情况,颗粒模型和部分瞬发型大模型的特效适合写实,而很多大型模型做的特效其实是适合魔幻和或仅适合二次元,因为大型模型和单张大图片mesh如果仅以固有材质随模型变化,受贴图的精细度影响会比较大,比如举个粒子,二次元的能量球,放在写实mod里是不是比较片面感颜色什么的比较违和。
所以大家做这类东西要学会总结有的时候就是做多了看感觉的东西,选择正确的研究对象,做什么特效,首先考虑你要用于特效的模型及贴图采用什么特征。而且不是我说场景物做特效好或者哪个系统好,就死命用这一个系统,不同系统对待不同的游戏环境和场合有不同的便利和优势,所以很多时候不要只满足一种系统对同一个功能的表达。


比如看看我这个早期龙珠mod动图演示上采用特效分别是什么分类,加速飞行时四周向中心表现速度感的线条是界面presentation系统做的,赛亚人这个是贝吉特有人可能不认识,身上的黄色爆气特效是带有顶点动画的场景物,至于打击出现的气体线条和被击飞产生的气流,是粒子效果particle system的burst操作。所以这就是三种不同的系统处理三种不同的特效,当然还有其他场合其他系统的用法。这是一个例子。

-----------------------------------------------------------------------上面前言有些长,一展开说容易停不住---------------------------------------------------------------------------------------------------------------
上面简单说说,接下来重点:
本贴我主要和你们讲一下如何利用场景物系统制作各种浮夸特效并模拟出粒子系统可模拟的特效和超越粒子系统能力范围的特效。以及顺带提一下界面系统做一些特效。


一、场景物制作粒子系统


1.关键op
首先我前言提到场景物模型具有粒子系统那些参数改变形成的效果均有相应代码可以模拟的特性,并且还可以模拟出粒子系统做不到的效果。所以对于场景物对标粒子系统能做和不能做的事件该采用哪些OP操作我一个个例举和解释相关用法给你们看看。
(1)让场景物像粒子系统一样可以运动的op:


1850  # (prop_instance_get_position, <position>, <scene_prop_id>),                #得到场景物物体坐标


1855  # (prop_instance_set_position, <scene_prop_id>, <position>, [dont_send_to_clients]),        #场景物瞬间设置到某坐标


1860  # (prop_instance_animate_to_position, <scene_prop_id>, position, <duration-in-1/100-seconds>),  #场景物<scene_prop_id>从当前自身位置按一定时间<duration-in-1/100-seconds>匀速运动到某坐标position


1861  # (prop_instance_stop_animating, <scene_prop_id>),     #对被op 1860进行运动的场景物强制停止运动。


以及各种含position的op,因为场景物体运动是通过改变参考位置pos进行平移旋转的改变得到一个新pos然后set或animate到新pos的设置,通过每次触发器的基础时间间隔或人为扩大的时间间隔不断执行触发器来实现运动。
基本格式就是--1850号op或各种get position 的op,然后通过各种position的move和rotate等变换坐标的op,然后set和animate到改变后的pos。



以上这些很常用,不多说了,场景物基础运动控制看我这个帖子 https://bbs.mountblade.com.cn/thread-2094109-1-1.html简单先看看,特别是我里面提到一个场景物运动辅助粒子系统运动的特例,让其他运动显示可控的物体帮助运动显示受限的粒子系统在位移显示时间上得到更自由的控制。
然后场景物对所谓粒子运动的重力模拟就是给position move z即向z轴向下的触发间隔时间内的位移量,震荡就是一定时间内随机坐标比如
position move/rotate x/y/z的平移/旋转量是一个随时间变换的随机数或者震荡有规律如简谐运动,就是特定两个坐标之间按一定时间往复均匀抽取一个中间坐标点给场景物设置位置。阻力就是你根据你自己对阻力理解的算法,将基础抛物线或直线运动的触发间隔时间内的恒定x/y/z位移分量减去一个理论值,使得形成非匀速运动。


应用场合:对于场景物采用运动来模拟特效,一般不用于粒子系统的布料运动特效,会卡而且效果并不如粒子系统,主要用于大型特效模型需要按照自己想法随心所欲控制显示和消失、材质变换、放缩时的起始和持续时间采用以及超出简单的平移旋转的复合运动及随控制时间多种规律变化运动轨迹这些情况。
其实上面说了add missle这箭矢发射模拟部分特效的问题,其实特效用的比较多的场合就是技能特效,而技能特效有的是表示状态比如身上笼罩什么怒气防护罩,有的则就是missle弹道的性质,我写实射箭开枪你们可以理解是个missle弹道发射行为,那是因为我相信科学要靠科技,但是如果你成为法师,从空中丢的弹道或陨石等物体,何尝不可以理解是一种特效呢,所以missle弹道发射和以运动打击为表现的特效物体,要联系在一起研究考虑,不能我前面丢个气团就是特效,丢个石头就是武器弹道,然后以这种先入为主的概念,特效就用粒子系统,弹道都用missle系统,和其他系统划分界限,要学会同时发现不同事物的共性和差异,这样我们才能结合各个系统的长处优势处理难题。比如以下我这个实例,虽然控制的是陨石,但是改写下控制个奇怪的光效气团模型也是可以的。
场景物运动控制模拟技能案例--混沌陨石(代码):https://bbs.mountblade.com.cn/thread-2096150-1-1.html  所以,有的特效运动事件模拟还要掌握该贴说的对碰撞体的检测类op。


(2)让场景物像粒子系统一样可以放缩的op:


(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代表的物体还是长宽高原来的两倍。  关于这个操作,我建议你们类比粒子系统和界面系统,粒子与界面系统和这个是骑砍少有的可放缩模型的操作。类比之后你们会更加知道这个op有没有更好的利用场合。

之前在我的这个帖子介绍过用法https://bbs.mountblade.com.cn/thread-2094107-1-1.html

不多说,反正看我上面自己的注释解释一些注意点。
应用场合:和运动op上面理由差不多,一般大量颗粒物的模型做的特效对控制粒子放缩的需求不大,或者说只是为了整体的流动感,而不是将物体明显放缩的形态特征作为此类特效的具体表现效果。


(3)材质贴图控制:
其实对于粒子系统的RPG和alpha随时间控制变化是不好操作的,但是场景物多了一个OP叫:
(prop_instance_set_material, <prop_instance_no>, <sub_mesh_no>, <string_register>),   #使得<prop_instance_no>场景物某个分部模型mesh或整体的材质变化到<string_register>这个字符串记录的东西作为名称的材质,然后用上这个材质对应的贴图。这个也是我后面要讲的2d动图系统的理论核心。这个应用场合呢,打比方有的人做热兵器mod,枪口火花采用的是四或六花瓣型的片面mesh整体显示这个特效而不用雾气,但是你粒子系统只能用一个模型形态导致你只能用这个粒子效果图片简单放缩淡显表示,如果用了我这个场景物材质动图变换系统,就可以把整个枪火花的序列图播放出来。而且很多枪战游戏这种开火特效都是采用序列图特效,所以序列图特效也是骑砍缺乏但是很多游戏都有的一种特效效果的表现形式,因为可以以整块模型代替布料颗粒的组合以动图的方式把一些火花雾气效果的流动感表现出来,然后还能比布料变换的更炫酷丰富改头换面。如果我给你们填补了这个空白,在特效制作上骑砍还有很大的发展潜力。

比如看这个动图演示,这个八神庵头上的是传奇的头衔特效,你看看你们对特效适用的场合有多广阔有没有理解,当你掌握的手段种类充分全面的时候,一类东西可以玩出很多花样。




(4)顶点动画控制op:


顶点动画控制的基础理论见我刚写的帖子https://bbs.mountblade.com.cn/thread-2096174-1-1.html 有更详细的理论和实例,先看看了解下基础。


主要op这里也再写一遍:


prop_instance_deform_to_time                = 2610  # (prop_instance_deform_to_time, <prop_instance_no>, <value>),
                                                    # value参数代表帧时刻,也就是prop_instance_no场景物id的场景物一次性设置到value这个帧时刻


prop_instance_deform_in_range               = 2611  # (prop_instance_deform_in_range, <prop_instance_no>, <start_frame>, <end_frame>, <duration-in-1/1000-seconds>),
                                                    # 强制场景物id<prop_instance_no>的场景物自起点帧时刻<start_frame>向终点帧时刻<end_frame>匀速变化,在<duration-in-1/1000-seconds>(单位千分之一秒)时间内完成一次动画,然后模型便停留在终点帧时刻<end_frame>的形态上。此外注意这里面控制动画变化区间的时候是可以取值到<end_frame>,不要去类比is between、try for range这些取不到终值的op,因为这个是行为操作而不是判断类操作。


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


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



prop_instance_get_current_deform_frame      = 2616  # (prop_instance_get_current_deform_frame, <destination>, <prop_instance_no>),
                                                    #获取<prop_instance_no>场景物操作播放顶点动画时,当前时点播放到的帧时刻<destination>。


所以场景物的顶点动画控制是粒子系统所不具备的能力,比如我七龙珠的人物爆气效果等等,你们可能觉得这种特效形式没有概念不可理解,我给你们讲个其他游戏的例子,魔兽争霸和半条命,魔兽争霸的特效有的时候就是和那些人物单位建筑一样采用的mdx动画模型,而半条命虽然大部分特效在其spr文件(这个spr和我们骑砍的场景物不是一个意思,类似我上面说的序列图文件),但是少数mod会采用和人物枪模一样的mdl动画文件模型来做特效,mdl其实是骨骼动画,所以说因为骑砍的骨骼动画变形能力有限,所以模拟动画特效的重任就落到场景物的顶点动画系统上了。
应用场合:这个主要二次元或对画面精细程度要求不高的老游戏用的比较多,就拿龙珠的爆气来说吧,简陋的老游戏用模型动画的方式模拟,虽然也像那么回事,但是总有一种特效模型有棱有角的多边形感觉,所以其实后来的游戏,比较符合现代游戏审美的,特效以这种粒子系统的布料粒子和序列图形成的动图效果这两种方式为主。所以说后面的龙珠游戏身上那些爆气效果,其实就是序列图把图像对准镜头位置笼罩在身体上播放动图。但是用场景物顶点动画做一些技能还是有用处的,特别是一些效果需要生活中某些实体的东西,比如我要打出一个有动画的降龙十八掌,飞出一条半透明的金光闪闪会神龙摆尾的龙,比如我这个暴力篮球足球网球台球的modhttps://bbs.mountblade.com.cn/thread-2069525-1-1.html就有涉及到这个效果,模仿功夫足球,打出的球带会动画的虚化老虎和金龙。

此外顶点动画也可以通过特殊的动画制作手段形成动态材质的流动感,比如我这个视频里https://www.bilibili.com/video/BV1ee4y1p7MR疾风剑豪亚索技能的演示,二技能疾风之墙,一个平板模型上面材质气体流动的效果不是序列图动图效果而是顶点动画的效果,因为表面看这个是平板模型,其实平板上顶点面比较多可以移动点线面的位置然后造成贴图材质的流动感。

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


-------------------------------------未完待续,后面发一些我的具体代码应用实例-----------------------------------------------------------------



















评分

参与人数 1第纳尔 +20 互助 +1 魅力 +20 收起 理由
Aomine Daiki + 20 + 1 + 20 文章不错,继续努力!

查看全部评分

0

主题

53

回帖

21

积分

随仆

Rank: 1

UID
3110714
第纳尔
454
精华
0
互助
1
荣誉
0
贡献
0
魅力
0
注册时间
2019-10-8
鲜花(6) 鸡蛋(0)
发表于 2023-1-10 11:06:13 | 显示全部楼层
头儿讲得都很明白呀,不过有些东西实在是太让人望而却步了,代码还好说,可以硬堆彻——模型,材质,动画....这些东西简直天坑啊

202

主题

984

回帖

986

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
2893127
第纳尔
14521
精华
0
互助
90
荣誉
18
贡献
325
魅力
775
注册时间
2017-11-5
鲜花(428) 鸡蛋(0)
 楼主| 发表于 2023-1-10 11:27:20 | 显示全部楼层
本帖最后由 vegetto 于 2023-1-10 11:29 编辑
传说的骑士 发表于 2023-1-10 11:06
头儿讲得都很明白呀,不过有些东西实在是太让人望而却步了,代码还好说,可以硬堆彻——模型,材质,动画.. ...

这种要我后面给一堆工具包和在线网站,真正的综合型mod技术并不一定是要求每个人都是代码模型动画从0可以制作的全才,而是基本素材的合法(或没有后续争议的风险)获取后,如何下载和利用到一堆软件进行加工和提高批处理效率。比如说我的动图系统,有些一套动图需要几百张图像,那我就准备了一堆软件和网站,首先是图片素材包的下载,其次是批量对图片进行分解、抠图、重命名、转换格式的傻瓜式软件,哪怕是几千张图片,我软件勾选填几个设置,直接几秒转换。
就像你绑骨准备tpose模型时可以到mixmao这个网站在线绑骨把模型通过tpose动作导出tpose模型,等等。
也就是要对你要实现的功能用到的素材,你要非常清晰要处理到什么程度才能利用,然后对各个处理的环节搜索需要的软件和在线处理网站。
当一个功能在素材上需要成千上万次枚举法处理时,这种基本可以淘汰不做。

也就是说那种直接伸手的做有些东西肯定会有瓶颈,因为完全不会就代表没法针对自己的需求二次处理;事事亲为的耗时又漫长,也难以达到门门精的程度,所以中间态是最好的,就像腾讯一样,不生产手机这种硬件,但是基本清楚大致是个什么原理,搞服务和软件,具有把现有的概念和素材深度加工的能力。
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-5-1 02:40 , Processed in 0.115408 second(s), 22 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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