柔体(Flexbodies)是映射到节点上的模型,并且能对其施加形变。
游戏会通过将每个顶点映射到附近的节点,并随着这些节点的移动而移动顶点,从而计算形变。
柔体通过使用组(groups)来分配给一组节点,柔体只会受到这些特定节点的移动影响而变形。更多信息请参阅 节点页面 。
所有的网格模型(meshes)应放在一个或多个 dae 文件内,这些文件应位于你车辆的文件夹或 common 文件夹下。更多信息请参见 车辆建模页面 。
还可以使用附加功能——形变组(deform groups)。当一组特定的梁(beams)发生形变时,可通过此功能触发指定模型的材质更变。这种机制常用于车灯和车窗。
当与该柔体具有相同 deformGroup 属性的某根梁发生足够的形变,达到其 deformationTriggerRatio 阈值,或该梁断裂时,模型的材质就会切换为 deformMaterialDamaged 属性中指定的材质。
每个网格顶点会被映射到3个或4个节点——一个中心节点,以及VX和VY节点,它们的位置应使得从这些节点到中心节点的虚线(或梁)之间形成大约90度的夹角。如果可能,还会有一个VZ节点,其与中心节点的连线应与其他连线也形成大约90度的夹角。柔体映射系统会为每个顶点寻找最接近且符合这些要求的节点,并有最大距离的限制;因此,有时某些顶点会被映射到夹角小于理想直角但距离更近的节点上。
当无法在分配的组中找到 VX 或 VY 节点时,网格将无法生成,控制台会显示错误信息:
VX 节点错误意味着对于所有顶点来说,只能找到一个中心节点。只有当组内仅包含一个节点时才会发生这种情况。VY 节点错误意味着柔体系统无法为部分或全部顶点找到能组成90度夹角的节点。其原因可能有多个,可通过游戏中柔体的表现进行判断:
如果柔体在游戏中完全不可见,这代表所有顶点都无法找到形成直角的节点。调试该问题的方法如下:
如果柔体部分可见,但部分区域丢失或异常拉伸,说明部分顶点可以找到能组成直角的节点,而另一些则不能。此时,请按如下方法排查:
柔体帮助节点(如果存在的话)相关的问题,请检查以下几点:
柔体帮助节点,则应在柔体丢失或拉伸的那一侧添加一个帮助节点。有时,柔体系统会将部分顶点映射到不理想的节点上,在变形时导致这些顶点移动到意外的位置,从而在网格上出现所谓的刺(spike)。为防止这种现象,应该让节点整体按格子状排列,避免出现过度偏离主区的节点,如果确因其它用途需要局外节点,则可以将它们从组中剔除。要参考合理、网格化的节点排布实例,可以在使用 Nodes 和 Triangles 调试可视化模式时观察原版车辆的排布。
请注意后轮拱周围的区域。整体网格排列与车窗对齐,但第一行与第二行部分节点需要重新安排,以映射至后轮轮拱外扩部分。这本来可能导致刺(spike),但后来通过将其正上方的节点往上一半距离平移修正了问题,使这些节点与上下节点形成笔直、成角度的排列。像这样找到最佳方案需要一定的尝试和经验,有经验的人会快一些。
"flexbodies" :[
["mesh", "[group]:","nonFlexMaterials"],
["my_mesh", ["my_group"]],
],
“nonFlexMaterials” 是一个已经弃用且无法再使用的遗留功能。它曾用于旧轮胎系统,阻止刚性轮毂网格随轮胎一起压缩。
"pos":{"x":0.0, "y":0.0, "z":0.0}
使用内在欧拉角旋转顺序 +Z +X +Y。
"rot":{"x":0.0, "y":0.0, "z":0.0}
px, py, pz,将网格分别旋转 x、y、z 度示例用法:
["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":[]},
],
这篇文章对你有用吗?