发光贴图(glowMaps)允许你根据一个数值在多个材质 之间切换。
发光贴图最常见的用途就是车辆灯光,也因此得名。这包括前照灯、尾灯、仪表灯等。在这些情况下,发光贴图用于将灯光材质切换为自身对应的发光材质。关于灯光材质的更多信息请参见此页面。 然而,发光贴图也可以应用在任何需要动态更换材质的场景中。
与大多数其它 Jbeam 部分不同,glowMap 部分不是一个表,而是一个字典。键(key)为建模软件中设置的相关材质名称,值(value)为另一个字典。该字典中可以包含多个不同的字典(后文会进行说明),并有三个被称为“材质槽”的值,分别以"off"、“on"和"on_intense"为键。它们的值分别是在 simpleFunction 或 advancedFunction 计算结果基础上,部件将使用的不同材质。
"glowMap":{
"taillights":{
"simpleFunction":{"lowhighbeam":0.49,"brake":0.49}, "off":"lights", "on":"lights_on", "on_intense":"lights_on_intense"
},
}
虽然 glowMaps 支持使用与其自身键名相同名称的材质,但建议避免这样做,以防游戏后续更新导致意外行为。作为 glowMap 键定义的材质通常不需要在车辆的 materials.json 文件中手动添加,因为它会为每辆车自动生成。不过,对于位于 “common” 文件夹下的材质,由于它们不是专属单个车辆,而是被所有车辆共享,因此仍然需要在 materials.json 中定义。为此,可以使用虚拟材质 。
每个 glowMap 支持 3 个可切换的材质槽,分别为 “off”、“on” 和 “on_intense”。模式切换原理是将多个输入值乘以各自的系数后相加。如果总值小于 0.0001,则 glowMap 处于 “off” 状态;在 0.0001 到 0.5 之间则为 “on” 状态;大于等于 0.5 时为 “on_intense”。函数结果可以大于 1。
一个典型的车辆 glowMap 配置如下所示:
"glowMap":{
//外部灯光
"signal_L": {"simpleFunction":{"signal_L":0.49}, "off":"light","on":"light_on","on_intense":"light_on_intense"},
"signal_R": {"simpleFunction":{"signal_R":0.49}, "off":"light","on":"light_on","on_intense":"light_on_intense"},
"taillight":{"simpleFunction":{"lowhighbeam":0.49,"brake":1},"off":"light","on":"light_on","on_intense":"light_on_intense"},
"chmsl": {"simpleFunction":{"brake":100}, "off":"light","on":"light_on","on_intense":"light_on_intense"},
"foglight": {"simpleFunction":{"fog":1}, "off":"light","on":"light_on","on_intense":"light_on_intense"},
"headlight":{"simpleFunction":{"lowbeam":0.49,"highbeam":1}, "off":"light","on":"light_on","on_intense":"light_on_intense"},
"reverse": {"simpleFunction":{"reverse":0.49}, "off":"light","on":"light_on","on_intense":"light_on_intense"},
//表盘表面和指针
"gauges": {"simpleFunction":{"lowhighbeam":0.6}, "off":"gauges","on":"gauges_on"},
//gauge lights
"signal_L": {"simpleFunction":"signal_L", "off":"invis", "on":"decals_gauges"},
"signal_R": {"simpleFunction":"signal_R", "off":"invis", "on":"decals_gauges"},
"checkengine": {"simpleFunction":"checkengine", "off":"invis", "on":"decals_gauges"},
"hazard": {"simpleFunction":"hazard", "off":"invis", "on":"decals_gauges"},
"battery": {"simpleFunction":"battery", "off":"invis", "on":"decals_gauges"},
"highbeam": {"simpleFunction":"highbeam", "off":"invis", "on":"decals_gauges"},
"parkingbrake":{"simpleFunction":"parkingbrake", "off":"invis", "on":"decals_gauges"},
"lowfuel": {"simpleFunction":"lowfuel", "off":"invis", "on":"decals_gauges"},
"abs": {"simpleFunction":"abs", "off":"invis", "on":"decals_gauges"},
}
整个 glowMap 功能都依赖于车辆 Lua 电气数值。可参考这里 获取可用的默认数值列表。需要注意的是,大多数这些数值通常仅为 0 或 1,但部分数值可能会取 0 到 1 之间的任意值。例如 “brake” 等于制动输入,也就是说其数值可以是 0 到 1 之间的任意数值。在设置各函数的权重时请注意,以确保其行为符合预期。
glowMap 的数值可以通过以下三种方式进行计算:
如果 “simpleFunction” 参数被设为字符串,则该字符串应是某个电气数值的名称。此时 glowmap 数值会直接赋值为此电气数值本身,无需任何修改或计算。例如,下方 glowMap 在未踩制动时会使用 “off” 材质,一旦踩下制动则会切换到 “on” 状态。
"glowMap":{
"brakelights":{"simpleFunction":"brake", "off":"lights", "on":"lights_on"},
}
“simpleFunction”参数也可以是一个字典,其中包含电气数值的名称,每个名称对应一个系数,代表它们对 glowmap 数值的加成。支持负数修正,结果也可以大于 1。这种方法是 glowmap 数值计算中最常见的一种。例如,下面的 glowmap 配置将在关闭灯光且未踩刹车时使用“off”材质,只要灯光或刹车其中之一被激活,则切换为“on”状态;两者都激活时,则切换为“on_intense”状态。若未定义“on_intense”,则会继续使用“on”状态。
"glowMap":{
"taillights":{
"simpleFunction":{"lowhighbeam":0.49,"brake":0.49}, "off":"lights", "on":"lights_on", "on_intense":"lights_on_intense"
},
}
需要注意的是,在此特定情况下,lowhighbeam 一直是 0 或 1,而 brake 等于刹车输入值,这意味着该数值可以是 0 到 1 之间的任意值。
下面这个 simpleFunction 实现了 DRL 与转向灯的联合 glowmap 效果。
当发动机启动时,“running” 设为 true,会向 glowmap 数值加 0.49,并切换至 “on” 状态。
当右转向灯被激活时,“signal_right_input” 设为 true,会从 glowmap 数值中减去 1,即使 “running” 为 true,此时也会强制采用 “off” 材质。
“signal_R” 根据定时器周期性开启与关闭,从而实现闪烁效果。当其激活时,会向 glowMap 数值加 2,使其数值超过 0.5。
"glowMap":{
"running_signal_R":{
"simpleFunction": {
"signal_right_input": -1,
"running": 0.49,
"signal_R": 2
},
"off":"lights", "on":"lights_on", "on_intense":"lights_on_intense"
},
}
advancedFunction 支持直接使用一段 Lua 代码片段来计算其值。这使你可以无需外部 Lua 模块,直接控制 glowmap。这一功能不常用,最简单的用途就是实现档位显示。此方法需要一个包含以下键的字典:
如果只使用一个数值,可以用表(数组)语法:
"triggers":["gear"],
如果有多个数值,则使用字典(对象)语法。每个数值都需要在 advancedFunction 中有唯一的键,但这些键的名称不会被处理环节读取,因此随意取即可:
"triggers":{"1":"gear","2":"gearIndex"},
如果只有一个数值,也可以将键设置为空字符串来省略键名:
"triggers":{"":"gear"},
例如,下面这个 advancedFunction 就会在选中停车档(P 档)时切换为“on”状态。
"glowMap":{
"citybus_transmission_DSP_P": {
"advancedFunction":{
"triggers":{"":"gear"}, "cmd":"gear=='P' and 1 or 0"
},
"off":"invis""on":"citybus_transmission_DSP"
},
}
这个例子会在变速箱处于 2 挡时切换为 “on” 状态。
"glowMap":{
"citybus_transmission_DSP_2": {
"advancedFunction":{
"triggers":{"":"gearIndex"}, "cmd":"gearIndex==2 and 1 or 0"
},
"off":"invis", "on":"citybus_transmission_DSP",
},
}
这个 advancedFunction 仿真了上面高级示例中 DRL/转向灯 simpleFunction 的行为。
"glowMap":{
"running_signal_R":{
"advancedFunction":{
"triggers": {
"1": "signal_right_input",
"2": "engineRunning",
"3": "signal_R"
},
"cmd": "engineRunning*0.49 + signal_R*2 - signal_right_input"
}
}
}
为了实现更逼真的卤素灯和密封光束灯效果,可以定义灯光状态之间的渐变过渡。
其原理是通过smoother (平滑函数)动态改变发光材质的emissiveFactor (发光系数)。在 glowMap 部分,这可以通过调用电气 模块中定义的特殊电气值 来实现,并指定 “on” 状态下材质 emissiveFactor 达到最大值时的阈值(通过 “materialEmissiveScaling” 参数设定)。
"glowMap":{
"sealedbeam_auxlight": {
"simpleFunction":{
"foglight_filament":0.49
},
"off":"sealedbeam", "on":"sealedbeam_on", "materialEmissiveScaling":{"on_max":0.49}
},
"sealedbeam_auxlightglass": {
"simpleFunction":{
"foglight_filament":0.49
},
"off":"sealedbeam_glass", "on":"sealedbeam_glass_on", "materialEmissiveScaling":{"on_max":0.49}
},
}
也可以像标准电气函数一样配置多个输入值。由于材质 emissiveFactor 可动态变化,这里无需单独设立 “on_intense”(高亮)状态——“on” 就可作为最大值状态,中间的渐变则对应灯光由 “off” 到 “on” 的过渡。
"glowMap":{
"sealedbeam_headlight": {
"simpleFunction":{
"lowbeam_filament":0.49,"highbeam_filament":1
},
"off":"sealedbeam", "on":"sealedbeam_on_intense", "materialEmissiveScaling":{"on_max":1}
},
"sealedbeam_headlightglass": {
"simpleFunction":{
"lowbeam_filament":0.49,"highbeam_filament":1
},
"off":"sealedbeam_glass", "on":"sealedbeam_glass_on_intense", "materialEmissiveScaling":{"on_max":1}
},
}
这篇文章对你有用吗?