遇到任何 jbeam 问题时,首要步骤应该是检查控制台(默认快捷键为 `),查找错误信息。
错误信息会以红色显示在控制台中,而警告信息则以黄色显示。
最常见的问题类型是 jbeam 语法错误,这会导致解析器(parser)无法工作,相应的部件也无法加载。有关语法的更多信息,请参阅 jbeam 语法简介 页面。
你应该能够在控制台中看到类似于 “无法解码JSON(Unable to decode Json): /vehicles/vehicleName/jbeamFile.jbeam” 这样的红色错误信息,告诉你哪个文件没能被正确加载。
在书写字符串,尤其是节点名称时,非常容易犯的错误就是不小心漏掉了字符串开头或结尾的引号。
解析器通常能够比较准确地定位到这类问题。
例如下方的示例 jbeam:
["bd8l",0.31,1.68,0.52],
["bd8ll",0.64,1.68,0.52],
//bed sides lower
{"nodeWeight":0.4},
["bd9rr,-0.627,0.381,0.25], // 节点名称缺少引号。
["bd9",0.0,0.381,0.3],
["bd9ll",0.627,0.381,0.25],
["bd10rr",-0.627,0.706,0.25],
["bd10ll",0.627,0.706,0.25],
在控制台中会显示如下信息:
unable to decode JSON: /vehicles/pigeon/pigeon_bed.jbeam
JSON decoding error: [string “lua/common/json.lua”]:55: Invalid input near line 68, ‘[“bd9”,0.0,0.381,0.3],’
一个功能更强大的文本编辑器也会很有帮助,它可以高亮显示字符串,当有错误时会非常直观。下图是在 Visual Studio Code 中,将语言设置为 “JSON with comments” 时的示例。
jbeam 文件中的所有内容都由括号分割为不同的部分。每个括号都必须有一个对应的闭合括号,否则解析器就会出错。
在控制台中,报错信息通常不会像字符串问题那样精确地定位错误,但一般会显示文件名以及大致出错的位置,通常是在包含错误的部分,或是紧接在后面的部分。
unable to decode JSON: /vehicles/pigeon/pigeon_bed.jbeam
JSON decoding error: [string “lua/common/json.lua”]:55: Invalid input near line 95, ‘“beams”:[’"’
如果你的 jbeam 文件中有两个拥有相同名称的部件,你将在控制台中看到如下错误信息:
Duplicate part found : pigeon_hood from file /vehicles/pigeon/pigeon_hood.jbeam
在这种情况下,后出现的那个部件会覆盖先出现的那个同名部件。为避免这种情况,你需要删除或重命名其中一个部件。
请注意,报错信息中所列出的部件是第二次被找到的,第一次出现的同名部件很可能是在其他文件中。
柔体相关问题会导致部件的 jbeam 结构可以正常加载,但柔体本身不会显示出来。
如果柔体在游戏中显示但位置不正确,即使在 Blender 里的位置看起来是对的,通常是该部件的原点(origin)偏移了。
要修复这个问题,请参考建模指南 。
如果游戏无法找到你的柔体,在控制台会显示如下提示:
Failed to get render mesh MeshName
这通常意味着你的模型网格不在模组文件夹内的 dae 文件中,或者是在 柔体部分 给模型命名时存在拼写错误。
如果模型没有显示,并且控制台没有报错,通常意味着柔体部分引用的节点组内没有任何节点。
这种情况通常是因为在分组定义时拼写出错,无论是在柔体部分还是在节点部分都有可能。
VY 节点错误会在控制台中显示如下内容:
FLEXBODY ERROR on mesh MeshName: VY node not found
这意味着物理引擎无法正确地将柔体映射到定义的节点集合上,可能有以下几个原因:
第一个原因是节点数不够。物理引擎至少需要为每个柔体分配 3 个节点,最好更多,才能正确计算变形。
另一个常见问题是节点之间的相对位置。如果节点都在一条直线上或在一个扁平平面内,游戏可能无法将柔体正确映射到节点上,于是会报出 VY 错误。
最后一个可能的问题是节点没有很好地覆盖柔体。如果柔体的某些部分距离分配的节点太远,游戏将无法根据节点坐标准确地插值柔体位置。
对于上述所有情况,最佳方案是为柔体的节点组增加更多节点,或分配额外的节点组。
如果你在 Blender 中没有为模型分配材质,模型将不会显示,并且控制台会出现如下错误信息:
Mesh [MeshName] has no material assigned… cant be rendered
结构性问题通常不会导致控制台报错,但会导致你的 jbeam 在游戏中出现可见的问题,比如抖动、过度松垮等现象。
大多数情况下,不要忘记再次检查你的 beam 参数。部件容易变形、悬挂表现异常,很可能是因为变形设置(deform)过低,刚度/阻尼不适合该用途,或者参数范围设置不正确。
部件在载入后结构塌陷,通常原因是 jbeam 缺乏堆叠支撑(bracing)。请阅读jbeam 介绍 页面获取更多信息。
对于扁平部件,你可能还需要使用“加固节点”(rigidifier node),即一个没有碰撞、但位置偏离于表面的节点,并与面板上的所有节点相连。如果你已经添加了加固节点,可能需要将其进一步远离面板表面。
在 BeamNG 中调试 beam 结构时,最大的问题之一就是结构出现不稳定现象。
你可能会遇到几种不同级别的不稳定。其中最严重的情况是:当问题 beam 无法断裂时,车辆在生成时会直接消失,并伴随出现“不稳定性检测到(instability detected)”的消息。
不过,不稳定也可能会导致可以断裂的部件在生成时直接脱落,或者只是原地抖动和震荡。在“应力(Stress)” beam 调试视图下,这类问题非常容易发现,因为这些 beam 会从亮蓝色快速闪烁到亮红色。
导致这种现象的原因通常是 beamSpring 和/或 beamDamp 值过高,相对节点质量(nodeWeight)来说不合适。解决办法是降低 beamSpring/Damp 的数值,或者增加 nodeWeight。不稳定也可能由于节点在生成时被推挤而产生或加剧,因为这样会给结构增加额外负载。
对于面板和悬挂部件来说,一个常见的问题是:节点在生成时位于三角形内部,然后被推出表面。这种现象通常表现为面板缝隙在生成后变宽,或部件原地震动。这类问题也可以通过观察应力调试视图中 beam 应力在载入后上升来发现。
这种类型的问题有两种可能的解决方法。第一种(通常推荐用于车身面板)是调整节点的位置,确保生成时没有节点发生穿模。
在一些如悬挂这样的情况中,为了保证良好的悬挂几何,节点位置十分关键,这时也可以将 “selfCollision” 设置为 false。但请注意,这样会让该部件可以自由穿透车辆其他部位,这可能并非你所期望的表现。
车辆刚生成就出现大幅度变形,可能有以下几种原因。
第一个可能原因是 slidenode 与其导轨未对齐,导致生成时节点会剧烈地回到应有位置。这种现象可以通过暂停物理并使用应力调试模式观察,受影响的 beam 会在没有预压的情况下显示为受力状态。
另一种可能是结构不稳定,在发生一定程度变形后才趋于稳定。要确认这一点,可以在车辆生成的瞬间,通过 100 倍慢动作观察应力调试视图。你会看到车辆一生成就有振动发生。解决办法请参阅前文关于不稳定性的修复部分。
还有一种可能是 beam 预压缩值过高或过快。请确保没有错误地给 beam 设置了过高的预压值。如果只是预压变化过快,可以像下面这样在 beam 代码中通过设置 beamPrecompressionTime 来减缓变化速度:
["fx5l","st1l", {"beamPrecompression":"$=$toe_FR-$steer_center_F","beamPrecompressionTime":0.5}],
属性泄漏是指某个本不应受到 breakgroup、deformgroup、碰撞属性等影响的部件,却意外地受到了这些属性的影响。
例如,breakGroup 泄漏可能导致当你移除前保险杠时,后保险杠也跟着断裂或消失。
对于 breakgroup 和 deformgroup,这种问题在它们各自的调试视图中非常容易察觉。
为避免这类问题,最简单的做法是在每个部件末尾添加如下语句,将相关属性重置为默认值:
// beams 的闭合语句
{"breakGroupType":0},
{"deformGroup":""},
{"optional":false},
{"breakGroup":""},
{"beamPrecompression":1, "beamType":"|NORMAL", "beamLongBound":1.0, "beamShortBound":1.0},
有时候,建议使用表格行修饰符(table row modifiers) ,以彻底消除属性泄漏的风险。
在发布模组前,一个良好的习惯是查看控制台,确认没有任何报错,即使模组看起来已经可以正常加载。
这些报错会影响性能,也会让你在排查真实问题时变得更加困难。
下面列举一些常见但对模组功能没有明显影响的错误信息:
重复 beam 通常发生在打字错误或复制粘贴时出错。当出现这种问题时,控制台会显示黄色警示信息:“duplicated beam between nodes”
duplicated beam between nodes: node1 and node2
解决方法很简单,只需删除多余的 beam 引用即可。
你可能会看到另一个报错,但它未必会影响你的模组实际功能:节点缺失(missing node)错误。控制台会类似这样显示:
link target not found : beams/1787 > nodes/nodeName id1:nil, id2:nil, partOrigin: PartName - DATA DISCARDED
这通常是拼写错误造成的,也可能是你在删除某个节点后,忘记移除用到该节点的 beam 或三角形导致。
如果节点缺失是由于当前部件选择没有该节点引起,推荐为相关 beam 设置 “optional” 属性。
如果你在制作 jbeam 时参考了其他已有 jbeam,或者对 flexbody 做过修改,可能会遇到如下问题:
Failed to get render mesh MeshName
如果你的车辆上没有明显缺失的模型,只需在 jbeam 文件中移除对该 flexbody 的引用即可。
这篇文章对你有用吗?