骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买霸主CDKEY 购买战帆CDKEY
查看: 202|回复: 2

[经验与教程] 花糕滴小知识——module_data之flora篇

[复制链接]

21

主题

722

回帖

388

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2460
精华
0
互助
33
荣誉
0
贡献
0
魅力
85
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(68) 鸡蛋(0)
发表于 前天 14:05 | 显示全部楼层 |阅读模式
本帖最后由 huagao 于 2026-1-30 14:30 编辑

   前段时间有群U提了一嘴,当时看了一下flora发现了几个有意思的东西,再加上这个确实十分冷门,大部分人对于这玩意的印象还是“去树补丁”,今天闲来无事细看了一下和大伙说一下。

   先讲一下一般大伙下了ms之后会发现里面还有一个Module_data文件夹,其中:
     1,植被:Flora_kinds.py是植被的相关定义(虽然石头也在里面。。)。
     2,地形:Ground_specs.py这个是地形的一些定义;ground_spec_codes.h这个不用管,这个是给C++引擎解释这11个地形类别的,地形和别的不一样,是不能新增的。
     3,天空盒:Skyboxes.py里面是几个skybox的参数定义。
   根据需求修改参数后,运行对应的python文件会生成对应的txt,丢到你的mod路径的Data里面。
   
   本贴先拿flora开刀,整个文件的大概结构如下
   一,位运算的常量定义
   二,flag,主要就对应生长地形的标识符和一些渲染上的标识符
   三,各个植被的list,草,树,石头等等
   四,几个函数,位运算存储flag和密度的,输出对应文件的,辅助计算幂次方的(天知道为啥要自己写)

   我通过代码顺序,尽量简单易懂地讲一下重点的东西

   首先就是基础的存储定义
  1. #定义了一个二进制的掩码,高位为1(这个最高位有点问题,实际编译后不会带进去)
  2. dword      = 0x8000000000000000
  3. dword_mask = 0xffffffffffffffff

  4. #分隔位,即前半部分的掩码用来存储密度参数(后半部分是用来存储其他flag)
  5. density_bits      = 32
  6. fkf_density_mask  = 0xFFFF #16K
复制代码

   植被的flag分为三个部分:密度参数,植被生长的地形,植被种类特征
  1. #地形
  2. fkf_plain             = 0x00000004
  3. fkf_steppe            = 0x00000008
  4. fkf_snow              = 0x00000010
  5. fkf_desert            = 0x00000020
  6. fkf_plain_forest      = 0x00000400
  7. fkf_steppe_forest     = 0x00000800
  8. fkf_snow_forest       = 0x00001000
  9. fkf_desert_forest     = 0x00002000
  10. fkf_terrain_mask      = 0x0000ffff #掩码,也是全组合

  11. #种类特征(源码提供有注释对应的功能)
  12. fkf_realtime_ligting  = 0x00010000 #deprecated
  13. fkf_point_up          = 0x00020000 #uses auto-generated point-up(quad) geometry for the flora kind
  14. fkf_align_with_ground = 0x00040000 #align the flora object with the ground normal
  15. fkf_grass             = 0x00080000 #is grass
  16. fkf_on_green_ground   = 0x00100000 #populate this flora on green ground
  17. fkf_rock              = 0x00200000 #is rock
  18. fkf_tree              = 0x00400000 #is tree -> note that if you set this parameter, you should pass additional alternative tree definitions
  19. fkf_snowy             = 0x00800000
  20. fkf_guarantee         = 0x01000000

  21. fkf_speedtree         = 0x02000000  #NOT FUNCTIONAL: we have removed speedtree support on M&B Warband

  22. fkf_has_colony_props  = 0x04000000  # if fkf_has_colony_props -> then you can define colony_radius and colony_treshold of the flora kind
  23. #密度参数在flag中以density(X)的形式或进去,X即为你自己定的密度
