feat(时间轴): 支持多机位自动切换与关键帧
- 新增 getActiveCameraIdAtTime,按时间轴关键帧自动选择机位 - 导出与播放时预览按切点自动切机位,保持一致 - 时间轴工具栏新增当前机位选择器 - 无选中物体时给当前机位打关键帧,支持多机位独立打点
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user