本指南的目标是在向你展示 JBeam 基础知识的同时,造一辆可以在 BeamNG 中正常驾驶的汽车。
这个指南会教你制作一个简易箱式底盘,适用于赛车和更简易的载具。
它还将向你示范如何将各种部件安装到车架上,并把他们的刚性调到最强。
最后,它将向你示范如何为额外的覆盖件创建 JBeam,包括像引擎盖这样的平面板。
本指南假设你具备一定的建模基础知识,并能够建模一个简单的赛车车身。所附模板包含悬挂和动力总成组件,但你需要自行建模车架和车身。
上手 JBeam 的最佳方式之一是使用原版车辆的悬挂和动力总成制造一台简易的管阵车架汽车。
这能让你无需从头开始创造复杂的动力总成和悬挂系统就能拥有一辆能驾驶的车。
悬挂系统尤其容易出错,导致操控不佳。悬挂涉及更高级的 JBeam 概念,并且还要考虑现实中的悬挂设计参数,因此有很多需要学习的内容,也有很多可能出错的地方。如果你对 JBeam 有一定了解的话问题不大,但对于初学者来说可能会很棘手,并导致车辆操控性不佳。
至于为何选择管阵车架,主要是因为它们通常具有相当均匀的刚性,这意味着它们的JBeam可以做成简单的三节点宽箱形结构。我们稍后会详细讲解这一点。
这就引出了我们的项目,使用Autobello的悬挂和动力总成来打造一辆组装车。这种配置被用于许多不同类型的组装车,包括沙滩车、各种汽车的仿品等。这在像Formula Vee一样的古期系列赛和沙漠赛车系列的入门组别中也是一种非常常见的配置。
1969年纽伯格林赛道的Olympic Formula Vee赛车 - 作者:Lothar Spurzem - 许可协议:CC BY-SA 2.0 de
Ruska Buggy B1 Modified - 作者:RuskaBuggy - CC-BY-SA-3.0 协议
本指南旨在涵盖相对常用的知识,并帮助学习制作 JBeam 的工作流程。任何使用大众风格悬挂和动力总成的车辆都可以通过本指南复现,不过碰撞形变是相当基础的。
初上手一定要确保项目足够简单,以便在相对较短的时间内完成。能驾驶你自己的mod是个很好的动力。当你完成本教程后,没有什么能阻止你向项目中添加更多东西。
本教程介绍了模板的使用。它包含所有所需的基础 JBeam 部件,包括悬挂、引擎,以及用于车架和覆盖件的模板。
新建文件夹是你在BeamNG里造车的第一步。 首先在 : %localappdata%\BeamNG.drive\当前游戏版本\mods\unpacked 当前游戏版本 是最新完整游戏的版本号, 0.22.1.0 则是在: %localappdata%\BeamNG.drive\0.22\mods\unpacked. 你可能需要自己创建unpacked文件夹。
这个新文件夹将成为模组的根目录。它应该有一个生动且独特的名称,因为它不能与repo中的其他模组重名,以避免冲突。强烈建议在文件夹名称中加入你的用户名。在该文件夹内,你需要一个“vehicles”文件夹,BeamNG会将其识别为包含车辆或道具的文件夹。然后在该文件夹内,再创建一个与根目录同名的文件夹,该文件夹将包含车辆的所有文件。文件夹结构应如下所示。
你现在可以将教程文件和你的 .dae 模型一起拖入文件夹。
为了在使用教程制作车辆时有更多的自由,我包含了一套越野组件,以防你想制作一辆更偏向越野的车辆。它们与原版Autobello的越野悬挂相同。要使用这些组件,只需将“OPTION OFFROAD”文件夹中的JBeam文件和DAE文件复制过来,并粘贴到你刚创建的文件夹中,替换基础模板中包含的文件。至于模板的blend文件,请使用“OPTION OFFROAD”文件夹中的文件,而不是教程模板根目录中的文件。
在 BeamNG 中制作模组的第一步都是为其创建模型。车辆模板包含一个 Blender 文件,其中包含所有悬挂和动力总成组件,以方便你使用,同时还包括一些基础材质。不过,你仍然需要自己建模车架和车身。关于为 BeamNG 制作汽车模型的更多信息,请参阅 模型制作准则 .
模型的方向应该遵循游戏的坐标系统:正X = 左,正Y = 后,正Z = 上。
关于它相对于 Blender 原点的位置,最佳做法是让它在 X 轴上完全居中,Y 轴上大致居中,Z 轴中心稍微偏上,如果可能的话,使所有 Z 坐标为正值。
所有材质都是单色纹理,没有法线贴图,这应该足以让你上手了。
在附带的文件包中,你可能会注意到有许多“ .JBeam ”文件。这些文件定义了你的车辆,包括物理结构、各种组件等。 当游戏加载你的车辆时,它会加载所有这些文件,因此你可以将车辆拆分成任意数量的文件。一般规则是,单个文件中应该只包含相关的零件,这样在进行微调和排障时更容易找到对应的组件。与制作模组的其他方面一样,你可以参考游戏原版车辆来获取灵感。
这里有一些链接,可以帮助你理解在 beamNG 中打造一辆车所需的一些基础知识。
关于语法,需要记住 JBeam 是以带有表头的表格形式设置的,并且使用括号来定义表格的各个层级。缺少括号和表头是常见的问题,可能导致车辆无法加载。
关于 JBeam 形状的一般规则是,它只需要足够贴合基础模型的形状,以便实现良好的碰撞和变形效果。
这意味着 JBeam 所需的精确度通常远低于一些人想象的那样。这里以 Blackpool Superlite 为例。
你可以看到,JBeam 是一个相对简单的三节点宽的盒子结构,大致贴合车身形状。虽然这确实会产生一些不准确性,但在实际使用中已经足够接近,不会成为问题,同时也使 JBeam 结构更简单,更容易调整。
JBeam 的密度需要巧妙的取舍,有足够的节点才能让物体正确弯曲和变形,同时又不能有太多节点,否则就很难恰当得微调你的 JBeam。
通常对于一般汽车来说,3-4个节点的宽度效果相当好,纵向的节点密度也应类似。随着经验的积累,你会更善于判断这个比例。你也可以拿原版车辆作为参考。
不要有过多的节点非常重要,所谓的“重量预算”限制了在对应节点数量下汽车重量的下限。在讨论 JBeam 不稳定性时,我们会更详细地说明这一点。更多的节点也意味着更多的梁,这会使 JBeam 从根源上更难制作和调整。
这是一个关于节点密度影响变形的示例。
在学习 JBeam 时,让你的第一个项目足够简单很重要。制作形变良好的公路车是个庞大的工程,并且需要对 JBeam 有很好的理解以及大量的微调,这可能会让初学者感到气馁。
请记住,在制作 JBeam 时,大约有 50-75% 的工作是微调,例如添加/移除特定的横梁和调整属性。因此,在建造过程中保持你的 JBeam 整洁有序非常重要。
这就是为什么通常建议使用增强型文本编辑器,例如 Visual Studio Code 且安装上 官方JBeam插件 , 并使用 游戏内调试工具 可视化编辑。为了让初始设置时更方便,你仍然可以在 Blender 中设计结构,然后复制粘贴生成的节点坐标。
构建车架的节点-梁结构的第一步是对你想如何构建有一个大致的想法。虽然我们不使用 Blender 导出器,但在 Blender 中绘制你的 JBeam 是一个不错的主意。这也可以为你制作 JBeam 时提供准确的节点位置。
这是一个简单的例子 :
在设计JBeam时,经验相当重要,但如果你遵循前面列出的指南,通常不会遇到重大问题。
你的结构不需要像你想象的那样精确。主要是能够合理地碰撞和变形就可以。
如果节点可以同时作为结构元素和悬挂/转向部件的连接点,这可以有助于简化结构。例如这里,这个节点既用作车架 JBeam 的主要结构,也用作于减震器支架。
每个节点都用“fr”作为前缀,表示该节点属于车架的一部分。数字对应它在 JBeam 结构中所处的“行”。后缀则告诉我们它在这一行中的位置。“t”用于主箱体结构的顶部,“s”用于侧舱梁,“h”用于防滚架结构。最后一个字母表示它位于底盘的左侧还是右侧。
你可以按自己的喜好命名,最重要的两个规则是必须让自己能看懂,并且在命名时应有使用 l/r 后缀的“对称性”。当你的底盘宽度超过 3 个节点时,你可以加入 rr/ll 等更多内容。像处理任何 JBeam 相关内容一样,原版车辆可以是一个很好的灵感来源。
"nodes":[
["id", "posX", "posY", "posZ"],
{"selfCollision":true},
{"collision":true},
{"nodeMaterial":"|NM_METAL"},
{"frictionCoef":0.6},
{"group":"FormulaBeeSpaceframe"},
{"nodeWeight":3.0},
["node1", 0.00, 0.00, 0.00],
{"group":""},
],
第一行是表头,它必须一直存在,否则你会遇到报错。接下来的几行通常总是放在开头,以避免 JBeam 受到其他 JBeam 文件中“泄漏”参数的影响,但根据实际情况需要,它们也可以在节点部分的其他位置使用。
有关它们各自功能的更多信息,您可以查看 节点 页面。
下一步是逐一创建节点,使用我们之前在 Blender 中设计的虚拟 JBeam 的坐标。你不需要精确到最小的小数,精确到小数点后三位对于大多数用途来说已经足够了。
然后点击任意节点。你应该会看到类似的界面。请确保零件的原点也居中了,否则坐标会有误差。
在创建节点时,将节点切分成“段落”可能会很有趣,并使用注释来帮助理解每个部分的用途。
另一个有用的技巧是广泛使用复制粘贴。例如,如果我们取组成单行“楼层”的节点,它们除了前缀和 X 坐标外都是相同的,其中心节点的 X 坐标为 0,右侧节点的 X 坐标为负值。这意味着我们可以先制作左侧节点,然后复制粘贴,只调整需要更改的部分。
你的节点部分大致应该是这样的。
"nodes":[
["id", "posX", "posY", "posZ"],
{"selfCollision":true},
{"collision":true},
{"nodeMaterial":"|NM_METAL"},
{"frictionCoef":0.6},
{"group":"FormulaBeeSpaceframe"},
{"nodeWeight":2.0},
//Floor
["fr1l", 0.294, -1.311, 0.205],
["fr2l", 0.416, -0.805, 0.205],
["fr3l", 0.465, -0.298, 0.205],
["fr1", 0, -1.311, 0.205],
["fr2", 0, -0.805, 0.205],
["fr3", 0, -0.298, 0.205],
["fr1r", -0.294, -1.311, 0.205],
["fr2r", -0.416, -0.805, 0.205],
["fr3r", -0.465, -0.298, 0.205],
{"group":""},
],
下一步是定义车辆的参考节点,这些节点被游戏用来定义汽车的朝向和基本尺寸,以及摄像机的位置。更多有关信息可以查看 参考节点 页面
节点之间完美对齐非常重要。如果你的节点没有正确对齐,你可能需要调整一些节点以使它们正确对齐。“Up:” 节点通常是最容易出现问题的,在一些原版汽车上,会专门创建一个“upref”节点来解决这个问题,但对于像这个项目这样拥有方形车架的汽车而言,通常可以避免使用该节点。
与节点一样,梁也有一些设置项,通常在开头时进行设置,以避免梁受到其他组件中设置的参数影响。
"beams":[
["id1:", "id2:"],
{"deformLimitExpansion":1.2},
{"beamPrecompression":1, "beamType":"|NORMAL"},
{"beamSpring":1201000,"beamDamp":150},
{"beamDeform":50000,"beamStrength":"FLT_MAX"},
],
如想了解更多信息,请参阅 梁(Beams) 页面
创建梁相当简单,只需指定两个节点,梁就会出现在它们之间。
与节点一样,建议将梁分成若干部分,这样以后更容易进行微调。比如按区域和方向进行分割。例如底板中的所有纵向梁作为一个部分,底板中的横梁作为另一个部分,等等。
与节点一样,你可以大量使用复制粘贴功能。“替换”功能也可以经常使用。例如,在制作纵向底板梁时,你可以先写出左侧的梁,然后复制粘贴,并将“l”后缀替换为“r”,用于右侧。
请注意,在这个阶段,即使你还没有完成梁的创建,你也应该能够加载汽车并使用调试视图来查看需要添加梁的位置。不过请记住,整个结构可能在生成时倒塌,使用 J 键暂停物理可能会很有用。
要在游戏中查看节点和梁,请使用 调试模式 . 您可以使用键盘快捷键在不同模式之间切换:Ctrl + M 用于节点可视化,Ctrl + N 用于节点文本,如名称和位置,Ctrl + B 用于梁的可视化。您可能还会发现用于三角形可视化的 Ctrl + T 在之后很有用。
每次你在 JBeam 文件中保存更改时,你可以在游戏中按 Ctrl + R 来更新 JBeam。更多详细信息请查看下一节。
制作梁是一个相当耗时的步骤,但保持梁整洁非常重要,以确保之后可以轻松修复和调整结构。 不要忘记按照图示正确的支撑结构 基本准则 . 如果结构在生成时摇晃,可能需要在移动的方向上增加更多支撑。
你可能会遇到不稳定的问题,表现为游戏在生成结构后不久自动暂停,或者是没那么夸张的情况,结构震动剧烈。这些通常是由某些梁的 beamSpring 和/或 beamDamp 设置过高,或某些节点的 nodeWeight 设置过低引起的。为了找出具体导致问题的节点,可以切换到节点的“力”可视化模式,并在慢动作下观察大的红色力峰值。慢动作可以在“环境”菜单中使用,或者按 Alt + Up 启用。
你的梁部分应类似于这个示例。
"beams":[
["id1:", "id2:"],
{"deformLimitExpansion":1.2},
{"beamPrecompression":1, "beamType":"|NORMAL"},
{"beamSpring":1201000,"beamDamp":150},
{"beamDeform":50000,"beamStrength":"FLT_MAX"},
//floor
//length floor
["fr1l","fr2l"]
["fr1","fr2"]
["fr1r","fr2r"]
//lat floor
["fr1l","fr1"]
["fr1","fr1r"]
//cross floor
["fr1l","fr2"]
["fr1","fr2l"]
["fr1r","fr2"]
["fr1","fr2r"]
],
三角形的两个主要用途是允许车辆之间发生碰撞,以及产生空气阻力。
与其他部分一样,车架模板应该已经有一个带标题的“三角形”部分。
"triangles": [
["id1:","id2:","id3:"],
{"dragCoef":10},
{"groundModel":"metal"},
{"triangleType":"NORMALTYPE"},
["node1","node2","node3"]
],
有关每个属性作用的更多信息,请查看 triangles page.
在创建三角形时,应该先加载出你的车,这样可以在操作过程中可视化你的进度。更改并保存文件后,你可以按 Ctrl + R
制作三角形是指以逆时针顺序取三个节点。例如,这里我们有 fr3sr->fr3tr->fr4tr.
然后对车架上的每个表面重复此操作。下面是几个三角形应该看起来的示例。
"triangles": [
["id1:","id2:","id3:"],
{"dragCoef":10},
{"groundModel":"metal"},
{"triangleType":"NORMALTYPE"},
["fr1", "fr1r", "fr2r"],
["fr1", "fr2r", "fr2"],
["fr1l", "fr1", "fr2"],
["fr1l", "fr2", "fr2l"],
["fr2l", "fr2", "fr3"],
["fr2l", "fr3", "fr3l"],
],
"flexbodies":[
["mesh", "[group]:", "nonFlexMaterials"],
["TutoFBee_Spaceframe", ["FormulaBeeSpaceframe"]],
["TutoFBee_Body", ["FormulaBeeSpaceframe"]],
],
接下来你需要修改的部分是文件顶部附近的柔体部分,这些将用于汽车实际可见的模型。有关柔体各种属性的更多信息,你可以查看 柔体 页面。
柔性体需要定义一个 组,该组在节点部分中被引用。柔体会映射到与其具有相同组的节点,因此请确保使用与之前在节点部分中相同的组名。
不可拆卸的车身覆盖件可以使用与车身本身相同的组,这样就不需要为它们添加带有不同组的单独节点。
此时,你应该已经准备好在游戏中生成你的汽车了。
如果您遇到任何问题,请查看 常见问题 页面
在这一步,由于汽车还无法行驶,你需要注意的主要事项是确保模型显示正确,并且没有明显的结构刚性不足或振动问题。
如果看起来都没问题,你就可以进入下一点了。
每个组件或节点总共有6个自由度,这指的是它们的运动方式。这些自由度包括在三个轴上的平移以及围绕三个轴的旋转。如果你希望一个组件牢固地固定在底盘上,就必须“锁定”所有6个自由度。
固定一个组件的旋转是通过连接该组件的某些节点来实现的。 如果你只连接一个节点,该部件在平移方向上将被固定,但可以绕任意轴旋转。
如果你连接两个节点,该零件将可以沿由这两个节点形成的轴旋转。这对于像门、悬挂等组件非常有用,因为这些部件的移动是可取的,但需要受到限制。
如果你连接三个或更多节点,零件将不会围绕任意一个轴向旋转。这将是本节中所有组件所期望的结果。
同时请记住,在某些情况下,尤其是车身覆盖件,你可能希望零件在生成时是完全固定的,但在只有两个节点相连的地方断开。以车门为例就很明显,门闩起到了“第三个连接”的作用,当门闩断开时,门就可以旋转。我们将在本指南后面详细介绍这一点。
要固定一个节点的位置,你至少需要三根梁,实际上就是每个移动轴各一根。
当结合前一节中所述的足够数量的连接点时,这应该可以实现一个固定牢固的组件。
请注意,这三根梁不必完全彼此垂直;但它们仍应大致保持垂直。
如果用于固定节点的“三脚架状”结构过窄,会导致梁上应力更大,从而使结构实际上不够稳固。同样,如果三脚架过宽,会导致节点更容易出现“反转”。
这在门闩上很容易犯错,有些人只使用一根非常短的梁将门连接到柱子上,导致门摇晃不稳。正确的方式是使用梁将门连接到车身的更中心位置,比如变速箱通道。
更直白的例子是,我们可以看一下Superlite的车头锥和防止其向后移动的梁。如果你像红色示意那样做非常短的梁,哪怕车头锥有一点点移动,这些梁会产生角度,无法有效阻止车头锥向后移动。相反,你需要使用像紫色示意那样的梁,它们的长度足以避免这个问题。
现在让我们运用所学的知识,将悬架组件和动力总成安装到车架上。在所有情况下,我们都将在这些组件的 JBeam 文件中进行操作。文件中有一个预定义的区域,包含正确的参数,你可以在其中放置你的梁。
//底盘连接
{"beamPrecompression":1, "beamType":"|NORMAL"},
{"beamSpring":1501000,"beamDamp":150},
{"beamDeform":30000,"beamStrength":"FLT_MAX"},
//在此处添加连接梁
{"beamPrecompression":1, "beamType":"|NORMAL", "beamLongBound":1.0, "beamShortBound":1.0},
在制作用于连接不同组件的梁时,它的工作方式与制作任何梁相同。只要两个节点存在于车辆中,游戏就会创建一根梁,即使这些节点定义在不同的文件中。
模板所含的悬挂梁和转向装置几乎是自成一体的,因此只需要将其牢固地固定在底盘上。
最重要的部分是使用在行驶时不会位移的节点,比如横梁上悬挂摆臂的安装点,即 fx1l/r 和 fx2l/r。
如前所述,对于每一个这样的节点,你应该至少有 3 根横梁,使悬挂在三个轴上都保持稳固。
这是一个可能类似于你添加的横梁的示例。
//底盘连接
{"beamPrecompression":1.0,"beamType":"|NORMAL", "beamLongBound":1.0, "beamShortBound":1.0},
{"beamSpring":1501000,"beamDamp":150},
{"beamDeform":30000,"beamStrength":"FLT_MAX"},
//在此处添加连接梁
["fx1r","fr2r"]
["fx1r","fr1"]
["fx1r","fr1tr"]
["fx2r","fr2r"]
["fx2r","fr1"]
["fx2r","fr1r"]
["fx1l","fr2l"]
["fx1l","fr1"]
["fx1l","fr1tl"]
["fx2l","fr2l"]
["fx2l","fr1"]
["fx2l","fr1l"]
后悬挂的悬挂硬点节点已经预设好,就像前悬挂一样,这些节点只需要稳固地固定到车架上即可。
然而,绞牙减震器需要进行改造才能将它们固定到车身上。
对于悬挂摆臂,流程与前悬挂相同,不过这一次我们使用的节点是拖曳臂的硬点节点,分别是 bx1r/l 和 bx2r/l。
如果你向下滚动到“TutoFormulaBee_coilover_R_race”组件,你应该会看到一个包含很多东西的梁部分。
"beams": [
["id1:", "id2:"],
//后弹簧 - 无软缓冲 - 高级减震器
//运动比约为0.74
{"beamType":"|NORMAL"},
{"beamDeform":12000,"beamStrength":140000},
{"beamSpring":"$spring_R","beamDamp":0},
["rh4r","fr5tr", {"precompressionRange":"$=($springheight_R + 0.01)*0.74"}],
["rh4l","fr5tl", {"precompressionRange":"$=($springheight_R + 0.01)*0.74"}],
//rear dampers
{"beamPrecompression":1, "beamType":"|BOUNDED", "beamLongBound":1.0, "beamShortBound":1.0},
{"beamLimitSpring":0,"beamLimitDamp":0},
{"beamSpring":250,"beamDamp":"$damp_bump_R"},
["rh4r","fr5tr", {"beamDampRebound":"$damp_rebound_R","beamDampVelocitySplit":0.2,"beamDampFast":"$=$damp_bump_R / 3","beamDampReboundFast":"$=$damp_rebound_R / 3","dampCutoffHz":500,
"soundFile":"event:>Vehicle>Suspension>car_vint_sml_01>spring_compress_01","colorFactor":0.8,"attackFactor":10,"volumeFactor":2.4,"decayMode":1,"decayFactor":10,"pitchFactor":0.4,"maxStress":13}],
["rh4l","fr5tl", {"beamDampRebound":"$damp_rebound_R","beamDampVelocitySplit":0.2,"beamDampFast":"$=$damp_bump_R / 3","beamDampReboundFast":"$=$damp_rebound_R / 3","dampCutoffHz":500,
"soundFile":"event:>Vehicle>Suspension>car_vint_sml_01>spring_compress_01","colorFactor":0.8,"attackFactor":10,"volumeFactor":2.4,"decayMode":1,"decayFactor":10,"pitchFactor":0.4,"maxStress":13}],
//bumpstop and extension limiter
{"beamSpring":0,"beamDamp":0},
{"beamLimitSpring":251000,"beamLimitDamp":5000},
["rh4r","fr5tr", {"longBoundRange":0.12,"shortBoundRange":0.12,"boundZone":0.04,"beamLimitDampRebound":0,"dampCutoffHz":500}],
["rh4l","fr5tl", {"longBoundRange":0.12,"shortBoundRange":0.12,"boundZone":0.04,"beamLimitDampRebound":0,"dampCutoffHz":500}],
{"beamLimitSpring":0,"beamLimitDamp":0},
{"beamPrecompression":1.0, "beamType":"|NORMAL", "beamLongBound":1, "beamShortBound":1},
],
虽然这一开始可能看起来有些令人畏惧,但本质上它只是6根梁,附加了许多属性。一组代表弹簧,一组代表阻尼器,另一组作为限位缓冲器。在所有情况下,你应该会看到这两个节点引用,rh4r/l 是摆臂上的减震器支架,bs1r/l 是autobello的上减震器支架。
["rh4r","bs1r", {"precompressionRange":"$=($springheight_R + 0.01)*0.74"}],
["rh4l","bs1l", {"precompressionRange":"$=($springheight_R + 0.01)*0.74"}],
你需要做的是将 bs1r/l 替换为你将用作上方减震支架的节点。
为了确保良好的操控性,上减震安装位置应在摆臂上的减震安装位的正上方或稍微靠前一些。
节点位置不正确会导致悬挂实际上过于柔软,造成操控的“船感”增加。
在完成了这些更改后再生成车辆时,你可能会注意到一个问题;减震器并没有出现,即使它们的梁显示出来了。
此问题与减震器节点组有关。
"flexbodies":[
["mesh", "[group]:", "nonFlexMaterials"],
["autobello_coilover_R", ["shockbottom_R", "shocktop_R"]],
],
虽然“shockbottom_R”组已经存在,并且由悬挂摆臂的下减震安装节点定义,但你需要将上减震安装节点定义为属于“shocktop”节点组。最好的方法是将shocktop变形组“一致”添加到减震安装节点中,如下所示:
["fr4tl", 0.34, 0.655, 0.645],
["fr5tl", 0.454, 1.034, 0.556, {"group":["FormulaBeeSpaceframe","shocktop_R"]}],
["fr6tl", 0.384, 1.627, 0.457],
请再三检查语法,以避免在尝试加载汽车时出现问题。
一旦你将其添加到两个减震器支架上,重新载入车辆时,绞牙避震器应该就会显示出来。
发动机通常可以通过两种方式安装。第一种方法对于JBeam是立方体形状的发动机来说很简单,就是将四个顶部角牢固地固定到底盘上。
但在我们的情况下,我们将使用预定义的发动机安装节点,即发动机侧的 em1r/l,以及变速箱侧的 “tra1”。这种方法更真实,也更类似于现实中固定发动机的方式。
根据你的车架设计方式,每个发动机安装点可能需要 3 根或 4 根梁才能将发动机稳固固定。
//底盘连接
{"beamPrecompression":1, "beamType":"|NORMAL"},
{"beamSpring":1501000,"beamDamp":150},
{"beamDeform":30000,"beamStrength":"FLT_MAX"},
//在此处添加连接梁
["em1r","fr6r"]
["em1r","fr5r"]
["em1r","fr5l"]
["em1r","fr4r"]
["em1l","fr6l"]
["em1l","fr5l"]
["em1l","fr5r"]
["em1l","fr4l"]
对于变速箱来说,由于发动机支架节点已经负责防止发动机前后移动,支撑梁主要需要以防止发动机/变速箱组件前后晃动的方式进行布置。
//底盘连接
{"beamPrecompression":1, "beamType":"|NORMAL"},
{"beamSpring":1501000,"beamDamp":150},
{"beamDeform":30000,"beamStrength":"FLT_MAX"},
//在此处添加连接梁
["tra1","fr4t"]
["tra1","fr4l"]
["tra1","fr4r"]
你可能已经注意到 JBeam 文件中有一个“油箱”文件。包含的文件已经能作为油箱使用,尽管它没有任何节点和梁。但是,为了练习,你应该尝试用你在教程前面学到的知识,将自己的油箱建成一个 8 节点的立方体。
唯一的变化是,你应该将其中一根梁标记为“燃料梁”,这样油箱的重量会根据油箱中的燃料量变化。
这可以通过“一致”添加一些属性来实现,就像在减震顶部节点组中那样。
["f1r", "f1l",{"name":"fuelTank","containerBeam": "fuelTank"}],
此时,如果你按照指南正确操作并且车辆成功加载,你应该有一辆完全可驾驶的汽车,具备转向和悬挂功能。接下来是有趣的部分,即确保一切正常工作,并且不会出现不应有的弹性变形。
在所有情况下,调试的最佳工具是慢动作功能和梁的调试菜单中的应力视图 Ctrl + B.
第一部分是确保所有部件至少在某种程度上是刚性的。要检查这一点,只需驾驶车辆四处走动,看看是否注意到任何意外的移位。如果发现有异常情况,尝试确定零件的移动方向,并添加或调整横梁以抵消这种移动。
一旦悬挂系统基本上是刚性的,就该进行压力测试,并尝试确保它也能应付更加激烈的驾驶。
先从后悬挂开始。检查任何有动力的车轴是否正常工作的最佳方法是进行墙壁定点烧胎测试,本质上就是将车头靠在墙上并进行烧胎。
如果你看到任何振荡,请切换到慢动作模式,观察哪些节点在移位以及移动的方向。
你需要通过更改/添加梁来使这些节点刚性化,从而更牢固地限制它们在该方向上的移动。虽然提高梁弹簧(beamspring)也可以有所帮助,但模板中预设的梁弹簧和阻尼值大致是正确的,你应优先调整 JBeam 的拓扑结构,因为仅通过提高梁弹簧无法正确刚性化欠佳的 JBeam。
对于前悬挂,产生振荡的最佳方法是开到足够快的速度,然后踩刹车直到车轮锁死。再次提醒,如果有意料之外的振荡,可以使用慢动作模式和调试工具来找出引起这些变形发生的具体原因。
对于前悬挂而言,虽然指南中说使用 fx1r/l 和 fx2r/l 将悬挂梁连接到底盘,你可能需要添加更多的梁,将悬挂梁的节点连接到前悬挂的其他固定组件,即 fx1/2(位于悬挂中心)和 fs1r/l(用作减震器安装点)。
由于所有这些组件相对于底盘都是固定的,把这些梁和车架连接上可能有助于防止前悬挂震动和振荡,同时不影响悬挂的功能。
下一步是安装车身覆盖件。本指南涵盖了像引擎盖一样的平面板和类似鼻锥一样方一些的组件。不过,无论你手头有什么形状的覆盖件,都应该可以参考本指南操作。
所有覆盖件通常都包含可断开的连接,这样在碰撞时覆盖件可以脱落。
如果你有一个独立的组件,比如鼻锥,其形状可以很容易地转换为盒式 JBeam,除了之前提到的那些元素之外,制做 JBeam 的操作应该与你之前所做的非常相似。
如果你有一个相对平整的覆盖件,比如门、引擎盖、后备厢等,而无法使用之前使用的方形结构,则需要使用刚性节点。我们将在本节后面进一步讲解这一点。 请记住,即使是有一定深度的引擎盖(例如吉普的引擎盖),通常仍然需要使用刚性节点,因为它们的深度不足以确保结构在所有情况下保持刚性。
添加插槽和创建新零件 第一步是创建车身覆盖件所需的插槽和基础零件。在大多数情况下,它们都会位于“车架”下,因此我们先打开该文件,并进入“插槽”部分。有关插槽和零件的更多信息,你可以参考 部件/插槽系统介绍 , 和此 插槽和插槽类型章节 页面。
如果要向车架添加更多插槽,可以从复制粘贴插槽部分的标题开始,以便新增条目的数量与零件数量相同。例如有两个零件,它看起来会像这样:
"slots":[
["type", "default", "description"],
//Engine
["TutoFormulaBee_engine","TutoFormulaBee_engine", "Engine"],
["TutoFormulaBee_fueltank","TutoFormulaBee_fueltank", "Fuel Tank"],
//Running gear
["TutoFormulaBee_suspension_F","TutoFormulaBee_suspension_F", "Front Suspension"],
["TutoFormulaBee_suspension_R","TutoFormulaBee_suspension_R", "Rear Suspension"],
//Panels
["type", "default", "description"],
["type", "default", "description"],
],
然后你需要将所需的插槽名称放入“type”,将默认部件的名称放入“default”。你可以参考其他插槽的命名方式,包括像材质和网格一样使用前缀。对于默认的部件,虽然我们还没有创建任何部件,但对于只有一个选项的插槽,最好将其唯一的部件命名为与插槽相同的名称。
引擎罩和鼻锥的最终结果看起来会像是这样:
"slots":[
["type", "default", "description"],
//发动机
["TutoFormulaBee_engine","TutoFormulaBee_engine", "Engine"],
["TutoFormulaBee_fueltank","TutoFormulaBee_fueltank", "Fuel Tank"],
//传动系统
["TutoFormulaBee_suspension_F","TutoFormulaBee_suspension_F", "Front Suspension"],
["TutoFormulaBee_suspension_R","TutoFormulaBee_suspension_R", "Rear Suspension"],
//车身覆盖件
["TutoFormulaBee_nosecone", "TutoFormulaBee_nosecone", "Nose Cone"],
["TutoFormulaBee_hood", "TutoFormulaBee_hood", "Hood"],
],
下一步是创建零件本身的基础。为此,你可以查看 “TutoFormulaBee_panels.JBeam” 文件,其中包含新组件的模板。你需要多少零件就可以复制多少次。按照前面的示例则需要复制 2 次。在创建新零件时,确保复制整个零件,包括名称和结束括号。
创建好所需数量的副本后,修改零件的名称和插槽类型以匹配你之前创建的插槽。
大多数车身覆盖件的一个主要特性是它们在碰撞中能够脱落。可以通过使用“beamStrength”属性并赋予它一个非“FLT_MAX”的值来实现,这样当应力超过一定水平时,连接梁就会断裂。
然而,如前所述,每个连接点需要几根梁来确保其牢固且稳定。我们如何确保所有这些梁同时断裂呢?这就是断裂组的作用。断裂组会识别一组梁,并告诉游戏,如果这些梁中的任何一根断裂,那么组内的所有其他梁也应该同时断裂。
例如:
//连接梁体
{"beamDeform":15000,"beamStrength":15000},
{"breakGroup":"frontHood"},
["hood1ll","fr1l"]
["hood1ll","fr1"]
["hood1ll","fr2l"]
解决方法是使用我们所说的“刚性节点”,这是一个禁用碰撞的节点,位于距离表面一定距离的位置。
需要记住的一点是,将刚性节点与表面节点连接的梁的“beamDeform”应该低于构成覆盖件表面的梁。这将确保面板主要是会“折叠”变形,这也是在现实生活中会发生的情况。
制作引擎盖的第一步与制作车架上任何表面的方法类似。需要记住的一点是,面板最好至少是3x3个节点,以确保它们可以折叠在一起。
至于刚性节点,你可以先将其放置在距离表面0.5米的位置,然后根据需要进行调整。它还需要禁用碰撞,因为它在结构中并不是一个物理组件。这可以通过使用“collision:false”和“selfCollision:false”语句来完成。
"nodes":[
["id", "posX", "posY", "posZ"],
{"selfCollision":true},
{"collision":true},
{"nodeMaterial":"|NM_METAL"},
{"frictionCoef":0.6},
{"group":"TutoFBee_Hood"},
{"nodeWeight":2.0},
["hood1l", 0.177, -1.297, 0.564],
["hood1r", -0.177, -1.297, 0.564],
["hood2l", 0.167, -0.851, 0.7],
["hood2r", -0.167, -0.851, 0.7],
["hood3l", 0.115, -0.403, 0.838],
["hood3r", -0.115, -0.403, 0.838],
{"selfCollision":false},
{"collision":false},
["hood0", 0, -0.851, 0.3] //Rigidifier mod
{"selfCollision":true},
{"collision":true},
{"group":""},
],
对于梁来说,这通常相当简单,只需将JBeam的每个节点都连接到刚性节点即可。
//rigidifier
{"beamDeform":5000,"beamStrength":"FLT_MAX"},
["hood1l","hood0"]
["hood1r","hood0"]
["hood2l","hood0"]
["hood2r","hood0"]
["hood3l","hood0"]
["hood3r","hood0"]
对于与车身的连接,大多数面板通常在一端使用铰链固定,另一端使用锁扣固定。
这意味着你应当以两组断裂点的方式来设计你的连接梁。第一组是铰链,它会有两个连接点,这样当锁扣断裂时面板可以旋转。铰链组还应当是两组中最坚固的一组。
锁扣可以使用一个或两个连接点,具体取决于面板的形状和大小。它应当比铰链弱得多,以确保在碰撞中先断裂。
对于没有明显锁扣和铰链的面板,比如保险杠和螺栓固定的面板,你可以以任何看起来合理的方式分配各种连接点。一种常见的设置是将“引擎盖”面板的前后各固定为两组断裂点,一组用于前部,一组用于后部,但两组强度相同,因为它们实际上既不是锁扣也不是铰链。
//attach beams
{"beamDeform":15000,"beamStrength":15000},
{"breakGroup":"frontHood"},
["hood1ll","fr1l"]
["hood1ll","fr1"]
["hood1ll","fr2l"]
["hood1rr","fr1r"]
["hood1rr","fr1"]
["hood1rr","fr2r"]
{"breakGroup":"rearHood"},
["hood3ll","fr3l"]
["hood3ll","fr3"]
["hood3ll","fr2l"]
["hood3rr","fr3r"]
["hood3rr","fr3"]
["hood3rr","fr2r"]
{"breakGroup":""},
别忘了在末尾添加一个“breakGroup”:””,以确保随后出现的梁不会被包含在 breakGroup 中。请记住,属性会“泄漏”到其他部分,所以未终止的 breakGroup 可能会导致引擎在引擎盖脱落时分崩离析。
对于像鼻锥这样更方正的结构,制作 JBeam 相对比较简单,并不需要任何加固节点。你只需要构建盒状 JBeam 并通过断裂组将其附加到车体上即可。
和之前一样, 常见问题 页面应该能帮助解决很多你可能遇到的问题。
在车身覆盖件方面,需要特别注意的主要问题是零件在生成时受到挤压。请记住,每个节点都有一个影响范围,因此你可能需要将物体分开得比你想象的更远一些。
如果你已经按照本指南完成了全部步骤,你现在应该拥有一辆简单但可以完全驾驶的汽车。此时你可以尽情玩乐,并尝试给它添加其他东西,例如功能性的仪表/踏板,这些都是通过 物体 制作,额外的部件选择,涂装等等。
玩得开心,别害怕尝试新东西 :)和任何事情一样,看看别人做过的东西可以给你一些灵感,或者帮助你理解如何构建不同的事物。
这篇文章对你有用吗?