Skip to content

赛道-–-网格操作

汉化标题:赛道-–-网格操作
原文标题:Tracks-–-Meshes-manipulation
汉化更新时间:2026-01-14 17:16:16 +08:00
英文原文最新更新时间:2023-02-03 15:47:05 +0100

理想情况下,这些操作应在 3D 编辑器 中完成,但有时可能无法实现,例如在为已有赛道制作改动时。

平滑法线

用于修复赛道某些表面看起来不平滑的问题。在有雨水效果(Rain FX)时尤为明显,因为水洼中的反射会出现断裂。现在可以通过配置快速修复此问题。

ini
[SMOOTH_NORMALS_...]
MESHES = mesh0, …         ; 受影响网格的列表
MATERIALS = material0, …  ; 受影响材质的列表(可使用材质、网格或同时使用)
PRECISION = 0.0001        ; 平滑阈值
NORMAL_CONTRIBUTION = 0   ; 在检测棱边时法线参与的权重

其工作原理是:对找到的所有网格,找出彼此距离小于 PRECISION 的顶点并平均它们的法线。如果 NORMAL_CONTRIBUTION 非零,则在分组阶段会将其添加到顶点位置,从而保留一些棱边。通常对如沥青之类的表面不需要使用该参数。

示例:

ini
[SMOOTH_NORMALS_...]
MATERIALS = asph
PRECISION = 0.01
NORMAL_CONTRIBUTION = 0

法线变换

此项例如可用于将树叶的法线重新定向,使其面向上方。

ini
[ALTER_NORMALS_...]
MESHES = mesh0, …         ; 受影响网格的列表
MATERIALS = material0, …  ; 受影响材质的列表(可使用材质、网格或同时使用)
ALTER = 0, 1, 0           ; 可选的法线向量重新定向(将法线沿提供向量旋转)
; OFFSET = 0, -0.01, 0          ; 可选的偏移

示例:

ini
[ALTER_NORMALS_...]
MESHES = flat.trees.?
OFFSET = 0, 1e9, 0

网格拆分

将网格拆分为独立元素。请谨慎使用:这会增加绘制调用(draw calls)数量,未必总是合适。

ini
[SPLIT_MESHES_...]
MESHES = mesh0, …               ; 受影响网格的列表
MATERIALS = material0, …        ; 受影响材质的列表(可使用材质、网格或同时使用)
NAME_FORMAT = '{Name}.{Index}'  ; 新网格的命名格式
ORDER_PIVOT = X, Z, Y           ; 分离节点的排序将从该位置开始(与该位置最近的
                                ; 分离网格将获得索引 0)

名称格式可用的替换项:

  • Name: 原始网格名称;
  • Index: 元素的索引(基于其到 ORDER_PIVOT 的距离);
  • Position: 其 AABB 中心在世界坐标系中的位置;
  • NearestPitStop: 最近维修站的索引;
  • NearestStart: 最近起点位置的索引。

示例:

ini
[SPLIT_MESHES_...]
MESHES = PitwallSpotLightsGlass
NAME_FORMAT = PitwallSpotLightsGlass_{NearestPitStop}

网格细分

对于远处的几何体,一些大型低多边形网格同时作为远景和地面可能会引发问题(例如 Shuto)。此功能可帮助缓解该类问题。

ini
[SUBDIVIDE_MESHES_...]
MESHES = mesh0, …         ; 受影响网格的列表
MATERIALS = material0, …  ; 受影响材质的列表(可使用材质、网格或同时使用)
ITERATIONS = 2            ; 迭代次数,默认值为 1

示例:

ini
[SUBDIVIDE_MESHES_...]
MESHES = material:mat_main_background
ITERATIONS = 2

包裹网格

要使对象可动画化,需要将其网格包裹在节点中,但如果赛道的 KN5 被保存为 track,则所有内容会被扁平化。通常建议将动态对象保存在作为 car 保存的单独 KN5 中,但如果这不可行,则可以将现有的扁平化网格包裹到一个节点中:

ini
[WRAP_MESHES_...]
NAME = node          ; 新节点的名称
MESHES = mesh0, …    ; 要加入的网格列表
PIVOT_POS = X, Z, Y  ; 创建节点的枢轴位置

; 可选地,可用向量设置节点朝向:
PIVOT_DIR = X, Z, Y  ; Z 轴方向(或使用 PIVOT_DIR_POINT 指定世界坐标以让节点朝向某点)
PIVOT_UP = X, Z, Y   ; Y 轴方向(或使用 PIVOT_UP_POINT 指定世界坐标)

; 或使用角度(弧度):
PIVOT_HEADING =
PIVOT_PITCH =
PIVOT_ROLL =

示例:

ini
[WRAP_MESHES_...]
NAME = windmill_spin
MESHES = windmill_spin
PIVOT_POS = -5.47, 9.178, -27.592