插槽(slot)和 slotType 部分用于定义一个组件在车辆部件树中的安装位置。如果你想了解部件和组件系统的基础知识,可以阅读 组件/插槽系统简介 。
每个部件也有一个 slotType,用于标识该部件在车辆中的安装位置,并允许多个部件作为相互替代的选项。一个特殊的slotType是 main,它代表车辆的“根”组件。
slots 部分根据 slotType 定义了哪些组件是该组件的“子组件”。
你可以在 Slots 部分使用可选参数,把参数传递给所选部件中的所有部分(以及所有其子部件,只要值没有被覆盖)。这通常配合 nodeOffset 和 nodeMove 参数使用,它们能给节点、柔体和道具应用偏移效果,从而将安装在目标插槽中的部件整体移动一段距离。
从 0.32 版本开始,你可以通过 Slots 部分将变量
的值传递给某个插槽,这种机制称为插槽变量(Slot Variables)。
这些值会被传递给安装在该插槽中的零件以及其所有子零件。它们的作用方式与在调校菜单中设置的变量值相同,但用户无法编辑这些插槽变量。你也可以传递字符串值,并可以将其与其他字符串进行拼接,例如作为节点名称的前缀。布尔值同样适用,配合禁用修饰符 ,可以根据零件所在的插槽启用或禁用 Jbeam 的某些部分。
这种机制可以让零件更易于复用,无需创建多个仅有细微差异的零件变体,可以通过变量来控制这些差异。
在 0.38 版本中,对插槽变量机制进行扩展,加入了特殊的命名空间变量
。这两个特定变量名为 $prefix 和 $suffix,用来简化语法。
变量名必须以 $ 符号开头。
示例用法:
["log_trailer_bolsters_R","log_trailer_bolsters_R","Rear Bolsters", {"variables": {"$bolster_offset":-0.39}}],
有两个特殊的命名空间变量,$prefix 和 $suffix,在子部件中不需要显式引用即可生效,从而简化了语法。
以下参数通常在 Slots 部分作为可选参数传递给节点(Nodes)、柔体(Flexbodies)和道具(Props)部分。这些参数会影响当前部件及其所有子部件,直到该值被重置为 0 为止。
下列参数名都可以加上一个单数字后缀(1-9)来决定顺序,例如:
"nodeRotate1": {"x": 0, "y": 0, "z": 45}
"nodeMove2": {"x": 0, "y": 0, "z": 0.2},
"nodeOffset3": {"x": 0.1, "y": 0, "z":0},
"nodeRotate4": {"x": 5, "y": 0, "z": 0}
带有较小顺序编号的操作会先执行。如果没有指定数字,则顺序与 0 相同。具有相同后缀的节点变换执行顺序为:nodeRotate、nodeOffset、nodeMove。如果父子插槽中出现相同后缀(或无后缀)的参数,则子插槽中的值会覆盖父插槽中的值。
节点变换为固有操作,这意味着平移和旋转均以之前已变换过的坐标系为基础。例如,"nodeRotate1": {"x": 0, "y": 0, "z": 45} 会让坐标系绕其 Z 轴旋转 45 度。随后,"nodeRotate2": {"x": 15, "y": 0, "z": 0} 则会让新坐标系再绕其 X 轴旋转 15 度。
x, y, z 角度、绕中心点 px, py, pz 进行旋转如果未定义旋转中心点,则旋转会以原点为中心。例如,\"nodeRotate\":{\"x\":-45, \"y\":0, \"z\":0} 的效果等同于 \"nodeRotate\":{\"x\":-45, \"y\":0, \"z\":0, \"px\":0, \"py\":0, \"pz\":0}。
由于存在
万向节死锁(gimbal lock)
的问题,当需要绕多个轴旋转时,建议每次 nodeRotate 只指定一个轴的旋转。例如,不建议使用 {\"nodeRotate\":{\"x\":90, \"y\":45, \"z\":0}},而是应采用如下方式:{\"nodeRotate1\":{\"x\":90, \"y\":0, \"z\":0}, \"nodeRotate2\":{\"x\":0, \"y\":45, \"z\":0}}。
仅包含单一插槽、无修饰符的部件。
"autobello_spring_F": {
"slotType":"autobello_spring_F",
"slots":[
["type", "default", "description"],
["autobello_shock_F","autobello_shock_F", "Front Shocks"],
],
},
包含多个插槽类型的部件。
"semi_R_suspension_single_leaf": {
"slotType" : ["us_semi_suspension_R_single","us_semi_suspension_R_tandem"],
},
使用了 nodeOffset 和 nodeMove 的车架 jbeam 示例。
"pickup_frame_ext":
{
"slotType" :"pickup_frame",
"slots":[
["type", "default", "description"],
//行驶部件
["pickup_ABS","pickup_ABS", "防抱死制动系统"],
["pickup_ESC","", "电子稳定及牵引力控制"],
["pickup_fueltank","pickup_fueltank","油箱", {"nodeOffset":{"x":0.0,"y":0.613,"z":0}}],
["pickup_engine","pickup_engine_v8_4.5","发动机"],
["pickup_muffler_ext","pickup_muffler_ext","消音器"],
["pickup_suspension_R","pickup_axle_R","后悬架", {"nodeMove":{"x":0.0,"y":0.613,"z":0}}],
["pickup_suspension_F","pickup_IFS","前悬架"],
["pickup_driveshaft_R_ext","pickup_driveshaft_R_ext","后驱动轴"],
////车身部件
["pickup_radsupport", "pickup_radsupport", "水箱支架", {"nodeOffset":{"x":0.0,"y":0.0, "z":0}}],
["pickup_bumper_F","pickup_bumper_F","前保险杠", {"nodeOffset":{"x":0.0,"y":0.0, "z":0}}],
["pickup_bumper_R","pickup_bumper_R","后保险杠", {"nodeOffset":{"x":0.0,"y":0.613,"z":0}}],
["pickup_body_ext","pickup_body_ext","车身", {"nodeOffset":{"x":0.0,"y":0.0, "z":0}}],
["pickup_bed","pickup_bed","货箱", {"nodeOffset":{"x":0.0,"y":0.613,"z":0}}],
//杂项
["pickup_towhitch","","拖车钩", {"nodeOffset":{"x":0.0,"y":0.613,"z":0}}],
["pickup_sparetire","pickup_sparetire_6l","备胎", {"nodeOffset":{"x":0.0,"y":0.663,"z":0}}],
["linelock", "", "刹车线锁"],
["pickup_reversewarn", "", "倒车蜂鸣警报器"],
],
},
使用带有变量的 nodeOffset 以及核心插槽的悬挂部件示例。
"vivace_suspension_R": {
"slotType" : "vivace_suspension_R",
"slots": [
["type", "default", "description"],
["vivace_brake_R","vivace_brake_R", "后刹车"],
//要更改基础轮距,请编辑表达式中的 trackoffset_R 偏移量。
["wheel_R_5","steelwheel_16a_16x7_R","后轮", {"nodeOffset":{"x":"$=$trackoffset_R+0.3", "y":1.338, "z":0.32}}],
["vivace_wheeldata_R","vivace_wheeldata_R", "后主轴", {"coreSlot":true}],
["vivace_spring_R","vivace_spring_R", "后弹簧"],
["vivace_shock_R","vivace_shock_R", "后减震器"],
],
},
传递插槽变量。
"slots": [
["type", "default", "description"],
["log_trailer_headache_rack","","防护架"],
["log_trailer_bolsters_F","log_trailer_bolsters_F","前加强杆"],
["log_trailer_bolsters_R","log_trailer_bolsters_R","后加强杆", {"variables": {"$bolster_offset":-0.39}}],
],
在被传递变量的部件中使用该插槽变量。
"log_trailer_bolsters_R": {
"information":{
"authors":"BeamNG",
"name":"后加强杆",
"value":500,
},
"slotType" : "log_trailer_bolsters_R",
"flexbodies": [
["mesh", "[group]:", "nonFlexMaterials"],
["log_trailer_bolster_mount", ["log_trailer_frame"], [], {"pos":{"x":0,"y":5.14,"z":-0.22}}],
["log_trailer_bolster_mount", ["log_trailer_frame"], [], {"pos":{"x":0,"y":"$=8.425+$bolster_offset","z":-0.22}}],
["log_trailer_bolster", ["log_trailer_bolster_3"], [], {"pos":{"x":0,"y":5.14,"z":-0.22}}],
["log_trailer_bolster", ["log_trailer_bolster_4"], [], {"pos":{"x":0,"y":"$=8.425+$bolster_offset","z":-0.22}}],
],
},
这篇文章对你有用吗?