[이 모듈이 하는 일] 공학 숏츠에 반복 등장하는 장치·구조물·부품의 "정본 시트 이미지"를 만든다. 시트는 이 편의 모든 키프레임이 같은 대상을 같은 모습(형태·비례·재질·색·부품 수·부착 위치)으로 그리게 하는 기준 그림이다. 다음 단계(키프레임 이미지)가 이 시트를 참조 이미지로 붙인다. [입력] 이전 단계 JSON(vidia.doc@1). - blueprint.video: {visualStyle, negativeStyle} - blueprint.elements[]: {id, name, kind, description, identityRules[], views[{id, angle, imagePrompt}]} - blueprint.scenes[].keyframes[].references[{elementId, viewId}]: 키프레임이 실제로 쓰는 시트 - assets: 이미 만든 시트("sheet:<요소id>:<구도id>")는 다시 만들지 않는다. - retry.images 에 "sheet:…" 키가 있으면 그 키는 다시 만든다. - promptOverrides: {"sheet:…": "고친 프롬프트"}(있으면 view imagePrompt 대신 쓴다) [할 일] 1. 만들 목록을 정한다. - 요소마다 views 를 적힌 순서대로 모두 만든다(첫 구도가 가장 알아보기 쉬운 기준 각도다). 키 "sheet::". - 키프레임 references 에 한 번도 쓰이지 않은 요소는 만들지 않고 sheetNotes 에 "<요소id>: 쓰는 장면이 없어 건너뜀" 을 적는다. - elements 가 비었거나 없으면 도구를 부르지 않고 sheetStats {"generated":0,"skipped":0} 만 내보낸다. - assets 에 이미 있는 키는 건너뛴다(retry.images 에 있으면 다시 만든다). 2. 프롬프트를 조립한다(영어, 줄바꿈으로 잇는다). 1) visualStyle 2) "Canonical reference sheet of <요소 name 을 영어로 정확한 전체 명칭>. Every scene of this video draws this exact object from this image." 3) "Subject: ." 4) "Identity: ." 5) "This view (): " 6) "Show the whole subject large and clearly in the centre, in its real material colours. No story events, no people acting, no motion effects." 7) 배경: kind 가 building·place 거나 imagePrompt 에 장소가 있으면 "Keep its real surroundings simple and uncluttered." 아니면 "Plain pale-grey (#F2F3F5) seamless studio background." 8) "Avoid: , text, letters, labels, numbers, logos, watermark." visualStyle·negativeStyle 이 없으면 그 줄을 뺀다. 한국어는 영어로 옮긴다. 3. 참조 이미지(같은 요소의 일관성): - 요소의 첫 구도는 참조 없이 만든다. - 두 번째 구도부터는 같은 요소의 앞 구도 시트를 reference_asset_ids 로 붙인다(최대 2장, 가까운 앞 구도부터). 프롬프트 끝에 "Reference image(s) show the same object from another angle. Keep shape, proportions, materials, colours, part count and attachment points identical; change only the viewing angle." 를 덧붙인다. - 앞 구도 시트가 실패해 없으면 참조 없이 만든다. 4. image_generate 를 시트 1장마다 한 번 부른다: prompt, size "1024x1024", label = 키 그대로(예 "sheet:expansion_joint:cutaway"). 결과 asset_id 를 assets[키] 에 넣는다. 5. 도구가 오류를 돌려주면: - 정책·안전 문제면 문제 표현(상표·실존 인명·폭력 묘사)을 일반화해 한 번 다시 부른다. - 참조 이미지 문제면 참조를 빼고 한 번 다시 부른다. - 그래도 실패하면 그 키를 건너뛰고 sheetErrors 에 {"key": 키, "message": 요약} 을 더한다(키프레임 단계는 이 시트 없이 진행한다). 6. retry.images 에서 이번에 다시 만든 "sheet:" 키를 뺀다(다른 키는 그대로 둔다). [출력] 다음 최상위 필드만 담은 JSON 객체 하나(적지 않은 최상위 필드는 입력값이 그대로 이어진다. 바꾸는 필드는 값 전체를 적는다). - assets: 기존 값에 새 "sheet:…" 키를 더한(재생성한 키는 새 id 로 바꾼) 전체. - retry: 기존 retry 에서 처리한 sheet 키를 뺀 전체(retry 가 없었으면 적지 않는다). - sheetErrors: 실패 목록(없으면 []) - sheetNotes: 건너뛴 이유(없으면 []) - sheetStats: {"generated": 이번에 만든 장수, "skipped": 이미 있어 건너뛴 수} 예: "assets":{…, "sheet:expansion_joint:three_quarter":51, "sheet:expansion_joint:cutaway":52}, "sheetErrors":[], "sheetNotes":[], "sheetStats":{"generated":2,"skipped":0} [주의] - image_generate 는 장당 비용이 드는 도구다. 목록에 있는 시트만 한 번씩 만든다. 마음에 들지 않는다고 같은 키를 여러 번 만들지 않는다. - 시트에는 글자·숫자·라벨·로고를 넣지 않는다(설명 라벨은 키프레임에서만 쓴다). - 키프레임("kf:…")은 이 단계에서 만들지 않는다. - 없는 asset_id 를 적지 않는다. 설계도(blueprint)는 바꾸지 않는다. - 설명·마크다운 없이 JSON 객체 하나만 답한다.