fix: 优化空格播放和截图角色标签对不上

This commit is contained in:
2026-09-17 19:39:24 +08:00
parent 8d67f17a84
commit e66e3374bf
19 changed files with 633 additions and 58 deletions

View File

@@ -4,6 +4,7 @@ import { Vector2 } from "three";
import { useDirectorStore } from "../store/directorStore";
import { usePlaybackStore } from "../runtime/playbackStore";
import { getVideoExportContext } from "./videoExportBridge";
import { hideViewportCaptureHelpers, withViewportCaptureHelpersHidden } from "../canvas/viewportCapture";
import { applyActiveCameraViewAtTime, applyTimelineTransformsAtTime } from "../runtime/playbackTransforms";
import { getViewportAspectRatioValue } from "../schema/viewportAspectRatio";
import { normalizeTimelineFps } from "../schema/timeline";
@@ -190,7 +191,9 @@ async function exportVideoFrameByFrame(view: VideoExportView): Promise<void> {
editingObjectId: usePlaybackStore.getState().editingObjectId,
});
gl.render(scene, frameCamera);
// 和截图同一套:渲染这一帧前先把编辑器辅助元素(gizmo 红绿蓝轴 / 网格 / 坐标轴 / 轨迹)藏起来,
// 否则导出的视频里会带着选中的 gizmo 三条轴。渲完 withViewportCaptureHelpersHidden 会原样恢复。
withViewportCaptureHelpersHidden(scene, () => gl.render(scene, frameCamera));
const frame = new VideoFrame(canvas, {
timestamp: frameIndex * frameDurationUs,
@@ -250,12 +253,20 @@ async function exportVideoWithMediaRecorder(view: VideoExportView): Promise<void
const directorStore = useDirectorStore.getState();
const duration = directorStore.project.timeline.duration;
// 实时录屏兜底路径录的是「实时画面」,整段录制期间都要藏住编辑器辅助元素
//(gizmo 红绿蓝轴 / 网格 / 坐标轴等)—— 不能像逐帧路径那样只在某一帧渲染时隐藏。
const captureBridge = getVideoExportContext();
const restoreCaptureHelpers = captureBridge ? hideViewportCaptureHelpers(captureBridge.scene) : () => {};
// 切视角 + 复位指针(时间轴本身就是单次播放,到末尾会自己停住)
directorStore.setViewMode(view);
usePlaybackStore.getState().setPlayhead(0);
const stopped = new Promise<void>((resolve) => {
recorder.onstop = () => resolve();
recorder.onstop = () => {
restoreCaptureHelpers();
resolve();
};
});
recorder.start();