异星工厂吧 关注:60,752贴子:388,151
  • 5回复贴,共1

周五工厂报#437——深潜货舱

只看楼主收藏回复

投稿者 Hrusa 于 2024-11-15

你好呀,
本周,我们将深入探讨货舱的工作原理及其无缝飞行动画。大多数玩扩展包的人可能已经在游戏中见过它们。积极的反应让我们非常高兴。

上升到 Nauvis 上方轨道上的平台
--------------------
视觉设计
从一组爪子释放货舱,这个概念的初稿来自 Earendel。你可以看到,它的本质在整个开发过程中一直相对保持不变。在第一个版本中,玩家需要将胶囊物品放入火箭中才能旅行。这个特性已经废弃了,因为它是毫无意义的忙碌工作。然而,该物品是机甲盔甲的成分之一,因此在视觉上具有相似性。根据草稿,Jerzy 建模了爪式火箭和货舱的 3D 版本。
然后,该分支长时间处于休眠状态,直到核心游戏编码完成,我们终于恢复了对不太重要的功能(例如花哨的飞行动画)的工作。我请来了 Jaroslaw 的帮助,他刚刚完成了枢纽、着陆平台和着陆舱口的建模工作。再加上他的建模和体积云模拟,以及我的编码和着色器工作以及 Ian 的音频,我们为主要版本打磨了一切。

Earendel 绘制的货舱和火箭分离的原画
--------------------
货舱将走向何方?
在开始任何图形工作之前,有必要先开发一个骨架,说明物品如何从一个表面移动到另一个表面。在那个时候,物流请求运行良好,但只是立即传送了物品。
从火箭中汲取灵感,它有库存并且可以携带物品,我决定将 CargoPod (货舱)打造成新实体。虽然火箭会负责从发射井中飞出,但它会坠落在原来的表面上,货舱将具有前往另一个表面的功能。
等式的第二个(也是更棘手的)部分是目的地。即使在 “原版的?”/“stracciatella?”(翻译不能) 太空时代中:货舱从发射井移动到平台枢纽,从枢纽到着陆台。其中两个可能会进一步扩展为增加更多舱口的货舱,但本身并不是目的地。
--------------------
到站点去!
解决方案是引入站点,这是一个抽象层,其中轨道物流中涉及的所有建筑物都注册了它们的阵营并获得一个唯一的 ID。货舱上的任何舱口都与现有站点相连。
然后,要将物品寻址到另一个表面,我们只需要:表面、阵营、站点和舱口。根据使用情况,其中一些是可选的。发射太空平台起始包的火箭不需要任何目的地。旅行玩家可以发射到向行星,并且只能解决目标是顶点的地面还是着陆点。物流订单将事先知道其要送至的站点。
具有通用逻辑的好处是,从技术上讲,货物可以在游戏中的任意两个表面之间移动,并且可以在任意数量的站点之间移动。甚至在原版游戏中这个逻辑也很有用,火箭发射井可以把白瓶瞄准自己的着陆点时,这个功能开箱即用。我不想通过将所有内容硬编码为行星和平台来限制潜力。

我试图将站点概念更进一步,并将发射井、枢纽和着陆点的 GUI 合二为一时所做的笔记。不过,需求最终差异太大。
--------------------
组装过场动画之谜
就像站点系统一样,我也不想对动画进行硬编码。自定义行星将是首先要修改的东西之一,所以我的首要任务是允许尽可能多的自定义。
飞行动画的每一个细节都由完全可模组定义的行进(procession)系统提供。每个太空位置都为行星本身和轨道上的任何太空平台提供自己的一组出发和到达动画。
例如,当一个货舱被指示从祝融星周围的平台飞到祝融星表面时,它将采用风格匹配的 “vulcanus-platform-departure” 和 “vulcanus-planet-arrival” 动画将它们拼接在一起。有时,货舱必须在运输途中等待舱门打开。在这些情况下,可以在两者之间插入 “vulcanus-style-intermezzo” 循环动画以打发时间。
--------------------
组件拼接
进一步放大,每次行进都有一个由可变数量的图层组成的时间线。这些图层控制动画或绘制图形的各个方面。它们的许多方面由 1D、2D 和 4D 贝塞尔曲线及其归一化变体驱动。

在异星工厂样条编辑器中打开行星着陆曲线
为了方便模组制作者,我在网上发布了我的自定义异星工厂样条编辑器。没有它,要得到正确的形状是相当困难的。而且它还以所需的格式直接导出曲线。

从轨道上的平台下降到 Nauvis

从平台向下飞到表面的简化时间线,高亮了每个行进图层活动以构成最终外观的时间
--------------------
云技术
现在,允许动画无缝显示的是覆盖层。在某些时候,需要遮盖整个屏幕,以保持货舱从一个表面传送到另一个表面时的错觉。只需在屏幕上滑动平面图像就可以了。事实上,Albert 喜欢更风格化的美学。
我的观点是,我们只需很少的工作就可以获得非常令人印象深刻的动画边缘。我所做的只是让 Jaroslaw 为云生成深度纹理。当边缘淡化时,它不会乘以平坦值,而是在一定深度处切断云。这样,它们就会成团地出现在屏幕上并自然流出,而不是形成一堵厚厚的墙。

手动演示覆盖图层的软蒙版着色器。
模组冲突
虽然所有这些功能听起来已经非常强大,但当我开始制作太空时代的最终过场动画时,我很确定,模组无法像这样和谐共处。如果动画的每个方面都存在于这些时间线内,那么任何新的货舱、行星或空间站都将不得不做大量工作才能将自己整合到所有现有的行进系统中,从而创建无数的复制品,这些复制品仅仅有几个精灵不同而已。
值得庆幸的是,我们还有一个技巧。在当前版本中,行星实际上都使用相同的飞行动画原型。我们引入适当变体的方式是使用目录(catalogue)。目录基本上是行进动画可以引用的图像或声音列表。该流程将引用 CatalogueID 并指定查找位置,而不是预定义的资产。
- 可以从太空位置点目录中获取当地的云或雾是什么样的。
- 货舱目录可以提供特殊的动画,例如打开太阳能电池板,甚至是叠加层的纹理,例如再入火焰和推进器声音。
- 舱口目录可以提供图形,以便在吊舱推进器靠近时进行照明。
任何丢失的图形或声音都将被跳过。新行星至少会播放一些动画,即使模组作者忘记定义云。新货舱可以提供自己的火焰精灵,这些精灵仍然可以在正确的时间播放。新的货舱或枢纽可以说它们的照明看起来不同,而不会触及任何行进数据。
如果你想整点怪浪怪浪的东西,你可以给你的星球提供一个全新的时间线,但仍然可以使用默认太空时代 CatalogueID 中的货舱动画和行星精灵。举个简单的例子,可以将降落伞精灵添加到吊舱目录中,并且飞行速度会显着减慢。任何添加新的货舱类型的第三方模组都可以选择通过定义降落伞图形来支持你的星球,而不需要其他任何内容。


IP属地:浙江1楼2024-11-17 14:59回复


    IP属地:浙江来自Android客户端2楼2024-11-17 16:39
    回复
      精灵?


      IP属地:河北来自Android客户端3楼2024-11-17 17:11
      收起回复
        个人认为vanilla 和 那个S开头的单词是借用冰淇淋口味来表达,虽然我没查到用那个S开头的词表示更厉害或者更独特的典故


        IP属地:吉林来自Android客户端4楼2024-11-22 18:35
        回复