Jbeam 技巧与窍门

这些是开发者们多年来总结出来的 Jbeam 技巧和窍门。遵循这些建议可以提升你的 Jbeam 结构质量。虽然它们主要面向已经具备整车制作能力的高级模作者,但对初学者同样有帮助。

开发环境 (IDE)

这部分是指用于编辑 Jbeam 文件的软件,例如 Notepad++ 或 Visual Studio Code。

使用空格进行缩进

建议使用相关设置、命令或宏,使 Jbeam 文件中的缩进统一采用空格而非制表符(Tab)。这样,无论你还是他人在不同编辑器中打开文件时,缩进都能保持一致。

垂直选择

最好将 Jbeam 的缩进格式化,使节点名称和坐标能够在列中对齐。

这样,当你需要批量修改多行中的某个数值时,就可以使用垂直选择功能(在 Notepad++ 中为 LEFT ALT + LMB,在 VS Code 及相关程序中为 SHIFT + ALT + LMB,或者直接使用中键点击)。

在选区内批量替换

当你需要在 Jbeam 文件中进行批量重命名或替换操作时,一定要确保范围限制在当前选中的行内,以避免误修改 Jbeam 修饰符中的语法内容。

Cursor AI

如果你使用 Cursor 而不是 Visual Studio Code 编辑 Jbeam 文件,可以借助内置的 AI 功能。虽然它无法替你设计 Jbeam 结构,但对于大量、枯燥且精确的调整工作(如批量修改 slidenodes 以与轨道对齐)非常有帮助。

节点、梁和三角形

这里你将找到一些与 Jbeam 结构部件相关的建议和技巧。

Jbeam 碰撞系统

下列是来自官方文档各处、关于 Jbeam 碰撞系统的全部重要信息,已整理为一个列表,便于你调试碰撞问题时参考。

  • Jbeam 中存在三种碰撞类型:高度图碰撞(heightmap collision)、静态碰撞(static collision)、动态碰撞(dynamic collision)。这些碰撞都只适用于节点。
  • 静态碰撞对性能的影响比高度图碰撞更大。
  • 高度图和静态碰撞由 Jbeam 中的 staticCollision 参数控制,默认情况下它的值和 collision 参数一样,除非为某个节点单独设定。
  • 高度图碰撞具有一定的“深度”,这有助于轮胎更平稳地滚动。
  • 动态碰撞的优先级高于静态碰撞。
  • Jbeam 中的动态碰撞又分为 collision(车辆间碰撞)和 selfCollision(同车零部件间碰撞)。
  • 如果 collision 设置为 false,则 selfCollision 即使设为 true 也会被禁用。
  • 如果节点被设置为 fixed,则 collisionselfCollision 都会被禁用,但 staticCollision 仍然可以启用。
  • 如果节点是标准或高级的 coupler,当其处于耦合状态时,selfCollision 会被暂时禁用。
  • 如果一个节点和一个三角形由同一组(group,若有多个 group 则以第一个为准)的节点构成,则 selfCollision 不会在该节点和三角形之间生效。可以利用这一点使特定节点和三角形间不碰撞,但整体仍保持 selfCollision 作用。
  • 三角形有 2.5cm 的“厚度”,即节点距离三角形绿色面多远时开始发生碰撞。在调试工具中,默认设置下当节点和三角形接触就可见。
  • 如果遇到穿模无法通过常规手段解决,可通过 externalCollisionBias 参数调整三角形厚度。
  • 三角形不仅有碰撞,还具备防穿模(anticlip)系统。这个系统会决定节点在碰撞后最终会停留在哪一侧。
  • 标记为 NONCOLLIDABLE 的三角形虽然没有碰撞,但依然有防穿透功能,而且性能更好。
  • 每个启用 selfCollision 的节点,其表面应至少有 NONCOLLIDABLE 三角形以实现基础碰撞避免。例如排气管就会用 NONCOLLIDABLE 三角形。

BreakGroup 作为表格使用

BreakGroup 可以被写成一个表格(table),当 breakGroupType 设置为 1 时,意味着只要其中任意一个 breakGroup 被触发,该 beam 就会断裂。 这对于支撑梁(support beams)非常有帮助。例如,如果你的前车门和后车门之间有支撑梁,希望当任意一扇门断裂时支撑梁也能随之断裂,就可以这样设置。

断裂轨道和扭杆

轨道(rails)和扭杆(torsionbars)并不能像你想的那样直接使用 breakGroups。要正确使某条轨道的链接断裂,需要断开连接该轨道节点之间的 beam。要让扭杆断裂,则必须断开连接其两个相邻节点的 beam。

