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";