openttd吧 关注:3,007贴子:10,776
  • 18回复贴,共1

【讨论】NewGRF制作技术

只看楼主收藏回复

RT


IP属地:加拿大1楼2024-03-24 09:22回复
    汉语OpenTTD社区当中的GRF作者相较之下很少,开本帖的目的也是希望各位可以在一起合理交流相应的技术
    如果你有好的主意也请共享出来。
    可以讨论图像技术,如32/8bpp、EZ与非EZ、3d渲染与2d直接绘制,与编程技术(主要为NML语言)


    IP属地:加拿大2楼2024-03-24 09:28
    回复
      lz太监了?


      IP属地:广东来自Android客户端3楼2024-03-24 15:58
      收起回复
        大致说一下,nml语言是一种C风格语言,然后里面一堆常量,常量都有对应的整数值(这才是最重要的)nml通过nmlc编译器编译成grf文件,可以也可以不包含图像。我们有个简单的记忆方法,nml是你ni ma le,自然nmlc就是……总而言之,nml相对简单。当然近几年也有新的语言出现,比如grf-py和yagl。grf-py顾名思义是使用python来编写grf,而yagl则相对不稳,但可以用来反编译grf,相较于nfo可读性大大提升


        IP属地:加拿大来自Android客户端5楼2024-03-25 01:03
        收起回复
          大多数玩家所经常使用的grf可以分成两类,一种是添加实际可游玩内容的,比如车包、铁路包、车站包、蒸肉包,与没有添加这些内容,但是有起到一定作用的,比如NML CAT、disabler,和basecost。(baseset grf不在讨论范围内)没有添加这些内容的grf另说,添加实际可游玩内容的grf的核心就是item块。
          一个item可以定义机场、运河、车辆、铁路机车与车厢、飞机、MARINECRAFT、房屋、建筑等诸多内容,在jgrpp版中还可以用来定义地形。而item当中主要分成两块,properties和callbacks。properties是这个item的属性,一旦定义就无法再动态变更,比如火车的介绍日期、站点的可用年月;callbacks则可以动态变更,并且可以做到动态变更。callbacks作用广泛,如定义火车所使用的图像、变更车厢的速度、给站台外观创建索引,都使用了callbacks。
          properties就是你家,而callbacks就是你家的人。人可以走掉,但是房子跑不掉。


          IP属地:加拿大6楼2024-03-25 16:45
          收起回复
            楼上讲了,callbacks可以动态变更。变更的方法是使用switch。每个switch都可以使用对应feature的变量与通用变量。通用变量有如日期时间,对应feature变量有如火车的“当前装载货物”、汽车的“当前道路类型”和站台使用的“周边格子类型”。
            switch可以嵌套引用,因此可以用switch做出类似if-else的结构,如
            switch(FEAT_XXXXXXX, switch_something, 我是判断式) {
            1: switch_something_2; // 这里是另外一个switch
            我是关键字: switch_something_3; // 同上
            0x1145 + 1: return 0; // 这里直接返回
            default: return 6; // 默认case,直接返回
            }
            当然,判断式里面是可以塞更多变量的,可以不仅仅塞一个变量,可以塞一个数组、又或者干脆就是数字。当然也可以对变量进行运算。这是road hog的nml代码片段:
            switch (FEAT_ROADVEHS, SELF, jinglepot_open_switch_graphics_percent_loaded_23,cargo_count*100/cargo_capacity) {
            0..24: return jinglepot_open_sg_empty_23;
            25..90: return jinglepot_open_sg_loading_23;
            return jinglepot_open_sg_loaded_23;}
            可以看到,这里使用了两个变量来计算货物已经装载的百分比,如果在某区间内就使用不同的图像。这样明显更符合直觉。


            IP属地:加拿大7楼2024-03-26 14:37
            回复
              不懂帮顶


              IP属地:吉林来自Android客户端8楼2024-03-26 23:59
              回复
                支持✊


                IP属地:四川来自Android客户端9楼2024-03-28 20:33
                回复
                  俺有一段时间没发了,续上
                  可能有朋友已经知道了,目前的中国包火车和中国包站台都是使用体素模型制作的。一般而言,制作高清图像需要模型渲染,除非作者能力很强大直接上手画4x图像还一次性画八面甚至是24+2面然后能把所有的都还保证正确但是这样的作者在现实当中肯定是不存在的当然你愿意自己尝试可以试一下但是我不保证这样尝试的后果结果请自负。制作模型是一个相对复杂的活,也就意味着门槛比较高。考虑到中国包缺少人手,并且车型繁多,我们决定使用体素模型+定制渲染器来制作中国包的图像。
                  模型方面,在确定比例尺和调色盘之后,就可以开始制作了。渲染器方面,中国包使用了由mattkimber开发的gorender,其具有一些专门为openttd开发的功能,并且配置简易。
                  利用3d模型来渲染,好处明显。最明显的就是可以一次性渲染出无限个视角的图像。传统上每幅图像都需要人手绘制,虽然直观,但是耗费时间。而体素建模甚至可以使用现有的模型资源(在遵守许可证的前提下)并且不需要自己进行3d->2d的转换,直接对着车辆侧视图抄就行。相应地,细节也更好处理。使用了体素建模的timberwolf车包一节车甚至有26幅图像,而利用传统方法绘制这些2x图像费时费力,足以看出体素之优势。
                  (还有zephyris的pixeltools)


                  IP属地:加拿大10楼2024-04-07 02:32
                  回复
                    不过在我个人看来中国包和站台包的精度都有些太低了……


                    IP属地:加拿大11楼2024-04-07 02:34
                    收起回复