Skip to content

通用-–-场景查询

汉化标题:通用-–-场景查询
原文标题:General-–-Scene-queries
汉化更新时间:2026-01-14 14:22:54 +0800
英文原文最新更新时间:2023-10-15 12:23:52 -0300

许多 CSP 配置以及 Lua 中的 ac.SceneReference() 都期望引用场景中的节点或网格。在大多数情况下,一个简单的网格名称就足够了,但有时更高级的方法会更好地工作,因此这里有一些关于它们如何工作的细节。

首先,除非另有说明,所有这些查询都支持通配符"?",表示任意数量的任意符号。除此之外,匹配尝试获取整个字符串,因此如果您想搜索子字符串,请使用"?keyword?"模式。

属性

除了使用名称,查询还可以引用属性。这些的语法是"property:value",因此例如,不使用"MESH_NAME",您可以使用"material:MATERIAL_NAME"。

特定节点
  • carRoot:N:第 N 辆车的车辆根节点;
  • driverRoot:N:第 N 辆车的驾驶员根节点;
  • driverNeck:N:第 N 辆车的驾驶员颈部节点;
  • sceneRoot:yes/:no¹:根节点;
  • carsRoot:yes/:no¹:包含车辆的节点;
  • trackRoot:yes/:no¹:赛道根节点;
  • staticRoot:yes/:no¹:静态几何体根节点(称为"BLURRED");
  • dynamicRoot:yes/:no¹:动态几何体根节点(称为"UNBLURRED")。

从车辆或赛道配置中使用大多数这些根本行不通,它们的查询仅限于它们相应的节点。车辆和赛道 Lua 脚本也是如此,但其他类型的 Lua 脚本可能会更疯狂一些。

通用属性

这些属性适用于任何类型的对象。

  • class:对象类型(已知:nodemodelcarNodeSorternodeBoundingSphereparentnodeEventidealLineparticleSystemstaticParticleSystemdisplayNodetextNodecspNoderenderablemeshskinnedMeshskidmarkBuffer);
  • active:yes/:no:活动状态;
  • first:yes/:no¹:其父节点的第一个子节点;
  • last:yes/:no¹:其父节点的最后一个子节点;
  • lod:N/:A/:B/…:对象来自特定的 LOD(对于车辆模型);
  • modelRoot:yes/:no:KN5 文件的根节点;
  • driverPiece:yes/:no:驾驶员模型中的对象;
  • insideInterior:yes/:no:车辆驾驶舱中的对象;
  • insideSteeringWheel:yes/:no:车辆方向盘中的对象;
  • insideWheel:yes/:no:车辆车轮节点中的对象;
  • insideSuspension:yes/:no:车辆悬挂节点中的对象;
  • insideNthWheel:N:第 N 辆车车轮中的对象;
  • insideNthSuspension:N:第 N 辆车悬挂中的对象;
  • parent:X:如果父节点匹配 X(这也可能是一个属性查询);
  • child:X:如果节点有一个匹配 X 的子节点。比其他的更昂贵,所以请谨慎使用。
材质相关属性

这些属性适用于具有材质的对象(网格和蒙皮网格)。它们也可以在例如着色器替换部分的 MATERIALS = … 参数中使用。

  • material:X:材质名称;
  • shader:X:着色器名称;
  • vegetation:yes/:no:树木和草;
  • dynamic:yes/:no:自行移动的实体(树木、草、旗帜);
  • supportsDamage:yes/:no:支持损坏的材质(例如"ksPerPixelMultiMap_damage_dirt");
  • alphaBlend:yes/:no:材质使用 alpha 混合;
  • alphaTest:yes/:no:材质使用 alpha 测试;
  • isTextureDefault:X²:如果纹理 X 是默认的并且不是来自皮肤;
  • isTextureSlotDefault:X²:如果插槽 X 中的纹理是默认的并且不是来自皮肤;
  • texture:X:任何纹理的名称;
  • materialProperty:X²:如果材质具有属性 X;
  • materialResource:X²:如果材质具有纹理插槽 X。
网格属性

这些仅与网格匹配。

  • renderable:yes/:no:不可渲染的网格用于物理;
  • transparent:yes/:no:透明标志;
  • static:yes/:no:静态标志(通常分配给赛道网格);
  • largerThan:N:如果网格边界球体的直径大于 N 米(不考虑父级缩放);
  • castsShadows:yes/:no:阴影投射选项;
  • lodIn:N:如果 LOD 入口距离在 N 米的 0.5 范围内;
  • lodOut:如果 LOD 出口距离在 N 米的 0.5 范围内;
  • hasLodDistance:yes/:no:如果网格已定义 LOD 距离;
  • wet:yes/:no:在雨中变湿的网格(一些车辆内部网格保持完全干燥);
  • mirror:yes/:no:车辆后视镜网格;
  • windscreenGeneratedUV:yes/:no:RainFX 为挡风玻璃和后视镜生成的替代 UV;
  • layer:N:网格层(即其细节级别,第 5 层上的网格仅在高世界细节下绘制);
  • actsAsHeadlights:yes/:no:基于车辆自发光配置;
  • actsAsBrakeLights:yes/:no:基于车辆自发光配置。
蒙皮网格属性
  • transparent:yes/:no:透明标志;
  • castsShadows:yes/:no:阴影投射选项;
  • hasLodDistance:yes/:no:如果网格已定义 LOD 距离;
  • layer:N:网格层(即其细节级别,第 5 层上的网格仅在高世界细节下绘制)。

所有索引都是从零开始的。

¹ 对于 0.1.80-preview400 之前的 CSP 构建,不支持 :no 选项,请使用取消(!first:yes)。 ² 必须是精确匹配,不支持"?"。

复杂查询

要一次使用多个属性,可以将查询组合成复杂表达式。第一件事是在表达式末尾添加"{"和"}",并在其中写入复杂的东西。支持的运算符:

  • ^:逻辑
  • &:逻辑
  • |(或,):逻辑

可以使用括号来分配显式顺序(没有它们,"!"优先,然后是"&")。几个示例:

  • { RT_DRIVER_Face & ( isTextureDefault:DRIVER_Face.dds | isTextureDefault:DRIVER_Face_NM.dds ) }
  • { transparent:yes & alphaBlend:yes & ( shader:ksPerPixelReflection | shader:smGlass? ) }

其他一些事情

请注意:CSP 允许通过执行像 MESHES = A, B, C 这样的操作在配置中列出节点的原因仅仅是因为 CSP 中的配置解析器总是处理列表,因此在该示例中它读取了三个查询。另一方面,使用场景的 Lua API 只期望单个查询,因此您需要在那里使用 ac.findMeshes('{ A, B, C }')

此外,如果您正在使用着色器替换,请尽可能使用 MATERIALS 而不是 MESHES = material:…。虽然有一些优化措施,但有时如果您的着色器替换在每个网格的基础上更改了某些内容(例如材质属性),CSP 仍然必须为每个单独的网格制作材质的副本。