From 706fd21a31dfae6fe4d8f62889d3c6ec64591f4e Mon Sep 17 00:00:00 2001 From: ddCat <2695092045@qq.com> Date: Wed, 5 Aug 2026 23:19:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(canvas):=20=E5=AF=BC=E6=BC=94=E5=8F=B0?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=20-=20=E4=BF=AE=E5=A4=8D=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E4=B8=8E=E5=8F=82=E8=80=83=E8=A7=86=E9=A2=91=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 ++ .../canvas/director/director-viewport.tsx | 34 +++---------------- web/src/lib/canvas/director/director-scene.ts | 2 +- web/src/types/canvas.ts | 2 +- 4 files changed, 8 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87b854dcf..a2dcb7eca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- 修复导演台角色、动画清理、骨骼控制与白膜参考视频类型错误导致的生产构建失败。 + ## v1.0.39 - 创作任务支持页面切换后继续后台执行和及时停止,并保证任务结果回填与素材入库幂等。 diff --git a/web/src/components/canvas/director/director-viewport.tsx b/web/src/components/canvas/director/director-viewport.tsx index 4e2f0e433..ca58f61fc 100644 --- a/web/src/components/canvas/director/director-viewport.tsx +++ b/web/src/components/canvas/director/director-viewport.tsx @@ -183,7 +183,6 @@ function DirectorObjectView({ object, selected, selectedBone, transformMode, pla function DirectorObjectVisual({ object, selected, selectedBone, playhead, onSelectBone, onBoneTransform, onActorRigReady }: { object: DirectorObject; selected: boolean; selectedBone: string | null; playhead: number; onSelectBone: (bone: string | null) => void; onBoneTransform: (bone: string, rotation: DirectorQuat) => void; onActorRigReady: (rig: DirectorRig, animations: AnimationClip[]) => void }) { if ((object.kind === "model" || object.kind === "actor" || object.primitive === "character") && (object.url || object.primitive === "character")) return ; if (object.kind === "billboard" && object.url) return ; - if (object.primitive === "character") return ; const material = ; return ( @@ -193,25 +192,6 @@ function DirectorObjectVisual({ object, selected, selectedBone, playhead, onSele ); } -function DirectorCharacter({ object, selected }: { object: DirectorObject; selected: boolean }) { - const color = selected ? "#2f8cff" : object.color; - const pose = characterPose(object.pose || "stand"); - return ( - - - - - - - - - ); -} - -function Limb({ position, rotation, color, length = 0.68 }: { position: [number, number, number]; rotation: [number, number, number]; color: string; length?: number }) { - return ; -} - function DirectorModel({ object, selected, selectedBone, playhead, onSelectBone, onBoneTransform, onActorRigReady }: { object: DirectorObject; selected: boolean; selectedBone: string | null; playhead: number; onSelectBone: (bone: string | null) => void; onBoneTransform: (bone: string, rotation: DirectorQuat) => void; onActorRigReady: (rig: DirectorRig, animations: AnimationClip[]) => void }) { const [model, setModel] = useState(null); const [animations, setAnimations] = useState([]); @@ -274,7 +254,9 @@ function DirectorModel({ object, selected, selectedBone, playhead, onSelectBone, mixer.stopAllAction(); if (!activeAnimation) return; mixer.clipAction(activeAnimation).setLoop(motion?.loop ? LoopRepeat : LoopOnce, motion?.loop ? Infinity : 1).play(); - return () => mixer.stopAllAction(); + return () => { + mixer.stopAllAction(); + }; }, [activeAnimation, model, motion?.loop]); useEffect(() => { @@ -298,7 +280,7 @@ function DirectorModel({ object, selected, selectedBone, playhead, onSelectBone, {selected && helper ? : null} {selected && rig ? Object.entries(rig.boneMap).filter(([, name]) => Boolean(name)).map(([bone, name]) => onSelectBone(bone)} />) : null} - {selected && selectedBoneObject ? { event.stopPropagation(); }} onMouseUp={() => onBoneTransform(selectedBone!, selectedBoneObject.quaternion.toArray() as DirectorQuat)} /> : null} + {selected && selectedBoneObject ? onBoneTransform(selectedBone!, selectedBoneObject.quaternion.toArray() as DirectorQuat)} /> : null} ; } @@ -442,14 +424,6 @@ function DirectorLightView({ light }: { light: DirectorLight }) { return ; } -function characterPose(pose: NonNullable): Record<"leftArm" | "rightArm" | "leftLeg" | "rightLeg", [number, number, number]> { - if (pose === "walk") return { leftArm: [0.35, 0, 0.18], rightArm: [-0.35, 0, -0.18], leftLeg: [-0.24, 0, 0.08], rightLeg: [0.24, 0, -0.08] }; - if (pose === "run") return { leftArm: [0.7, 0, 0.35], rightArm: [-0.7, 0, -0.35], leftLeg: [-0.55, 0, 0.12], rightLeg: [0.55, 0, -0.12] }; - if (pose === "sit") return { leftArm: [0.15, 0, 0.05], rightArm: [0.15, 0, -0.05], leftLeg: [1.1, 0, 0], rightLeg: [1.1, 0, 0] }; - if (pose === "fight" || pose === "throw" || pose === "push") return { leftArm: [1.1, 0.2, 0.5], rightArm: [-0.7, -0.2, -0.5], leftLeg: [-0.35, 0, 0.2], rightLeg: [0.45, 0, -0.15] }; - return { leftArm: [0, 0, 0.08], rightArm: [0, 0, -0.08], leftLeg: [0, 0, 0], rightLeg: [0, 0, 0] }; -} - async function captureFrame(context: CaptureContext | null, mode: DirectorRenderMode) { if (!context) throw new Error("3D 视口尚未就绪"); const { gl, scene, camera } = context; diff --git a/web/src/lib/canvas/director/director-scene.ts b/web/src/lib/canvas/director/director-scene.ts index 46d4edab0..7b26fb6c7 100644 --- a/web/src/lib/canvas/director/director-scene.ts +++ b/web/src/lib/canvas/director/director-scene.ts @@ -45,7 +45,7 @@ export function createDirectorObject(primitive: DirectorObject["primitive"] = "b }; } -export function createDirectorActor(name = "演员", position: DirectorVec3 = [0, 0, 0], color = DIRECTOR_ACTOR_COLORS[0]): DirectorObject { +export function createDirectorActor(name = "演员", position: DirectorVec3 = [0, 0, 0], color: string = DIRECTOR_ACTOR_COLORS[0]): DirectorObject { return { ...createDirectorObject("box", name, position, color), kind: "actor", diff --git a/web/src/types/canvas.ts b/web/src/types/canvas.ts index da62163e0..750f6b50d 100644 --- a/web/src/types/canvas.ts +++ b/web/src/types/canvas.ts @@ -35,7 +35,7 @@ export type CanvasGenerationBatchMode = "storyboard_image" | "storyboard_video" export type CanvasGenerationBatchStatus = "queued" | "running" | "partial_failed" | "completed" | "cancelled"; export type CanvasGenerationBatchItemStatus = "waiting" | "submitting" | "queued" | "running" | "succeeded" | "failed" | "cancelled"; export type CanvasImageGenerationType = "generation" | "edit"; -export type CanvasWorkflowKind = "free" | "script" | "story_input" | "character" | "scene" | "storyboard" | "shot" | "final" | "styleboard" | "reference_set" | "action_board"; +export type CanvasWorkflowKind = "free" | "script" | "story_input" | "character" | "scene" | "storyboard" | "shot" | "final" | "styleboard" | "reference_set" | "reference_video" | "action_board"; export type CanvasVideoEditOperation = "text_to_video" | "image_to_video" | "extend" | "inpaint" | "replace_element" | "camera_motion" | "style_transfer" | "audio_to_video" | "compare_versions" | "concat"; export type CanvasSkillCategory = "writing" | "storyboard" | "image" | "video" | "utility"; export type CanvasSkillOutputMode = "text" | "json" | "image_prompt" | "workflow";