Skip to content

赛道-–-动画对象

汉化标题:赛道-–-动画对象
原文标题:Tracks-–-Animated-objects
汉化更新时间:2026-01-14 16:10:21 +0800
英文原文最新更新时间:2023-10-15 12:23:52 -0300

通过这个 CSP 特性,你可以以多种方式为对象添加动画。移动钟表指针、让火车沿轨道移动、旋转风向标和风车、将位置、旋转或缩放链接到 条件 或使用 “.ksanim” 的关键帧动画。若你需要其他行为,请告诉我。

首先,重要的说明:如果你正在制作一个新赛道并想要给某些东西做动画,最好把要动画的对象导出到一个单独的 KN5 并使用 “Save KN5/Car” 选项保存。将 KN5 保存为赛道意味着其整个层级会被合并为一个网格列表。渲染速度更快并且物理仍然可用,但网格不能被移动,除非它们位于自己的节点内。否则,你需要用带配置的节点来包裹网格,在某些情况下这会变得有点复杂(尤其是当涉及 “.ksanim” 文件时)。我在下面描述了这个流程。

下面是一个用于展示动画赛道的示例(用于 这个视频):赛道链接。感谢 Soyo 的准备!

语法

整个配置以如下开始:

ini
[ANIMATED_...]
ACTIVE = 1        ; (可选)设为 0 以禁用
NODE = root_node  ; 要移动的节点名称(对于关键帧动画,设为包含整个动画的节点)
                  ;

之后,每种行为都有它自己的参数。如何指定行为?是根据出现了哪些参数来判断!我不确定当初为什么选择这种方式,但我感觉以后可能会带来一些麻烦。

在继续之前,有几件事需要说明:

  • 很多这些动画依赖“滞后(lag)”。你可以把它们想象为质量(mass)。0 表示即时反应,1 表示完全不反应。实际上,大多数 CSP 功能都会使用这些参数,但我还是在这里提一下以防万一。

  • 对于某些行为,你可以使用条件的值代替数字。我用 * 标记了这些值。只需在需要数字的位置放入条件名即可生效。

风车(Windmill)

ini
[ANIMATED_...]
NODE = windmill_rotating_part
WINDMILL_DIR = 1, 0, 0       ; 风向向量,风车将基于此方向响应风
WINDMILL_DIR_EXP = 1         ; 指数,用于减少来自接近侧风的旋转影响¹
WINDMILL_DIR_BOTH_SIDES = 1  ; 设为 0 时,来自背风方向的风不影响风车
SPIN_AXIS = 0, 0, 1          ; 旋转轴
WIND_SPEED_KMH_MIN = 0.5     ; 风车开始转动的风速
WIND_SPEED_KMH_MAX = 20      ; 风车达到最高转速的风速
WIND_SPEED_KMH_STOP = 0      ; 强制停止风车的风速阈值²
LAG_UP = 0.999               ; 加速时的滞后
LAG_DOWN = 0.999             ; 减速时的滞后
LAG_BRAKING = 0.98           ; 强制停止时的滞后
SPEED_MULT = 1               ; 转速倍率*

¹ 默认情况下,来自与 WINDMILL_DIR 60° 角度的风会导致转速减半;若 WINDMILL_DIR_EXP 为 2,则转速只会是四分之一。

² 适用于用于发电的现代风车。当风过强时,它们会停止转动以防损坏。

风向标(Weather vane)

ini
[ANIMATED_...]
NODE = weather_vane
WEATHERVANE_DIR = 1, 0, 0  ; 风向向量,风向标将基于此方向响应风
WEATHERVANE_DIR_EXP = 0    ; 指数,用于减少来自接近侧风的旋转影响¹
SPIN_AXIS = 0, 1, 0        ; 旋转轴
SPEED_MULT = 1             ; 转速倍率
WIND_SPEED_KMH_MIN = 0.5   ; 风向标开始响应的风速
INERTIA = 0.99             ; 风向标的惯性
ANGLE_OFFSET = 0           ; 角度偏移,可选