通常,最好的方法是设置一个“虚拟 beam”(dummy beam):没有弹簧或阻尼(spring/damp),变形和强度(deform/strength)都设置到最大,带有 disableMeshBreakingdisableTriangleBreaking 属性,并挂上你希望关联的 breakGroup(可以是多个),将其设置在扭杆或轨道的两个节点之间,并把 breakGroupType 设为 1。这个 beam 只负责让轨道/扭杆断裂,不会带来其它副作用。

碰撞滑动节点(Collision slidenodes)

有时你可能希望在结构边缘增加节点密度,比如防止掉落物直接掉在边缘时发生穿透。你可以通过轨道(rails)和滑动节点(slidenodes)实现这一点,同时不会影响结构的变形。

以下是为获得最佳变形表现和性能而添加碰撞滑动节点(collision slidenodes)的详细流程:

  1. 让该结构上所有节点拥有两组 group。group 1 用于碰撞,group 2 与 mesh 上保持一致。
  2. 在你希望增加碰撞点的边缘节点之间,添加 rail(导轨)。
  3. 在这些 rail 上添加作为 slidenode(滑动节点)用的节点。这些节点应启用 selfCollision,并且只属于 group 1。这样,它们不会与所在三角形发生碰撞,但会与车辆其它部分碰撞。如果有两条边很近,可将各自的滑动节点错开分布,从而提升性能。
  4. 在 rail 上定义 slidenodes。此时碰撞节点会被锁定在各自的 rail 上,但仍可沿轨道滑动。
  5. 将每个滑动节点分别用 beam 分别与 rail 上(两个方向上的)结构节点连接。这样碰撞节点就被完全锁定在 rail 上。
  6. 目前这些 slidenode 还不够稳定,因为 rail 缺乏阻尼。用节点抓取工具(nodegrabber)拉动碰撞节点,测试其会在何方向摆动。使用节点受力调试(node forces debug)来观察。
  7. 在摇晃方向上,添加碰撞节点与结构节点之间的 beam。重复上一步和本步,直到节点不再有摇晃现象为止。
  8. 在原有结构三角形的基础上,于碰撞滑动节点和结构节点之间添加 NONCOLLIDABLE(不可碰撞)三角形,就像正常 Jbeam 一样操作,但不考虑结构节点三角形的存在。这样防穿模系统便能对这些滑动节点起作用,防止其卡死,同时不会因增加碰撞三角形而影响性能。 建议在临时移除结构三角形后再添加这些不可碰撞三角形,这样调试工具的可视化效果会更清晰,便于操作与检查。

Flexbodies 与道具相关提示

本节包含一些关于在 Jbeam 中定位视觉零件(Flexbody、Prop)的小技巧。

全局参数设定

对于聚光灯(spotlight)和点光源(pointlight)类 prop,推荐优先使用可选参数 baseTranslationGlobal 替代默认的 baseTranslationbaseRotationGlobal 替代 baseRotation。这两者与 Blender 使用相同的坐标系,无需反复试错就能对齐 3D 模型。

示例:

"props": [
  ["func", "mesh", "idRef:", "idX:", "idY:", "baseRotation", "rotation", "translation", "min", "max", "offset", "multiplier"],
  {
      "lightInnerAngle":0,
      "lightOuterAngle":120,
      "lightRange":8,
      "lightColor":{"r":255, "g":10, "b":0, "a":255},
      "lightAttenuation":{"x":0, "y":1, "z":1},
      "lightCastShadows":false,
      "flareName":"vehicleBrakeLightFlare",
      "flareScale":0.012,
      "lightBrightness":0.08,
  },
  ["brakelights", "SPOTLIGHT", "t4r", "t4", "t3l", {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, 0, 0, 0, 1,
  {"baseTranslationGlobal":{"x":-0.22, "y":2.44, "z":1.07},"baseRotationGlobal":{"x":0, "y":0, "z":180},"deformGroup":"reverselight_break"}],
  ["brakelights", "SPOTLIGHT", "t4r", "t4", "t3l", {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, 0, 0, 0, 1,
  {"baseTranslationGlobal":{"x":-0.13, "y":2.44, "z":1.07},"baseRotationGlobal":{"x":0, "y":0, "z":180},"deformGroup":"reverselight_break"}],
  ["brakelights", "SPOTLIGHT", "t4r", "t4", "t3l", {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, 0, 0, 0, 1,
  {"baseTranslationGlobal":{"x":-0.04, "y":2.44, "z":1.07},"baseRotationGlobal":{"x":0, "y":0, "z":180},"deformGroup":"reverselight_break"}],
  ["brakelights", "SPOTLIGHT", "t4r", "t4", "t3l", {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, 0, 0, 0, 1,
  {"baseTranslationGlobal":{"x": 0.04, "y":2.44, "z":1.07},"baseRotationGlobal":{"x":0, "y":0, "z":180},"deformGroup":"reverselight_break"}],
  ["brakelights", "SPOTLIGHT", "t4r", "t4", "t3l", {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, 0, 0, 0, 1,
  {"baseTranslationGlobal":{"x": 0.13, "y":2.44, "z":1.07},"baseRotationGlobal":{"x":0, "y":0, "z":180},"deformGroup":"reverselight_break"}],
  ["brakelights", "SPOTLIGHT", "t4r", "t4", "t3l", {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, {"x":0,"y":0,"z":0}, 0, 0, 0, 1,
  {"baseTranslationGlobal":{"x": 0.22, "y":2.44, "z":1.07},"baseRotationGlobal":{"x":0, "y":0, "z":180},"deformGroup":"reverselight_break"}],
],

在 Blender 中设置 Flexbody 旋转

当使用通用的 flexbody,例如越野灯时,通常需要让其绕多个轴旋转,以便准确对齐整个 3D 模型。

你可以直接在 Blender 中设置好旋转。导入你需要使用的部件,摆放好位置,把旋转系统切换为 ZXY Euler,旋转网格体,然后将旋转的结果直接复制到 Jbeam 文件中使用即可。

常见问题排查(Troubleshooting)

本节内容用于发现和解决常见的问题。

检查变形的 beam

有时检查所有已经发生过变形的 beam 非常有用。方法如下:在车辆配置器(Vehicle Configurator)的 Debug 标签页中:

  • 将 Beam Visualization(beam 可视化)模式设置为 Deformation
  • 取消勾选 Range Max 输入框旁边的开关
  • 取消勾选下方的 Use Inclusive Range
  • 其他设置保持默认即可

这样会高亮所有已经变形的 beam,并在控制台打印相关信息。

应力检查

beam 应力过大往往是结构问题的征兆,例如节点和三角形穿插、slidenode 未对齐、beam 预压等。正确检查车辆应力的方法如下:

  1. 在环境(Environment)菜单中把重力设置为零。
  2. 车辆起飞离地之后,按 CTRL + R 重新加载车辆,清零惯性。
  3. 通过界面或者按 V 键关闭发动机,让传动和液压系统全部放松。
  4. 打开车辆配置器的 Debug 标签,或者直接按 CTRL + NUMPADMINUS,降低网格体的可见性。
  5. 把 Beam Visualization 模式切换为 “Stress”,可在 debug 标签中设置或持续按 CTRL + B 循环切换。
  6. 可以等待几秒钟,确保一切都稳定下来。

在结构稳定的 Jbeam 下,结果应类似如下示意。极少数 beam 有应力,且主要集中在悬挂、轮胎和可开启件的锁扣上。

在结构不稳定时,会明显看到某些区域应力较大。这说明这些区域附近需要修复。可以打开节点名称可视化,定位具体出问题的节点。常见检查点包括:

  • 节点在载入时与三角形发生碰撞(提示:使用 节点三角形自碰撞检测器
  • slidenode 在 Jbeam 配置中没有和轨道(rail)正确对齐
  • beamPrecompression 属性外泄

不稳定抖动

flexbody 在载入时不停抖动,通常意味着某处弹簧或阻尼值相对于节点质量设置过高。可以通过节点受力调试可视化定位具体问题点。出现最大/最多不稳定力的区域最可能是问题来源。那些大小/方向变化不剧烈的稳定受力可以忽略(通常由 coupler 引起)。

注意,虽然大多数情况下 beam 应力和节点受力调试可以互换使用,但对于重量大且刚性高的车辆,这两者结果会十分不同,因为受力随着节点质量而变化,而应力不会。 对于重且硬的车辆,节点受力调试会在承重节点周围产生大量误报。

与此同时,beam 应力调试行为则更接近普通车辆——区别在于原本就有高应力的 beam(比如轮胎结构)会被放大,更难一眼发现真正的问题。

因此对于这类车辆,建议两种模式都检查一遍,确保没有遗漏实际问题。

结构细长件摆动

某些细长结构、质量大部分集中于末端(比如校车的长杆后视镜)天生会出现难以解决的摆动问题。以下是改善的方法:

  • 增加专为阻尼的 beam,这些 beam 锚点连接至结构中非直接相连的其他部位,以获得更大杠杆臂;
  • 给这些 beam 指定一个 breakGroup,将途径路径上所有涉及的 breakGroup 全部列表进去,这样只要其中一环断开,阻尼 beam 也会随之断开;
  • 将 breakGroupType 设置为 1,这样你的部件断开不会影响其他结构。此外,将 beamStrength 设为最大值,避免 beam 因为外力过大发生断裂。

性能优化

如果你的 Jbeam 在 CPU 端存在性能问题,可以参考本节内容。

大型轮胎

大型轮胎需要在拥有足够好的碰撞检测(避免穿模,能够顺利碾压其他车辆或道具)和较高的 CPU 性能之间取得平衡,因为它们很容易成为整辆车中最消耗性能的部分。 可以调整许多轮胎参数以达到理想的平衡,例如:

  • selfCollision,如果你不在意轮胎与车辆本体不产生碰撞的话可以关闭
  • numRays 控制轮胎节点密度。更少的射线意味着更好的性能,但滚动阻力更大且更容易穿模
  • wheelAngle 针对双胎(dually wheels)- 通过合适的设置可以减少 numRays
  • triangleCollision - 当你的轮胎足够大到可以碾过其他车辆时应开启,但非常消耗性能
  • hubSide1TriangleCollisionhubSide2TriangleCollision - 如果你的车辆轮胎被击中的概率小于轮毂,可以关闭;也可以只在某一侧开启,或只针对内侧双胎启用
  • enableTireLbeams - 如果车辆有很多轮胎,禁用可提升性能,但会大大增加滚动阻力且难以解决

通常可以采取的折中方案是启用 selfCollision,对双胎轮适当减少 numRays,关闭 hubSide1TriangleCollisionhubSide2TriangleCollision,其它参数按车辆需求针对性调整。

双胎轮也可以作为单个宽轮胎构造。这样能极大提升性能,但有很多缺点,因此只推荐用于拖车等轮胎不驱动、不会直接碰撞前方物体的场合。

三角形休眠模式

如果一个三角形的两侧 10cm 范围内没有任何可能与其碰撞的节点(如无 selfCollision、分属不同 group、无 coupler 等),它会进入“休眠模式”,从而提升性能。当存在许多这样的三角形时,提升幅度非常可观。 优化大型封闭结构(比如货箱/拖车内饰)时应牢记此特性。例如,在干货厢拖车内部,为了利用这一机制,货物通常会悬浮在地板上方。

不可碰撞三角形

体积很小且节点密集的结构(如越野灯),理想情况下应使用 NONCOLLIDABLE 类型三角形替代 NORMALTYPE 类型的。 因为可碰撞三角形在其 50cm 范围内没有节点时不会额外影响性能,但每有一个节点靠近就会带来性能消耗。当每个三角形附近节点数量很多时,影响尤为严重。因此在节点密集区域,三角形应为 NONCOLLIDABLE

NONCOLLIDABLE 三角形也可以用于有较大碰撞间隙的部件(如栏杆),这样碰撞只依赖节点检测,三角结构仅用于防穿模。

Jbeam 穿模

如果一个节点在行驶时与三角形发生穿模(即距离小于2.5cm并产生碰撞),会不断触发碰撞事件。如果全车有很多类似节点,将极大拖慢性能。 原则上,节点与三角形的最小安全距离应为 3cm,若是特别柔软的零件则建议 3.5cm,以留出裕度。可以使用节点三角形自碰撞检测器 定位此类节点。

DeformGroups

使用 deformGroups 时,请记住 deformationTriggerRatio 才是消耗性能的属性,本身 deformGroup 并不会影响性能。务必确保没有多余的地方外泄了 deformationTriggerRatio 参数!可以通过 beam 调试模式检查。 注意,deformGroups 不只是在达到阈值时才触发,在 beam 断裂时也会触发。因此,尽量让 deformGroups 关联到 beam 断裂的时机,这样更节省性能。

地面碰撞

静态碰撞对地图物体的性能消耗远大于对高度图的(地形)的消耗。因此,若车辆经常需要碾压地图中的物体(如岩石),比在普通贴花道路上更需要减少车底的节点密度。这也是为什么攀爬车腹板(skidplate)节点数较少的原因。

静态与动态碰撞分离

有些结构对于平面 Jbeam 来说过厚,但若进行完整的三维碰撞又太消耗性能(参考上文的不可碰撞三角形),比如卡车上的扁平矩形后视镜。要想实现场地精准碰撞但无需动态碰撞时,可以将部分节点的 collisionselfCollision 关闭,仅开启 staticCollision,且这些节点不附着三角形。这样特别是在这些节点靠近其它配件三角形时能有效提升性能。

上一次修订: 五月 16, 2026

还有其他问题?

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