柔体

柔体(Flexbodies)是映射到节点上的模型,并且能对其施加形变。

游戏会通过将每个顶点映射到附近的节点,并随着这些节点的移动而移动顶点,从而计算形变。

柔体通过使用组(groups)来分配给一组节点,柔体只会受到这些特定节点的移动影响而变形。更多信息请参阅 节点页面

所有的网格模型(meshes)应放在一个或多个 dae 文件内,这些文件应位于你车辆的文件夹或 common 文件夹下。更多信息请参见 车辆建模页面

形变组(Deform Groups)

还可以使用附加功能——形变组(deform groups)。当一组特定的梁(beams)发生形变时,可通过此功能触发指定模型的材质更变。这种机制常用于车灯和车窗。

当与该柔体具有相同 deformGroup 属性的某根梁发生足够的形变,达到其 deformationTriggerRatio 阈值,或该梁断裂时,模型的材质就会切换为 deformMaterialDamaged 属性中指定的材质。

网格顶点到节点的映射

每个网格顶点会被映射到3个或4个节点——一个中心节点,以及VXVY节点,它们的位置应使得从这些节点到中心节点的虚线(或梁)之间形成大约90度的夹角。如果可能,还会有一个VZ节点,其与中心节点的连线应与其他连线也形成大约90度的夹角。柔体映射系统会为每个顶点寻找最接近且符合这些要求的节点,并有最大距离的限制;因此,有时某些顶点会被映射到夹角小于理想直角但距离更近的节点上。

当无法在分配的组中找到 VXVY 节点时,网格将无法生成,控制台会显示错误信息:

  • VX 节点错误意味着对于所有顶点来说,只能找到一个中心节点。只有当组内仅包含一个节点时才会发生这种情况。
  • VY 节点错误意味着柔体系统无法为部分或全部顶点找到能组成90度夹角的节点。其原因可能有多个,可通过游戏中柔体的表现进行判断:
    • 如果柔体在游戏中完全不可见,这代表所有顶点都无法找到形成直角的节点。调试该问题的方法如下:

      • 发生这种情况通常是组内只包含2个节点,或者所有节点排成一条直线。解决办法是:需要在组里增加第三个节点,该节点与组内其他节点之间形成约90度的夹角。此节点不需参与碰撞检测,仅用于辅助柔体系统,这被称为柔体帮助节点(flexbody help node)。此类节点通常用于像天线这样细长的结构上。
      • 确保柔体与所有节点的距离不要太远—,Jbeam 中节点的位置可能有拼写错误。
    • 如果柔体部分可见,但部分区域丢失或异常拉伸,说明部分顶点可以找到能组成直角的节点,而另一些则不能。此时,请按如下方法排查:

      • 首先检查该组内是否存在完全重叠(位置完全相同)的节点(可以通过节点名称调试可视化模式轻松辨别)。如果不是有意为之,请删除其中一个节点;如果有需要保留所有节点,可将其中一个节点移出该组(你也可以考虑将其 selfCollision 属性移除)。
      • 如果没有节点的位置完全重叠,说明存在 柔体帮助节点(如果存在的话)相关的问题,请检查以下几点:
        • 如果没有 柔体帮助节点,则应在柔体丢失或拉伸的那一侧添加一个帮助节点。
        • 如果已经存在帮助节点,说明有些顶点无法利用它形成足够大的夹角。这种情况下,应将该节点进一步移远,使该组中最锐利的虚线夹角变大。

有时,柔体系统会将部分顶点映射到不理想的节点上,在变形时导致这些顶点移动到意外的位置,从而在网格上出现所谓的刺(spike)。为防止这种现象,应该让节点整体按格子状排列,避免出现过度偏离主区的节点,如果确因其它用途需要局外节点,则可以将它们从组中剔除。要参考合理、网格化的节点排布实例,可以在使用 Nodes 和 Triangles 调试可视化模式时观察原版车辆的排布。

请注意后轮拱周围的区域。整体网格排列与车窗对齐,但第一行与第二行部分节点需要重新安排,以映射至后轮轮拱外扩部分。这本来可能导致刺(spike),但后来通过将其正上方的节点往上一半距离平移修正了问题,使这些节点与上下节点形成笔直、成角度的排列。像这样找到最佳方案需要一定的尝试和经验,有经验的人会快一些。

必要参数

