赛道-–-动画对象
汉化标题:赛道-–-动画对象
原文标题: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 的准备!
语法
整个配置以如下开始:
[ANIMATED_...]
ACTIVE = 1 ; (可选)设为 0 以禁用
NODE = root_node ; 要移动的节点名称(对于关键帧动画,设为包含整个动画的节点)
;之后,每种行为都有它自己的参数。如何指定行为?是根据出现了哪些参数来判断!我不确定当初为什么选择这种方式,但我感觉以后可能会带来一些麻烦。
在继续之前,有几件事需要说明:
很多这些动画依赖“滞后(lag)”。你可以把它们想象为质量(mass)。0 表示即时反应,1 表示完全不反应。实际上,大多数 CSP 功能都会使用这些参数,但我还是在这里提一下以防万一。
对于某些行为,你可以使用条件的值代替数字。我用
*标记了这些值。只需在需要数字的位置放入条件名即可生效。
风车(Windmill)
[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)
[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)
[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)
[ANIMATED_...]
NODE = animated_node
ANIMATION = animation.ksanim ; 动画文件名,必须位于配置文件旁边
TICK_TOCK_MODE = 0 ; 设为 1 以使动画前后往复播放
DURATION = 10 ; 动画持续时间(秒)*
; PROGRESS = ; 动画进度¹*¹ PROGRESS 用于将动画链接到某个条件,而不是仅以固定间隔循环。这样可以将动画与一天中的时间、太阳角度等关联。
火车(Train)
[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)
当设置了 POSITION、ROTATION 或 SCALE 中的任意一个时,将选择此类型。在这里,位置、缩放和旋转角度都可以使用赛道条件或表达式来设置。
[ANIMATED_...]
NODE = something_moving
POSITION = X, Y, Z
SCALE = X, Y, Z
ROTATION = X
SPIN_AXIS = 0, 1, 0