场景查询
许多 CSP 配置以及 Lua 中的 ac.SceneReference() 都期望对场景中的节点或网格的引用。对于大多数情况,简单的网格名称就可以了,但有时更高级的方式效果更好,以下是关于它们工作方式的详细说明。
首先,除非另有说明,所有这些查询都支持通配符 ?,表示任意数量的任意符号。此外,匹配会尝试匹配整个字符串,所以如果你想搜索子字符串,请使用 ?keyword? 模式。
属性
除了使用名称,查询还可以引用属性。其语法为 property:value,所以你可以使用 material:MATERIAL_NAME 代替 MESH_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:对象类型(已知:node、model、carNodeSorter、nodeBoundingSphere、parent、nodeEvent、idealLine、particleSystem、staticParticleSystem、displayNode、textNode、cspNode、renderable、mesh、skinnedMesh、skidmarkBuffer)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(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²:如果材质有属性 XmaterialResource:X²:如果材质有纹理槽位 X
网格属性
这些仅匹配网格。
renderable:yes/:no:非可渲染网格用于物理transparent:yes/:no:透明标志static:yes/:no:静态标志(通常分配给赛道网格)largerThan:N:如果网格包围球直径大于 N 米(不考虑父级缩放)castsShadows:yes/:no:阴影投射选项lodIn:N:如果 LOD 进入距离在 N 米的 0.5 以内lodOut:N:如果 LOD 退出距离在 N 米的 0.5 以内hasLodDistance:yes/:no:如果网格有定义的 LOD 距离wet:yes/:no:网格在雨天会变湿(一些车辆内部网格保持完全干燥)mirror:yes/:no:车辆后视镜网格windscreenGeneratedUV:yes/:no:RainFX 为挡风玻璃和后视镜生成的替代 UVlayer: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 仍然不得不为每个单独的网格复制材质。
引用来源
- CSP 官方 Wiki 原文 — 内容来源
- acc-extension-config 仓库 — CSP 官方配置文件