骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
查看: 1785|回复: 6

[功能与代码] 打败引擎硬核---如何利用prop直接重做天空球并展现动态天空

[复制链接]

202

主题

984

回帖

986

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

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

前言:我的全体mod都是以txt为基础,所以局部变量都是采用var的写法pos什么不考虑复用slot都是数字序号,你们重在理解即可。且我只讲自己研究的部分,涉及前人的成果的其他办法请自行搜索查找,莫一代代陷入重复劳动和仿写的循环中。https://bbs.mountblade.com.cn/thread-2094114-1-1.html这个是我一系列骑砍战团模型程序研究成果的目录篇,用来汇集一些分散的我的技术贴,还没更新多少,将会持续更新一些你们不常见的冷门技术。(759523711我的魔兽争霸mod开发群可以加群学习,定时分享一些其他技术成果,来自我的一系列自制mod https://bbs.mountblade.com.cn/thread-2093251-1-1.html的研究)



程序部分内容只允许在2021年以后(含2021)发布的非子mod非使用20个以上他人osp的mod使用。
也就是你是2021年以前发布的mod,或者是人家成熟mod的子mod,或使用了其他人20个以上osp功能的非原创杂交mod,这3类mod不可以使用我的相关成果,包括后面其他成果分享也是这个要求。并且不可以通过改写优化的方式进行加工重新发布新贴osp以及改版后传播他人,目的就是希望你们原创并且有独立思考,避免所有人都学一套模板一家之言,mod内容越做越像越来越杂交。



以下正文:
天空球重新构造:
首先告知你们天空球初始话场景是可以定义它的光照色彩等等的,这个是你们可以搜索到的,我不讲自己翻。


我要和你们讲的是如何利用场景物体prop构造一个天空球,但不受到已有天空球的干扰。

这种做法的好处和意义:
理论上你可以做一个小的prop类型的天空球,比外界天空球小就可以被包住,但是实际上不同场景天空球范围不一定保持恒定,如果你小了,那到边界就看到天空球外的世界,如果大了就会和固有天空球相交,天空出现撕裂口,看着让人难受。
然后战团的天空球是球体,其实很多游戏天空球形式多种多样,有盒子状的所以叫天空盒(csgo就是典型),有圆柱体的,有半圆形状的,还有的的天空球会内部附带一些独立的星体和多个弧形的纸片模型围绕半空作为云彩贴图。


所以:


步骤1:如何去掉大地图的固有天空球最好不要删模型,引擎调用会出现红字。

看看上面这个图,从D:\...\MountBlade Warband\Textures类似路径找到大地图自带的天空球的贴图,一般是sky_开头的dds文件,像我这样把贴图通道全部涂黑,然后另存为 带alpha通道的dds(dxt1或dxt3,优先前者),然后丢入mod自己的texture文件夹(原理是绝大多数mod和本体含有相同的贴图,游戏默认最后加载游戏的,但是部分情况除外,如界面贴图和头模旗帜等等要小心),这时候,其实引擎自己调用贴图时会默认使用带通道的材质参数,打开游戏会发现天空球会消失,天上变成一望无际灰萌萌的外太空。

步骤2:准备一个天空球的prop 模型在scene_prop定义,比如下面我举例采用spr_nameksky(这个是我龙珠mod娜美克星的天空球模型)

(get_player_agent_no, ":var_0"),      #获取玩家agent为局部变量:var_0
(store_current_scene, ":var_1"),   #获取当前场景为局部变量:var_1
(set_fixed_point_multiplier, 1000),
(agent_get_position, pos1, ":var_0"),    #设玩家坐标pos1
(get_scene_boundaries, pos2, pos3),     #获取场景的边界对角线两个点坐标 pos2,pos3(场景范围你可以抽象看成一个正方形网格,其实你打开brf看模型有个方形网格就联想到了,这个就是获取方形网格对角线两个坐标点,这样整个场景范围就知道了)
(position_get_x, ":var_2", pos2),
(position_get_y, ":var_3", pos2),
(position_get_x, ":var_4", pos3),
(position_get_y, ":var_5", pos3),
(store_add, ":var_6", ":var_2", ":var_4"),
(store_add, ":var_7", ":var_3", ":var_5"),
(store_div, ":var_8", ":var_6", 2),       # 类似c=(a+b)/2求中位数,意思就是两个坐标的横坐标之和一半为其中点的横坐标,同理纵坐标
(store_div, ":var_9", ":var_7", 2),      # 同上,当然我写东西习惯比较随意,你也可以按val_div写
(position_set_x, pos4, ":var_8"),
(position_set_y, pos4, ":var_9"),
(position_set_z, pos4, 0),               #此时pos4的坐标基本为场景范围正中间位置
(position_copy_rotation, pos4, pos1),    #目的是为了保持pos4角度为竖直,因为pos1为玩家agentpos角度始终竖直的,当然你也可以初始一下,写的原因就是如果用set xyz方式构造一个新pos,不定义角度,容易被其他触发器的pos污染(虽然概率不高),这样下面把prop set 这个pos上就可能东倒西歪放上去。
(scene_prop_get_num_instances, ":var_10", "spr_nameksky"),   #判断spr_nameksky这个天空球场景物有几个
(try_begin),
    (eq, ":var_10", 0),  
    (set_spawn_position, pos4),
    (spawn_scene_prop, "spr_nameksky"),   #以上意思就是spr_nameksky数量为0就在场景正中间位置的点pos4刷一个出来,
    (scene_prop_set_slot, reg0, 200, -5),     #这个是特用我魔兽争霸mod的东西,我的slot200是给场景物分类的,方便try for props集体定义,像-5就是给所有天空球的。
    (prop_instance_set_scale, reg0, 2000, 2000, 2000),    #这个op是放大场景物的大小,本功能主要是作为调控手段,假如是一些天空球做小了,就放大两倍,这个op的用法具体解释放到下面题外引申里写。