¹ 这些参数与风车非常相似,但风向标通常对任何方向的风都敏感,所以这里的默认值为 0。

时钟指针(Clock needle)

ini
[ANIMATED_...]
NODE = needle_hours
CLOCK_NEEDLE = HOUR  ; 角色,合法值:SECONDS、MINUTE、HOUR 或 HOUR24
OFFSET_DEG = 0       ; 角度偏移(度)
DEBUG_VALUE = 0      ; 设为非零以调试,它会强制指针显示该值
SPIN_AXIS = 0, 0, 1  ; 旋转轴
LAG = 0.67           ; 平滑移动用的滞后

关键帧动画(Keyframe animation)

ini
[ANIMATED_...]
NODE = animated_node
ANIMATION = animation.ksanim  ; 动画文件名,必须位于配置文件旁边
TICK_TOCK_MODE = 0            ; 设为 1 以使动画前后往复播放
DURATION = 10                 ; 动画持续时间(秒)*
; PROGRESS =                  ; 动画进度¹*

¹ PROGRESS 用于将动画链接到某个条件,而不是仅以固定间隔循环。这样可以将动画与一天中的时间、太阳角度等关联。

火车(Train)

ini
[ANIMATED_...]
NODE = train_node
MOVE_ALONG = train_loop             ; 用于生成轨迹的网格名称¹
NODES_FOLLOWING = train_1, train_2  ; 附着在火车上的车厢节点名

CLUSTER_THRESHOLD = 3      ; 可能需要调整以帮助轨迹检测
STARTING_POINT = X, Y, Z   ; 对于非闭合路径,从此点开始并移动到另一端
INVERT_DIRECTION = 0       ; 闭合路径时翻转方向
TICK_TOCK_MODE = 0         ; 设为 1 以前后往复移动
CUBIC_INTERPOLATION = 0    ; 设为 1 以获得更平滑的移动(推荐)
SPEED_KMH = 40             ; 基本火车速度*
; PROGRESS =               ; 旅行进度²*
PIECE_LENGTH = 5           ; 附着车厢的长度
LAG_UP = 0.9               ; 加速滞后
LAG_DOWN = 0.9             ; 减速滞后
DELAY_BETWEEN_RUNS = 0, 0  ; 运行间的随机延迟最小和最大值(秒)
DEBUG_PATH = 0             ; 设为 1 以高亮生成的路径

; 路径还可以包含局部速度调整区域:
SPEED_ADJUSTMENT_0 = 50             ; 该区域内目标速度*
SPEED_ADJUSTMENT_0_POINT = X, Y, Z  ; 坐标
SPEED_ADJUSTMENT_0_RADIUS = 20, 60  ; 效果全量半径和开始调整半径(米)

; 火车还可以为其他条件创建新的输入,非常适合绑定音频或灯光:
SPEED_CONDITION_INPUT = MyNewInput_TrainSpeed
PROGRESS_CONDITION_INPUT = MyNewCondition_TrainProgress

¹ 该网格用于生成路径,应该类似一条窄长的带状(可以隐藏)。它可以是闭合的或非闭合的,火车会根据法线朝向而倾斜(如果查看示例视频,火车在那里做了一些翻滚)。

² PROGRESS 用于将行程与某个条件链接。这样,你可以把它与一天中的时间、太阳角度等关联。对于火车这是否有用尚不确定,但也可能用于沿路径移动的其他对象。

来自 @John514 的一些火车使用提示

  • 在 Y 轴上对齐火车;
  • 第 1 节车厢须处于最下方(朝向 Y');
  • 移动的对象需要在 X 轴上旋转 90 度。

条件驱动的动画(Conditional animation)

当设置了 POSITIONROTATIONSCALE 中的任意一个时,将选择此类型。在这里,位置、缩放和旋转角度都可以使用赛道条件或表达式来设置。

ini
[ANIMATED_...]
NODE = something_moving
POSITION = X, Y, Z
SCALE = X, Y, Z
ROTATION = X
SPIN_AXIS = 0, 1, 0