feat(时间轴): 支持多机位自动切换与关键帧

- 新增 getActiveCameraIdAtTime,按时间轴关键帧自动选择机位
- 导出与播放时预览按切点自动切机位,保持一致
- 时间轴工具栏新增当前机位选择器
- 无选中物体时给当前机位打关键帧,支持多机位独立打点
This commit is contained in:
2026-09-19 02:43:47 +08:00
parent 2015d8d3c3
commit 482d649f84
8 changed files with 464 additions and 54 deletions

View File

@@ -188,6 +188,38 @@ export function evaluateCameraTrackAtTime(track: CameraTimelineTrack, time: numb
return evaluateKeyframes(track.keyframes, time, lerpCameraValue);
}
/**
* 某个时刻应该显示哪个机位(多机位自动切换 / 自动切点):
* 取所有相机轨道里「时间 ≤ t 的最后一帧」中时间最大者所属的那个机位。
* 没有任何机位在 t 之前打过关键帧时,退回 fallback(通常是当前激活机位)。
* 这样时间轴播放时,机位视角会按关键帧时间点自动切到对应机位。
*/
export function getActiveCameraIdAtTime(
cameraTracks: CameraTimelineTrack[],
fallbackCameraId: string | null,
time: number
): string | null {
let bestCameraId: string | null = null;
let bestTime = -Infinity;
for (const track of cameraTracks) {
if (track.keyframes.length === 0) continue;
// 取该机位在 t 之前(含)最近的一帧
let latest = -Infinity;
for (const keyframe of track.keyframes) {
if (keyframe.time <= time && keyframe.time > latest) latest = keyframe.time;
}
if (latest > bestTime) {
bestTime = latest;
bestCameraId = track.cameraId;
}
}
return bestCameraId ?? fallbackCameraId;
}
// ===== 物体增删改 =====
export function upsertKeyframe(
timeline: Timeline,