vignette/docs/avatar-art/personas/P4/review-notes.md
2026-06-28 12:18:20 +09:00

5.7 KiB

P4 Live2D 래스터 파츠 프롬프트 검토 노트

검토일: 2026-06-27

검토 범위

  • 기준: docs/avatar-art/seoyeon/live2d-psd-v2/detailed-parts/detailed-parts-manifest.json
  • 대상: docs/avatar-art/personas/P4/generation-plan.json, docs/avatar-art/personas/P4/prompts/*.txt
  • 요구 조건: 이미지 생성 없음, 시트 금지, 각 파츠는 900x1125 투명 캔버스 기준, alphaBoxoriginPercent 유지

결론

현재 산출물은 바로 이미지 생성으로 넘기면 안 된다. P4 방향성 자체는 맞지만, manifest와 prompt 세트가 서로 다른 runner 출력이 섞인 상태로 보인다. 생성 전에 공통 runner로 한 번 더 정규화하는 게 맞다.

이미지 생성 전 차단 항목

  1. generation-plan.json이 현재 brow-sad-left 1개 파츠만 담고 있다.

    • 기준 manifest는 53개 파츠이고, prompts/에는 53개 txt가 있다.
    • plan의 parts는 기준 manifest 53개와 1:1로 맞아야 한다.
    • 각 part에는 최소 id, file, alphaBox, originPercent, promptFile, priority가 필요하다.
  2. prompt 계약이 섞여 있다.

    • brow-sad-left.txt는 영어 runner 형식이며 #00ff00 크로마키 배경과 "later normalization to 900x1125"를 지시한다.
    • 다른 다수 prompt는 900x1125 투명 PNG를 직접 요구한다.
    • 사용자 요구는 "900x1125 투명 캔버스"라서 최종 계약은 투명 PNG 기준이어야 한다. 중간 생성이 크로마키라면 plan에 후처리 단계를 명시해야 한다.
  3. 52개 prompt 첫 줄에 리터럴 $id가 남아 있다.

    • 예: Live2D 래스터 파츠 $id 단일 PNG 생성
    • 모델이 실제 파츠명을 이해하지 못할 수 있으니 각 파일의 실제 part id로 치환해야 한다.

P4 캐릭터 방향성 보정

  • P4 하늘은 "고2, 학업/시험 불안, 완벽주의, 수면 부족, 자기검열"이 핵심이다.
  • 울음이나 공포를 크게 키우기보다, 성실한 학생이 버티고 있는 긴장감이 보여야 한다.
  • 머리: 기존 first-party P4 설정과 맞게 긴 생머리, 다크 브라운 계열을 유지한다.
  • 눈: 큰 감정보다 피로한 상안검, 미세한 눈 밑 피로, 조심스러운 정면 시선이 좋다.
  • 교복: 단정한 네이비 그레이 교복, 학교명/로고/문자 없음. 시험기간의 약한 구김 정도만 허용한다.
  • 표정: 기본은 anxious에 가까워야 한다. sad도 울음보다 걱정과 압박감 중심으로 둔다.

파츠별 보정 제안

  • hair-back-base: 기준 manifest의 alphaBoxnull이다. 새 픽셀을 만들지 말고 완전 투명 placeholder로 처리하거나 생성 대상에서 제외하는 게 맞다.
  • tear-left, tear-right: 큰 눈물방울보다 눈가 수분감/고인 눈물 오버레이로 제한해라. P4는 위기/비탄 캐릭터가 아니라 시험 불안 캐릭터다.
  • brow-sad-left, brow-sad-right: "crying"보다 "anxious / worried brow"로 재명명하거나 prompt 안에서 걱정 중심이라고 명시해라.
  • mouth-anxious: 자동사고 문장을 직접 넣으면 출력에 글자가 생길 위험이 있다. 문장은 빼고 "입술을 살짝 누른 긴장선"처럼 시각 묘사로만 두는 편이 낫다.
  • eye-left, eye-right: 통합 눈 파츠와 세부 눈 파츠가 함께 있으니, runner가 실제로 둘 다 생성한다면 서로 중복되지 않도록 용도를 명시해야 한다.
  • outfit, outfit-inner, outfit-outer: 세 파츠는 겹침이 크다. 전체 outfit은 preview 합성용, inner/outer는 분리 리깅용이라고 역할을 분명히 적어라.

Priority 제안

  • P1: face-base, face, hair-front, hair-bangs, hair-back-left, hair-back-right, body, outfit
  • P2: neck, clavicle, outfit-inner, outfit-outer, ribbon, ear-left, ear-right, hair-side-*
  • P3: eye-white-*, iris-*, pupil-*, highlight-*, lash-*, eyelid-*, nose, blush-*
  • P4: brow-left, brow-right, brow-sad-left, brow-sad-right, mouth-neutral, mouth-open, mouth-anxious
  • P5: mouth-warm, mouth-tired, mouth-sad, mouth-startled, mouth-open-small, tear-left, tear-right, hair-back-base

P4의 기본 표정이 anxious라서 brow-sad-*, eyelid-*, mouth-anxious는 일반 파생 표정보다 먼저 확인하는 편이 낫다.

Runner 보정 체크리스트

  1. 기준 manifest 53개 파츠를 그대로 읽어 plan의 parts를 다시 만든다.
  2. prompt 파일 수, plan parts 수, 기준 manifest parts 수가 모두 53인지 확인한다.
  3. 모든 prompt에서 $id placeholder가 0건인지 확인한다.
  4. alphaBoxoriginPercent가 기준 manifest와 정확히 같은지 확인한다.
  5. 배경 계약을 하나로 고정한다. 최종 산출물이 투명 PNG라면 prompt와 plan 모두 그 기준으로 써라.
  6. sheet, sprite sheet, grid, multiple variants, text, logo, watermark 금지를 모든 prompt에 유지한다.

빠른 검증 커맨드

$ErrorActionPreference = 'Stop'
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)

$base = 'D:\workspace\vignette\docs\avatar-art\personas\P4'
$source = Get-Content 'D:\workspace\vignette\docs\avatar-art\seoyeon\live2d-psd-v2\detailed-parts\detailed-parts-manifest.json' -Raw -Encoding UTF8 | ConvertFrom-Json
$plan = Get-Content (Join-Path $base 'generation-plan.json') -Raw -Encoding UTF8 | ConvertFrom-Json

[pscustomobject]@{
  SourceParts = $source.parts.Count
  PlanParts = @($plan.parts).Count
  PromptFiles = @(Get-ChildItem (Join-Path $base 'prompts') -Filter '*.txt').Count
  IdPlaceholders = @(Select-String -Path (Join-Path $base 'prompts\*.txt') -Pattern '\$id').Count
}