复制代码
   这些其他flag是或到存储的后32位里面的。

   这里举个栗子:"grass",fkf_grass|fkf_on_green_ground|fkf_guarantee|fkf_align_with_ground|fkf_point_up|fkf_plain|fkf_plain_forest|density(1500),

   fkf_grass                    = 0x00080000
   fkf_on_green_ground  = 0x00100000
   fkf_guarantee             = 0x01000000
   fkf_align_with_ground = 0x00040000
   fkf_point_up               = 0x00020000
   fkf_plain                     = 0x00000004
   fkf_plain_forest           = 0x00000400
   组合后0x011e0404

   密度参数1500,即为0x5dc。所以高低位结合即为0x5dc011e0404,对应即txt中grass 6442469688324。       这里提一下flag的64位里最高位的1是默认不取的,自己手改txt的话注意一下。

   对应的txt里面的格式就和其他ms模块大同小异了,文件结构:
   所有植被总数
   植被1命名 flag 植被模型数量
   植被1模型1 碰撞
   植被1模型2 碰撞
   植被2命名 flag 植被模型数量
   ... ...

   这里提一下,注释说明了一个战团已弃用的编译逻辑,如果是树木等,在txt对应的子模型里还需要另起一行,替代模型等,但感觉没啥用,可能是以前给lod用的,没见过那个树的参数填了这个。
   还有就是fkf_has_colony_props这个标签也是txt里面需要另起一行填对应的俩参数的,但是也没见战团用这玩意。


   还有一个就是其实有一个上古时代用的fauna_codes,可以理解为各个植被的索引,现在应该是用不到了,生成的话自己加


自己把函数调用一下,虽然生成了也没什么用

自己把函数调用一下,虽然生成了也没什么用

鲜花鸡蛋

偃靖  在前天 14:49  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
解解解解解解解解解解解解解解解解解解

23

主题

180

回帖

196

积分

贵族[MOD作者]

Rank: 7Rank: 7Rank: 7

UID
3048044
第纳尔
2234
精华
0
互助
21
荣誉
3
贡献
20
魅力
516
注册时间
2018-12-15
鲜花(47) 鸡蛋(0)
发表于 前天 14:43 | 显示全部楼层
skybox的参数在ms里也有个用途,就是用来当环境光数据的参考
比如默认的night
skybox_night_2 536870962 152.000000 38.000000 0.000000 pfx_night
0.066667 0.082353 0.105882  0.000000 0.000000 0.000000  0.017647 0.017647 0.052941  500.000000 4279574581
我mod中在mt切成夜晚的场地时渲染效果就参照这个写成:
          (set_fixed_point_multiplier, 1000),
          (set_fog_distance, 400,0x010101),##参考了500.000000 4279574581(FF152035)
          (set_startup_sun_light, 150, 120, 105),#参考了152.000000 38.000000 0.000000
          (set_startup_ambient_light, 60, 80, 135),##参考了0.066667 0.082353 0.105882
          (set_startup_ground_ambient_light, 60, 80, 135),

鲜花鸡蛋

偃靖  在前天 14:49  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下

21

主题

722

回帖

388

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2460
精华
0
互助
33
荣誉
0
贡献
0
魅力
85
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(68) 鸡蛋(0)
 楼主| 发表于 前天 14:53 | 显示全部楼层
本帖最后由 huagao 于 2026-1-30 14:54 编辑
路过的宇宙人 发表于 2026-1-30 14:43
skybox的参数在ms里也有个用途,就是用来当环境光数据的参考
比如默认的night
skybox_night_2 536870962 152 ...

我翻了一下之前的笔记,月夜我自己的修改是把
(0.9*5.0/255, 0.9*5.0/255, 0.9*15.0/255),    # 环境光
改成了(1.2*5.0/255, 0.9*5.0/255, 0.9*15.0/255),
天空盒参数试错太麻烦就懒得搞了
解解解解解解解解解解解解解解解解解解
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2026-2-1 22:46 , Processed in 0.089130 second(s), 21 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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