(else_try),
    (eq, ":var_10", 1),
    (scene_prop_get_instance, ":var_11", "spr_nameksky", 0),
    (prop_instance_get_position, pos5, ":var_11"),
    (position_rotate_z, pos5, 1),
    (prop_instance_set_position, ":var_11", pos5),     #以上意思就是天空球场景物spr_nameksky数量为1就在场景范围正中间的位置点pos4设置位置,然后按每次触发间隔按照天空球场景物自己的pos为旋转中心旋转1度来旋转。
(try_end),


以上是基本做法,天空球模型的参考大小我后面把模型放一下,给你们参考下多大的天空球可以最大化契合场景。

引申用法,你可以对天空球根据不同场景用变量提前存天空球的spr名称,然后针对性刷不同风格的天空球,椭圆的方形的都可以,然后可以把我上面刚刚说的,加一点云彩弧形纸片贴图,围绕场景中心转转,或者对prop实时设置贴图,因为prop是可以实时设置贴图的,这些种种都可以达到另一种制作动态天空的方法。
不过你们还是要配合对场景光照的初始设置op,因为场景光和天空球的风格都会对场景内武器装甲什么的反光能力产生影响,自己慢慢调。


引申推论:
模型在进入类似天空球这种内部有彩色贴图外部背向面没用模型和贴图的,会对光照产生过滤削弱等影响,比如天空球我那个是绿的,可能会导致场景内比如树木这种绿色植物若隐若现;我上面天空球是设置旋转的,假如我把旋转速度加倍,场景内光照就会变弱。


相关冷门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有没有更好的利用场合。


提出一个启发各位思考的问题:
上面我让天空球消失的方法是贴图改为全透明通道的贴图。你们可以考虑一下,如何让ITEM,agent,prop,界面的mesh这些在游戏里具体视觉外形的东西消失,你们能想到几种不同角度的方法。后面我给你们总结,不过我希望我表达并不是想说具体的功能,而是考虑问题的多种角度



评分

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

查看全部评分

57

主题

954

回帖

543

积分

子爵[版主]

Rank: 7Rank: 7Rank: 7

UID
81513
第纳尔
5138
精华
1
互助
18
荣誉
5
贡献
100
魅力
123
注册时间
2008-6-26
QQ
鲜花(103) 鸡蛋(0)
发表于 2022-10-18 16:39:26 | 显示全部楼层
老彼得来点粒子系统的介绍呀~如何做出好看的又不怎么卡机器的粒子

171

主题

494

回帖

420

积分

骑士

Rank: 4Rank: 4

UID
262280
第纳尔
2293
精华
0
互助
18
荣誉
13
贡献
0
魅力
18
注册时间
2010-6-4

汉匈决战正版勋章霸主正版勋章

鲜花(81) 鸡蛋(1)
发表于 2022-10-27 12:39:56 | 显示全部楼层
    能否做成傻仅安装包?绝大多数气油都不懂啊

29

主题

187

回帖

65

积分

扈从

Rank: 2Rank: 2

UID
3228783
第纳尔
868
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2021-3-28
鲜花(7) 鸡蛋(0)
发表于 2022-10-27 14:24:32 来自手机 | 显示全部楼层
stevenxxy007 发表于 2022-10-18 16:39
老彼得来点粒子系统的介绍呀~如何做出好看的又不怎么卡机器的粒子

用自发光贴图可以作出炫酷的效果,而且基本不耗内存来自: Android客户端

29

主题

187

回帖

65

积分

扈从

Rank: 2Rank: 2

UID
3228783
第纳尔
868
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2021-3-28
鲜花(7) 鸡蛋(0)
发表于 2022-10-27 14:26:29 来自手机 | 显示全部楼层
楼下只用txt编程吗,不考虑深入一点?来自: Android客户端

51

主题

287

回帖

101

积分

见习骑士

Rank: 3

UID
2880114
第纳尔
1576
精华
0
互助
0
荣誉
0
贡献
0
魅力
3
注册时间
2017-9-30
QQ
鲜花(12) 鸡蛋(0)
发表于 2022-10-27 17:53:00 | 显示全部楼层
stevenxxy007 发表于 2022-10-18 16:39
老彼得来点粒子系统的介绍呀~如何做出好看的又不怎么卡机器的粒子

我设想的一种魔法弹效果不知道好实现吗:
1.发射火球,火球没有人体阻力,可以穿透人体,所以可以实现群攻效果,尤其是两三个敌人并排在一起的时候
2.火球是直线发射,不是抛物线,但会随着距离逐渐消耗能量,有拖尾效果,在十几米距离后消退,所以攻击范围是中远距离
3.火球绑有灯光,火球经过人或物品会被小范围照亮,在夜晚视距效果非常炫酷

0

主题

53

回帖

21

积分

随仆

Rank: 1

UID
3110714
第纳尔
454
精华
0
互助
1
荣誉
0
贡献
0
魅力
0
注册时间
2019-10-8
鲜花(6) 鸡蛋(0)
发表于 2022-11-4 21:21:51 | 显示全部楼层
哈哈,消失,在玩家视角看不到那不就是消失了吗,给它移到地图外面去
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-5-27 20:43 , Processed in 0.122374 second(s), 29 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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