"flexbodies" :[
    ["mesh", "[group]:","nonFlexMaterials"],
    ["my_mesh", ["my_group"]],
],
string
type
定义了网格(mesh)的名称
该名称需与 Blender 软件中的名称保持一致。
table
type
定义该网格关联的节点组列表
一个网格可以关联一个或多个节点组。关于组的更多信息,请参阅节点页面。

“nonFlexMaterials” 是一个已经弃用且无法再使用的遗留功能。它曾用于旧轮胎系统,阻止刚性轮毂网格随轮胎一起压缩。

可选参数

dictionary
type
{“x”:0, “y”:0, “z”:0}
default
柔体的位置偏移量(单位:米)
"pos":{"x":0.0, "y":0.0, "z":0.0}
dictionary
type
{“x”:0, “y”:0, “z”:0}
default
柔体的旋转偏移量(单位:度)

使用内在欧拉角旋转顺序 +Z +X +Y。

"rot":{"x":0.0, "y":0.0, "z":0.0}
dictionary
type
{“x”:1, “y”:1, “z”:1}
default
柔体的缩放比例
"scale":{"x":1.0, "y":1.0, "z":1.0}
string
type
指定该网格将使用的形变组名称
名称需与梁(beams)章节定义的形变组保持一致。
string
type
初始材质名称,在形变时会被替换
所有应用了形变组的网格应仅包含一个材质,以避免出现问题。这可能会导致你需要将零件拆分为多个组件,例如将前大灯的镜片与反射器分开。
string
type
形变组触发后使用的材质名称
string
type
形变组触发时播放的音效剪辑
number
type
形变组触发时音效的音量
dictionary
type
{“x”:0, “y”:0, “z”:0}
default
将网格在 YZ 轴上进行偏移,如位置未居中则在 X 轴做镜像偏移(单位:米)
这个参数不会在 Flexbodies 部分显式设置,而是从 Slots 部分传递过来。
dictionary
type
{“x”:0, “y”:0, “z”:0}
default
将网格在 XYZ 轴上偏移(单位:米)
这个参数不会在 Flexbodies 部分显式设置,而是从 Slots 部分传递过来。
dictionary
type
{“x”:0, “y”:0, “z”:0, “px”:0, “py”:0, “pz”:0}
default
绕中心点 px, py, pz,将网格分别旋转 x、y、z 度
这个参数不会在 Flexbodies 部分显式设置,而是从 Slots 部分传递过来。
boolean
type
false
default
指定网格位置是否忽略 nodeOffset 修饰符
table
type
将柔体使用的特定材质替换为其他材质

示例用法:

["part", ["group"], [],{"materialOverride":[
    ["originalMaterial1","replacementMaterial1"],
    ["originalMaterial2","replacementMaterial2"]
]}],

简易示例

一个名为 “my_mesh” 的网格被分配给 “my_group” 节点组。

"flexbodies" :[
    ["mesh", "[group]:","nonFlexMaterials"],
    ["my_mesh", ["my_group"]],
],

进阶示例

带有形变组的大灯示例。

   "flexbodies": [
         ["mesh", "[group]:", "nonFlexMaterials"],
         ["pickup_headlightframe_R", ["pickup_fascia"]],
         ////大灯
         {"deformGroup":"headlightglass_R_break", "deformMaterialBase":"gavril_lights", "deformMaterialDamaged":"gavril_lights_dmg"},
         ["pickup_headlight_R", ["pickup_fascia"]],
         //玻璃
         {"deformGroup":"headlightglass_R_break", "deformMaterialBase":"pickup_glass", "deformMaterialDamaged":"pickup_glass_dmg"},
         ["pickup_headlightglass_R", ["pickup_fascia"],[]{"deformSound":"event:>Destruction>Vehicle>Glass>glassbreaksound4", "deformVolume":0.6}],
         {"deformGroup":""},
    ],

一个包含修饰符和多个节点组的柔体示例。

    "flexbodies": [
        ["mesh", "[group]:", "nonFlexMaterials"],
        //车轮
        ["steelwheel_10a_13x5_5", ["wheel_FR","wheelhub_FR"], [], {"pos":{"x": -0.50, "y":-0.0, "z":0.0}, "rot":{"x":0, "y":0, "z":180}, "scale":{"x":1, "y":1, "z":1}}],
        ["steelwheel_10a_13x5_5", ["wheel_FL","wheelhub_FL"], [], {"pos":{"x": 0.50, "y":-0.0, "z":0.0}, "rot":{"x":0, "y":0, "z":0},    "scale":{"x":1, "y":1, "z":1}}],
    ],

