这些是开发者们多年来总结出来的 Jbeam 技巧和窍门。遵循这些建议可以提升你的 Jbeam 结构质量。虽然它们主要面向已经具备整车制作能力的高级模作者,但对初学者同样有帮助。
这部分是指用于编辑 Jbeam 文件的软件,例如 Notepad++ 或 Visual Studio Code。
建议使用相关设置、命令或宏,使 Jbeam 文件中的缩进统一采用空格而非制表符(Tab)。这样,无论你还是他人在不同编辑器中打开文件时,缩进都能保持一致。
最好将 Jbeam 的缩进格式化,使节点名称和坐标能够在列中对齐。
这样,当你需要批量修改多行中的某个数值时,就可以使用垂直选择功能(在 Notepad++ 中为 LEFT ALT + LMB,在 VS Code 及相关程序中为 SHIFT + ALT + LMB,或者直接使用中键点击)。
当你需要在 Jbeam 文件中进行批量重命名或替换操作时,一定要确保范围限制在当前选中的行内,以避免误修改 Jbeam 修饰符中的语法内容。
如果你使用 Cursor 而不是 Visual Studio Code 编辑 Jbeam 文件,可以借助内置的 AI 功能。虽然它无法替你设计 Jbeam 结构,但对于大量、枯燥且精确的调整工作(如批量修改 slidenodes 以与轨道对齐)非常有帮助。
这里你将找到一些与 Jbeam 结构部件相关的建议和技巧。
下列是来自官方文档各处、关于 Jbeam 碰撞系统的全部重要信息,已整理为一个列表,便于你调试碰撞问题时参考。
staticCollision 参数控制,默认情况下它的值和 collision 参数一样,除非为某个节点单独设定。collision(车辆间碰撞)和 selfCollision(同车零部件间碰撞)。collision 设置为 false,则 selfCollision 即使设为 true 也会被禁用。fixed,则 collision 和 selfCollision 都会被禁用,但 staticCollision 仍然可以启用。coupler,当其处于耦合状态时,selfCollision 会被暂时禁用。selfCollision 不会在该节点和三角形之间生效。可以利用这一点使特定节点和三角形间不碰撞,但整体仍保持 selfCollision 作用。externalCollisionBias 参数调整三角形厚度。NONCOLLIDABLE 的三角形虽然没有碰撞,但依然有防穿透功能,而且性能更好。selfCollision 的节点,其表面应至少有 NONCOLLIDABLE 三角形以实现基础碰撞避免。例如排气管就会用 NONCOLLIDABLE 三角形。BreakGroup 可以被写成一个表格(table),当 breakGroupType 设置为 1 时,意味着只要其中任意一个 breakGroup 被触发,该 beam 就会断裂。
这对于支撑梁(support beams)非常有帮助。例如,如果你的前车门和后车门之间有支撑梁,希望当任意一扇门断裂时支撑梁也能随之断裂,就可以这样设置。
轨道(rails)和扭杆(torsionbars)并不能像你想的那样直接使用 breakGroups。要正确使某条轨道的链接断裂,需要断开连接该轨道节点之间的 beam。要让扭杆断裂,则必须断开连接其两个相邻节点的 beam。
通常,最好的方法是设置一个“虚拟 beam”(dummy beam):没有弹簧或阻尼(spring/damp),变形和强度(deform/strength)都设置到最大,带有 disableMeshBreaking 和 disableTriangleBreaking 属性,并挂上你希望关联的 breakGroup(可以是多个),将其设置在扭杆或轨道的两个节点之间,并把 breakGroupType 设为 1。这个 beam 只负责让轨道/扭杆断裂,不会带来其它副作用。
有时你可能希望在结构边缘增加节点密度,比如防止掉落物直接掉在边缘时发生穿透。你可以通过轨道(rails)和滑动节点(slidenodes)实现这一点,同时不会影响结构的变形。
以下是为获得最佳变形表现和性能而添加碰撞滑动节点(collision slidenodes)的详细流程:
NONCOLLIDABLE(不可碰撞)三角形,就像正常 Jbeam 一样操作,但不考虑结构节点三角形的存在。这样防穿模系统便能对这些滑动节点起作用,防止其卡死,同时不会因增加碰撞三角形而影响性能。
建议在临时移除结构三角形后再添加这些不可碰撞三角形,这样调试工具的可视化效果会更清晰,便于操作与检查。
本节包含一些关于在 Jbeam 中定位视觉零件(Flexbody、Prop)的小技巧。
对于聚光灯(spotlight)和点光源(pointlight)类 prop,推荐优先使用可选参数 baseTranslationGlobal 替代默认的 baseTranslation,baseRotationGlobal 替代 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"}],
],
当使用通用的 flexbody,例如越野灯时,通常需要让其绕多个轴旋转,以便准确对齐整个 3D 模型。
你可以直接在 Blender 中设置好旋转。导入你需要使用的部件,摆放好位置,把旋转系统切换为 ZXY Euler,旋转网格体,然后将旋转的结果直接复制到 Jbeam 文件中使用即可。
本节内容用于发现和解决常见的问题。
有时检查所有已经发生过变形的 beam 非常有用。方法如下:在车辆配置器(Vehicle Configurator)的 Debug 标签页中:
DeformationRange Max 输入框旁边的开关Use Inclusive Range这样会高亮所有已经变形的 beam,并在控制台打印相关信息。
beam 应力过大往往是结构问题的征兆,例如节点和三角形穿插、slidenode 未对齐、beam 预压等。正确检查车辆应力的方法如下:
在结构稳定的 Jbeam 下,结果应类似如下示意。极少数 beam 有应力,且主要集中在悬挂、轮胎和可开启件的锁扣上。
在结构不稳定时,会明显看到某些区域应力较大。这说明这些区域附近需要修复。可以打开节点名称可视化,定位具体出问题的节点。常见检查点包括:
flexbody 在载入时不停抖动,通常意味着某处弹簧或阻尼值相对于节点质量设置过高。可以通过节点受力调试可视化定位具体问题点。出现最大/最多不稳定力的区域最可能是问题来源。那些大小/方向变化不剧烈的稳定受力可以忽略(通常由 coupler 引起)。
注意,虽然大多数情况下 beam 应力和节点受力调试可以互换使用,但对于重量大且刚性高的车辆,这两者结果会十分不同,因为受力随着节点质量而变化,而应力不会。
对于重且硬的车辆,节点受力调试会在承重节点周围产生大量误报。
与此同时,beam 应力调试行为则更接近普通车辆——区别在于原本就有高应力的 beam(比如轮胎结构)会被放大,更难一眼发现真正的问题。
因此对于这类车辆,建议两种模式都检查一遍,确保没有遗漏实际问题。
某些细长结构、质量大部分集中于末端(比如校车的长杆后视镜)天生会出现难以解决的摆动问题。以下是改善的方法:
如果你的 Jbeam 在 CPU 端存在性能问题,可以参考本节内容。
大型轮胎需要在拥有足够好的碰撞检测(避免穿模,能够顺利碾压其他车辆或道具)和较高的 CPU 性能之间取得平衡,因为它们很容易成为整辆车中最消耗性能的部分。 可以调整许多轮胎参数以达到理想的平衡,例如:
selfCollision,如果你不在意轮胎与车辆本体不产生碰撞的话可以关闭numRays 控制轮胎节点密度。更少的射线意味着更好的性能,但滚动阻力更大且更容易穿模wheelAngle 针对双胎(dually wheels)- 通过合适的设置可以减少 numRaystriangleCollision - 当你的轮胎足够大到可以碾过其他车辆时应开启,但非常消耗性能hubSide1TriangleCollision、hubSide2TriangleCollision - 如果你的车辆轮胎被击中的概率小于轮毂,可以关闭;也可以只在某一侧开启,或只针对内侧双胎启用enableTireLbeams - 如果车辆有很多轮胎,禁用可提升性能,但会大大增加滚动阻力且难以解决通常可以采取的折中方案是启用 selfCollision,对双胎轮适当减少 numRays,关闭 hubSide1TriangleCollision 和 hubSide2TriangleCollision,其它参数按车辆需求针对性调整。
双胎轮也可以作为单个宽轮胎构造。这样能极大提升性能,但有很多缺点,因此只推荐用于拖车等轮胎不驱动、不会直接碰撞前方物体的场合。
如果一个三角形的两侧 10cm 范围内没有任何可能与其碰撞的节点(如无 selfCollision、分属不同 group、无 coupler 等),它会进入“休眠模式”,从而提升性能。当存在许多这样的三角形时,提升幅度非常可观。
优化大型封闭结构(比如货箱/拖车内饰)时应牢记此特性。例如,在干货厢拖车内部,为了利用这一机制,货物通常会悬浮在地板上方。
体积很小且节点密集的结构(如越野灯),理想情况下应使用 NONCOLLIDABLE 类型三角形替代 NORMALTYPE 类型的。
因为可碰撞三角形在其 50cm 范围内没有节点时不会额外影响性能,但每有一个节点靠近就会带来性能消耗。当每个三角形附近节点数量很多时,影响尤为严重。因此在节点密集区域,三角形应为 NONCOLLIDABLE。
NONCOLLIDABLE 三角形也可以用于有较大碰撞间隙的部件(如栏杆),这样碰撞只依赖节点检测,三角结构仅用于防穿模。
如果一个节点在行驶时与三角形发生穿模(即距离小于2.5cm并产生碰撞),会不断触发碰撞事件。如果全车有很多类似节点,将极大拖慢性能。
原则上,节点与三角形的最小安全距离应为 3cm,若是特别柔软的零件则建议 3.5cm,以留出裕度。可以使用节点三角形自碰撞检测器
定位此类节点。
使用 deformGroups 时,请记住 deformationTriggerRatio 才是消耗性能的属性,本身 deformGroup 并不会影响性能。务必确保没有多余的地方外泄了 deformationTriggerRatio 参数!可以通过 beam 调试模式检查。
注意,deformGroups 不只是在达到阈值时才触发,在 beam 断裂时也会触发。因此,尽量让 deformGroups 关联到 beam 断裂的时机,这样更节省性能。
静态碰撞对地图物体的性能消耗远大于对高度图的(地形)的消耗。因此,若车辆经常需要碾压地图中的物体(如岩石),比在普通贴花道路上更需要减少车底的节点密度。这也是为什么攀爬车腹板(skidplate)节点数较少的原因。
有些结构对于平面 Jbeam 来说过厚,但若进行完整的三维碰撞又太消耗性能(参考上文的不可碰撞三角形),比如卡车上的扁平矩形后视镜。要想实现场地精准碰撞但无需动态碰撞时,可以将部分节点的 collision 和 selfCollision 关闭,仅开启 staticCollision,且这些节点不附着三角形。这样特别是在这些节点靠近其它配件三角形时能有效提升性能。
这篇文章对你有用吗?