是用管道,还是不用管道——这是个问题 借助XML的强大功能,你可以告别那些占满空间的管道线条。有了【管道理论】(Pipe Theory™),所有管道连接都能简化为长度和过渡;在编辑器中任意位置、任意旋转放置的任意两个组件,都能用两根经过巧妙变形的管道连接起来,而且最棒的是,这完全是系统性的。 本指南将概述构建你自己的【管道理论】(Pipe Theory™)“杰作”的背景和流程。 XML背景与基础 这部分内容会重复你在其他无数XML指南中能找到的信息。操作步骤: 1. 确定你想要编辑的部件。 2. 将该部件放置在你的载具上,然后在其旁边放置一个普通方块。 3. 使用选择网格,选中该部件和方块,进行剪切,然后另存为载具。 4. 导航至AppData\Roaming\Stormworks\data\vehicles,找到并打开仅包含该部件和方块的新“载具”的XML保存文件。 5. 在XML中找到与该部件相关的部分,通常由引号中的部件名称标识。 6. 找到变换数据,在XML格式中其表现为r="1,0,0,0,1,0,0,0,1"。如果该部件似乎没有自己的变换数据,请返回游戏编辑器,向任意方向旋转该部件,再次保存该部件和方块,然后重新打开XML文件。若两根管道的旋转角度和位置满足以下基本条件,则它们之间的连接将被视为有效: 1. 两个连接面的向量对齐,且方向相反 2. 管道相互相邻放置 3. 管道位于同一子网格(这一点对本指南来说并不重要,但为了内容完整仍列出) “连接面的向量”始终是局部坐标轴向量之一,不过有时方向会相反。为节省文件大小,存在一种默认的零件朝向,这种朝向在存档中无需包含变换数据。 编辑变换数据。我们稍后会详细讨论这一点。 保存XML文件。 在游戏编辑器中,加载包含窗口和带有选择网格的方块的载具,然后将其粘贴到你的载具上。 使用该方块将零件合并到正确的子网格。有时在编辑变换数据后,零件本身仍可直接合并,但添加一个方块作为备份是个好办法(尤其是对于窗口而言)。 变换数据是什么意思?在3D几何中,尤其是在计算机图形学和编程领域,变换是一种以数值的3x3矩阵形式表示空间朝向的方式。别担心“矩阵”,这只是个听起来唬人的词而已。 方向正切——用向量表示方向 当你想在空间中表示一个方向时,本质上是要重新定义该方向下x、y、z轴的含义。例如,安装在载具上的雷达会返回目标在其视野中的x、y、z坐标。雷达本身并不知道载具的位置,只知道目标的本地x、y、z坐标(如果雷达正朝上,正上方的目标在雷达看来就像是正前方)。如果我们想知道目标的实际地图X、Y、Z坐标,就需要在雷达测量的局部空间和雷达载具所处的全局空间之间进行转换。这就是向量发挥作用的地方。 从局部空间到全局空间的转换很简单:雷达载具的每个局部轴都被定义为相对于其周围全局空间的向量。你可以将其直观地想象成三个箭头,分别指向雷达局部X轴、Y轴和Z轴的方向。如果我们已知目标在雷达视野中的本地坐标,就可以通过将X向量乘以目标坐标的X分量、Y向量乘以Y分量、Z向量乘以Z分量,然后将结果相加,从而将这些坐标“扩展”到全局空间,得到目标的全局位置。 存储这三个向量信息的最简单方法是将它们的分量放入一个3x3矩阵中。列优先和行优先之间的区别超出了本指南的范围,但某些编程语言和图形库更倾向于使用其中一种。 回到XML,当你在游戏内编辑器中放置一个部件时,你可以随意旋转它(也可以镜像,但不用担心这一点;游戏有单独的方式来表示镜像)。载具的XML保存文件需要一种方式来表示其朝向,这就是r="1,0,0,0,1,0,0,0,1"的作用。 变换矩阵可以分解为三个不同的分量: r="1,0,0,0,1,0,0,0,1" X向量:r="1,0,0, Y向量: 0,1,0, Z向量: 0,0,1" 这三个向量是根据编辑器的全局x、y、z轴来定义的。可以看到,x向量的x分量为1,y和z分量为0。同样,y和z向量也只在全局y轴和z轴上有长度,这意味着变换矩阵r="1,0,0,0,1,0,0,0,1"可以被视为“默认”朝向,即每个轴都指向各自的全局方向。如果你放置了一个部件,然后将其顺时针旋转90度并打开其XML文件,你会看到r="0,0,-1,0,1,0,1,0,0"。X向量:r="0,0,-1,";Y向量:0,1,0,;Z向量:1,0,0"。这里,顺时针旋转90度后的X向量现在指向-Z方向,如向量Z分量位置的-1所示。同样,Z向量现在指向+X方向,如向量X分量位置的1所示。由于旋转是围绕Y轴进行的,Y向量保持不变。这种变换设计初衷是每个向量只能取1或0,且每个向量只有一个1。不过幸运的是,开发者决定不添加确保这一情况的检查。通过改变此变换中定义的x、y和z轴方向,可以实现各种拉伸和扭曲组合。这是充分利用管道理论需要理解的核心概念。 管道连接(根据游戏引擎) 为避免向量和组件之间的混淆,所有后续提及的局部x、y和z向量将使用字母i、j和k代替。 变换不仅仅用于视觉上旋转和变换零件的网格。某些零件(主要是管道)需要使其端部朝向正确的方向,以便与相邻管道连接。由于管道的每个连接面都位于面的中心,因此我们可以将它们与部件的局部坐标轴相关联,而非其表面。例如,基本角管在局部-x方向和局部+y方向各有一个连接面,分别对应左方和上方。如果在编辑器中放置管道时不进行任何旋转,保持变换为r="1,0,0,0,1,0,0,0,1",你就能看到这些连接的局部定义方向。