使用 materialOverride 来定义具有不同颜色变体的多个零件。

"us_semi_conventional_bullbar_type_bare": {
    "information":{
        "authors":"BeamNG",
        "name":"Bare Metal",
        "value":450,
    },
    "slotType" : "us_semi_conventional_bullbar_type",
   "flexbodies": [
       ["mesh", "[group]:", "nonFlexMaterials"],
       ["longnose_bullbar", ["us_semi_bullbar"], [],{"materialOverride":[["us_semi_common","us_semi_common"]]}],
   ],
},
"us_semi_conventional_bullbar_type_chrome": {
    "information":{
        "authors":"BeamNG",
        "name":"Polished",
        "value":450,
    },
    "slotType" : "us_semi_conventional_bullbar_type",
   "flexbodies": [
       ["mesh", "[group]:", "nonFlexMaterials"],
       ["longnose_bullbar", ["us_semi_bullbar"], [],{"materialOverride":[["us_semi_common","us_semi_common_chrome"]]}],
   ],
},
"us_semi_conventional_bullbar_type_painted": {
    "information":{
        "authors":"BeamNG",
        "name":"Painted",
        "value":450,
    },
    "slotType" : "us_semi_conventional_bullbar_type",
   "flexbodies": [
       ["mesh", "[group]:", "nonFlexMaterials"],
       ["longnose_bullbar", ["us_semi_bullbar"], [],{"materialOverride":[["us_semi_common","us_semi_common_painted"]]}],
   ],
},
"us_semi_conventional_bullbar_type_black": {
    "information":{
        "authors":"BeamNG",
        "name":"Black",
        "value":450,
    },
    "slotType" : "us_semi_conventional_bullbar_type",
   "flexbodies": [
       ["mesh", "[group]:", "nonFlexMaterials"],
       ["longnose_bullbar", ["us_semi_bullbar"], [],{"materialOverride":[["us_semi_common","us_semi_common_black"]]}],
   ],
},

同时对多个柔体使用 materialOverride。

"flexbodies": [
    ["mesh", "[group]:", "nonFlexMaterials"],

    {"materialOverride":[
      ["us_trucklight_signal_R", "us_trucklight_amber_R"],
      ["us_trucklight_signal_L", "us_trucklight_amber_L"],
      ["us_trucklight_taillight_R", "us_trucklight_red_R2"],
      ["us_trucklight_taillight_L", "us_trucklight_red_L2"],
      ["us_trucklightglass_signal_R", "us_trucklightglass_amber_R"],
      ["us_trucklightglass_signal_L", "us_trucklightglass_amber_L"],
      ["us_trucklightglass_taillight_R", "us_trucklightglass_red_R2"],
      ["us_trucklightglass_taillight_L", "us_trucklightglass_red_L2"],
    ]},

    ["us_trucklight_taillight_R",     ["schoolbus_body"],[],{"pos":{"x":-0.880,"y":-0.855,"z":2.661}}],
    ["us_trucklight_signal_R",        ["schoolbus_body"],[],{"pos":{"x":-0.685,"y":-0.855,"z":2.661}}],
    ["us_trucklight_taillight_L",     ["schoolbus_body"],[],{"pos":{"x": 0.880,"y":-0.855,"z":2.661}}],
    ["us_trucklight_signal_L",        ["schoolbus_body"],[],{"pos":{"x": 0.685,"y":-0.855,"z":2.661}}],
    ["us_trucklightglass_taillight_R",["schoolbus_body"],[],{"pos":{"x":-0.880,"y":-0.855,"z":2.661}}],
    ["us_trucklightglass_signal_R",   ["schoolbus_body"],[],{"pos":{"x":-0.685,"y":-0.855,"z":2.661}}],
    ["us_trucklightglass_taillight_L",["schoolbus_body"],[],{"pos":{"x": 0.880,"y":-0.855,"z":2.661}}],
    ["us_trucklightglass_signal_L",   ["schoolbus_body"],[],{"pos":{"x": 0.685,"y":-0.855,"z":2.661}}],

    {"materialOverride":[]},
],
上一次修订: 五月 20, 2026

还有其他问题?

加入我们的 Discord 服务器
Our documentation is currently incomplete and undergoing active development. If you have any questions or feedback, please visit this forum thread.