例如,在基础弯管部件上,其中一个连接面指向+y方向,使其矢量等于局部y矢量j。而另一个连接面则指向-x方向,如左图所示。这会使其矢量等于局部x矢量i,但方向相反(可用-1*i表示,或更简单地记为-i)。

在管道上,两个相连的面可能会共享相同的局部轴向量,例如直管段。其中一个面的向量为i,另一个面的向量则为-i。

最后,这张图片展示了两个管道部件之间的连接。你会注意到弯角部件已被旋转,使其“顶部”(j)连接面与直管道部件相连。这是为了强调这些轴(红、绿、蓝线)是部件的局部轴,是相对于编辑器的全局轴定义的,而非编辑器自身的全局轴。 从这一切中可以得出一个重要结论: 管道连接只关注连接面的连接向量以及相应的局部轴向量。其他两个局部轴对连接完全没有影响。 让我们试试看能做到什么程度。

这里你可以看到一个弯管和一个直管,和以前一样,只是现在弯管歪得不成样子,直管旋转了45度。乍一看,你不会认为两个尺寸差异如此之大的管道能够连接并传输流体或动力,尤其是考虑到它们之间明显的间隙和被剔除的纹理。然而,由于两个连接面的向量排列整齐,朝向相反且方向相反,这种尖端对尖端的连接是完全有效的。

在我还没完全弄明白规则的时候,我尝试对管道进行XML编辑,想把它们拉伸成不同的长度。不出所料,如果管道体素还是保持默认长度为1时的放置方式,它们就无法连接了。不过,当管道的端面能够首尾相接,并且在连接轴向上两段管道的长度相同时,它们就能成功连接。起初我以为连接规则仅仅基于管道表面纹理的对齐,但如前所述,事实并非如此;我们需要修改规则,将长度大于1的情况也包含进去。两个连接面的向量方向一致,其中一个指向相反方向 向量长度相同 向量尖端对尖端相接,假设长度为1的向量延伸至面外半个方块的距离 管道位于同一子网格(目前仍不重要)

然而,现在这个列表有点长了。如果能用一个总体规则来概括这些要点,并且这个规则的结果就是我们所看到的现象,那就再好不过了。 管道理论,正式版 最后,我们来探讨一下我所认为的游戏在检查有效管道连接时的实际运行方式。 定理1.1:管道之间存在连接状态,当且仅当一个管道连接面的连接向量分量加上该管道的体素位置后,得到另一个管道的体素位置,且该管道的连接向量满足相同条件。

例如,有两个角管,两者都以变换r="1,0,0,0,1,0,0,0,1"开始。其中一个管道位于另一个管道前方5格、右侧2格、下方1格处。我们知道,局部y轴的j轴向量代表每个角管顶部连接面的连接向量,因此我们可以轻松编辑变换,无需过多额外思考。 从第一个管道到第二个管道的体素位移可以表示为向量s=〈2,-1,5〉,即向右2格、向下1格、向前5格。如果连接向量等于此位移,管道就会连接。因此,将第一个管道的变换设置为r="1,0,0,2,-1,5,0,0,1",第二个管道的变换设置为r="1,0,0,-2,1,-5,0,0,1",将满足两者的连接条件,从而在它们之间建立连接。 由于我们直接编辑了默认方向,其中一个管道的网格会因轴向量方向的改变而看起来是倒置的。要制作更美观的管道,需要进一步考虑在管道预旋转至更佳方向后,哪个轴向量对应连接向量,以及连接向量默认是否朝向相反方向。

请注意,我们只更改了其中一个连接向量的轴向量。对于弯管而言,这会留下一个未改动的连接向量,我们可以用它来重新定向管道,实现不同体素之间的连接链。 右侧图片展示了弯管的这种用法。由于涉及的距离较大,管道网格也被拉伸得相当大。因为弯管侧面的连接向量为 -i,所以它会被替换为 -s,即高位管道与其自身之间的负位移。高位管道使用面向 j 的连接,因此无需对其变换的位移取反,这使得两个变换在该连接组件上具有相同的符号。 直列长度变化

你可能会遇到需要将普通1长管道更换为半装饰性3长管道,同时保持它们之间连接的情况。这可以通过使用变换参数为r="1,0,0,3,0,0,0,0,1"的弯管轻松实现。 此时,面向j方向的组件现在面向i方向(+x),长度为3,而面向-i方向的组件仍面向-i方向,长度为1,这样就能同时连接3长和1长的管道。当你需要在不使用大量体素的情况下保持连接,又不想让横跨整个结构的弯管出现难看的拉伸网格时,这种过渡方式会非常有用。请记住这里的自由度;这些连接无需正对,它们可以倾斜成任意方向,长度也可按需调整。传说中的管道角度拐角

由于每根管道都存在于三维空间中,并且有三个不同的本地轴可供编辑,因此你可以在三种不同类型的管道之间创建过渡。此图片展示了这一功能的出色应用:发动机的输出通过一个拐角被分流到不同方向,然后这些方向通过一个角度和另一个拐角过渡回普通管道,从而将动力分流到一根很长的管道,将动力输送到发动机的另一侧。 谁在研究他们的管道呢 如果你有任何问题,或需要进一步澄清任何内容(或如果你发现任何错误),请随时在下方评论中提问




换一换 




















