見出し画像

# ローカル画像生成でゲーム用モンスター217種を描いた記録 — 実測でひっくり返った5つの思い込みと、次に持ち出す設定値の全部



自作の配合ゲーム用に、モンスター217種 × 3カット(正面・固有アクション・配合)の絵を、
**外部APIを一切使わず手元の GPU だけで**作った。生成AIサービスの月額も従量課金もゼロで、
かかったのは電気代と、思い込みが順番に潰れていく2週間だけだった。

この記事は前半と後半で読者を変えている。

- **前半**は読み物。作業前に「たぶんこうだろう」と思っていたことが、実測でどう裏返ったかを5つ書く。
- **後半**は備忘録。環境・コマンド・採用値・不採用リストを、**Claude Code に丸ごと読ませて次の別プロジェクトの初期設定に使える形式**で並べる。人間が読むと退屈だが、そのために書いている。

---

# 前半:実測でひっくり返った5つの思い込み

## 何を作ろうとしていたか

モンスターを配合して増やすゲームで、種族が217種ある。ただし内部構造は
**「型30種 × 属性7色」**で、217種すべてが30種の型に収まる(★5伝説の7種だけ例外的に個別)。
だから絵も「型を1枚描いて7色に展開する」で作れるはずだった。

必要なのは、217体を一覧に並べたときに**同じ絵柄に見えること**。1枚の完成度より、
217枚の揃い方のほうが重要な仕事だった。ここが最初の思い込みの入り口になる。

## 思い込み1「seed を固定すれば画風は揃う」

揃わなかった。

最初に試した Illustrious XL で、seed・サンプラー・ステップ数を完全に固定したまま
プロンプトの型の部分だけを差し替えて3型を出した。3枚とも**別の絵柄**で出てきた。
さらに、背景の指定とネガティブプロンプトを少しいじっただけで色が全部飛び、
鉛筆スケッチ調になった上に、なぜかキャラ設定シート風の「2体並び」になった。

seed は同じサイコロを振り直さないための仕掛けであって、**サイコロの中身が変われば結果は変わる**。
プロンプトを1語でも変えれば入力は別物で、seed の固定は再現性を保証するだけだ。
「画風の一貫性」はモデル自身の性質であって、こちらのパラメータ管理でどうにかなるものではない。

ここで作業の目的が変わった。**探すのは「良い絵が出るモデル」ではなく「プロンプトを変えても画風が崩れないモデル」**になった。

## 思い込み2「モデルは、綺麗な絵が出るほうを選ぶ」

3つのモデルを同じ条件で比較した。

| モデル | 出た絵 | 判定 |
|---|---|---|
| Illustrious XL | 単体では一番うまい。ただしプロンプトを少し変えるだけで画風が崩壊する | 不採用 |
| Pony Diffusion V6 XL | 画風は安定する。が、指示に従わない。正面を指定して3体とも横向きの座り姿勢、背景が勝手に灰色、意匠が出ない、絵に署名まで入る | 不採用 |
| **FLUX.1 Schnell** | プロンプトを変えても画風を保つ。太い主線とフラット塗りで3型が揃い、画角の指定にも従う | **採用** |

面白いのは、**単体で一番うまかったモデルが真っ先に落ちた**ことだ。
30型を同じ共通プロンプトで回す以上、評価軸は「1枚の質」ではなく「差分を入れたときの分散」になる。
1枚だけ見て選んでいたら、間違いなく Illustrious を選んでいた。

比較は**同じ seed・同じ解像度・同じ3型**で、変数をモデルだけにして撮った。
この「1回に1変数」は以降ずっと守っていて、後半のほぼ全ての知見はこの形で得ている。

そしてもうひとつ、選定で効いたのが**ライセンス**だった。FLUX.1 Schnell は Apache-2.0 で、
商用利用に条件が付かない。同じ FLUX でも dev 系は非商用なので、
「絵が良いほう」で選ぶと後から出口が塞がる。実際、途中で採用した FLUX.1 Redux は dev 系ライセンスなので、
**アクション絵の工程だけ非商用の部品が混ざっている**(承知のうえで進め、商用化するなら差し替える、と決めた)。

## 思い込み3「属性の色は、プロンプトに色の語を足せば出る」

炎・水・自然・氷・雷・光・闇の7色に展開したい。
同じ seed で「炎の」「水の」「自然の」だけ足して3枚出した。

**3枚とも別の生き物になった。** 体型が変わり、耳の形が変わり、首輪の意匠が変わり、
斑紋も尻尾も別物になった。色を足したつもりが、造形ごと引きずられていた。

拡散モデルにとって色語は「色だけを指すスイッチ」ではなく、
その語が引き寄せる**画像全体の分布**を動かす。「炎の獣」は色以外も炎の獣なのだ。

結局こうなった。

| 案 | やり方 | 結果 |
|---|---|---|
| 案1 | プロンプトに色語を足して生成し直す | **不採用。**3属性が3体とも別の生き物 |
| 案2 | 生成した1枚をプログラムでパレット置換する | 造形は完全一致するが、平板で「ただの色違い」 |
| **案3** | **案2の出力を種にして、低い強度で描き直す** | **採用。**造形は一致したまま陰影と線が戻る |

採用したのは**2段構え**だ。まず1枚を生成し、それをコードで塗り替え、
その塗り替えた絵を種にして img2img を「弱く」かける。強度(denoise)は 0.45 で固定。
上げると別の生き物に戻り、下げるとただの色塗りに戻る。狭い谷を1つ見つけた形になる。

ここには続きがあって、**単純なパレット置換では配色が単調になる**(炎は全身が赤い)という
外部レビューの指摘を受けて、塗りのアルゴリズム自体を作り直した。
原因はグラデーションマップが明度1軸だったことで、「同じ明るさは必ず同じ色」になるため、
元絵がどれだけ塗り分けられていても出力は単一色相に潰れていた。

面白かったのは、その手当てを探す過程で**プロンプト側の案が全部死んだ**ことだ。
「補色のワンポイントを置け」と書いても18枚すべてで書いた版と書かない版の区別がつかない。
効いたのは**元絵の彩度が上位5%の画素だけを別の色で塗る**という、完全にコード側の処理だった。
作者が意図的に色を変えた部位(首輪・虹彩・爪・岩のひび割れ)だけが自然に染まる。
しかもその差し色は img2img を生き残るどころか、FLUX が意味のあるパーツとして整え直してくれる。
首輪はビーズになり、岩のひび割れは発光する継ぎ目になった。

**プロンプトで解けない問題が、画像処理では2行で解けることがある。**
生成AIの作業だからといって、全部をプロンプトで解こうとしなくていい。

## 思い込み4「変な絵が出たら、ネガティブプロンプトで消せばいい」

これが一番はっきり裏返った。

作業中に出た不具合を5件、順番に記録している。真横を向く/頭が2つ生える/
機械型だけ3Dレンダーになる/脇腹に崩れた漢字みたいな模様が出る/浮遊型がロープで吊られる。

**ネガティブプロンプトに語を足して止まったものは、5件中0件だった。**
そして5件とも、**本文の書き方を直したら消えた**。

| 症状 | 真因 | 直し方 |
|---|---|---|
| 6枚とも真横 | 本文に「体を左へ向けろ」と書いていた。ネガの `side view` では止まらない | 「回さない部分」のほうを書く |
| 双頭 | 体の向きと顔の向きを別々の文で指定した | 向きは1文で1回だけ言い、「頭は1つ」と明示する |
| 機械型だけ3Dレンダー | 絵柄の指定が末尾にしかなく、「機械」という主題が3Dを呼ぶ力に負けていた | 絵柄の指定を**前後の両端に**置いて挟む |
| 崩れた漢字 | 「毛皮に和柄の模様」と書いていた。体表に文様と言うとモデルは文字を描く | 文様は**付属物(首輪)の上**に限定する |
| ロープで吊られる | `hanging in the air` が「吊るされている」と読まれた | 「何にも支えられずに浮いている」と書く |

さらに後から、**なぜネガが効かないのかの理由**が分かった。
採用した FLUX.1 Schnell は CFG 1.0 で動くモデルで、この設定では**ネガティブ側の条件が原理的に働かない**。
つまり「これを消せ」という減算方向の指示は届かない。密度を下げる、線を減らす、という指示も同じ理由で全滅した。

これが分かってから、**指示は全部「足す方向」で書く**ようになった。
「密度を落とす」ができないなら、「濃い側を足して差を作る」しかない。
実際、デザイン密度が一様だという指摘への手当ては、構図の抽象語でも減算指示でもなく、
**素材の対比を2つ書く**(荒い毛と、滑らかな肉球)で解決した。

もうひとつ、これと双子の教訓がある。**本文とネガが逆を言うと、モデルは逃げ道を作る。**
配合カットで「左を向け」と本文に書いたのに、共通のネガが「横向き禁止」を弾き続けていた種族があり、
その1型だけ**頭が2つ生えた**。「顔は正面・体は横」を両立させる唯一の解がそれだったわけだ。
画角を差し替えたポーズは、必ずネガも対で差し替える。今はテストでそれを機械的に固定してある。

## 思い込み5「仕様が正で、絵を仕様に合わせる」

これが一番、作業の性格を変えた。

図鑑の説明文は既に217件を手書きで持っていた。そのうち**62件(29%)が「角がつららのように鋭く伸びる」
「背に苔を生やした」のような、純粋な色違いでは絶対に出せない特徴**を書いていた。
最悪だったのは角型で、7属性ぶんの説明文がほぼ全部「角の形」の話をしていた。
リカラー方式の取り柄は造形が完全一致することなので、**7通りの角は原理的に作れない**。

そこで「表面の意匠くらいなら、2段目の img2img で英語1句足せば出るのでは」を実測した。
角型の7属性それぞれに、説明文どおりの意匠句を与えた。

**7つとも1つも出なかった。** 角の形も牙の位置も首輪の文字まで完全に同一で、色だけが違う。
骨格どころか、表面の意匠とみなしていた発光・放電・艶すら出なかった。
描き直しの強度を 0.45 → 0.65 → 0.80 と上げても角は変わらず、
**特徴が乗る前に「同一人物である」ほうが先に壊れた**。

ここで判断した。**絵は動かせない。動くのは説明文のほうだ。**

説明文を3層に分けて、層ごとに扱いを変えた。

| 層 | 例 | 扱い |
|---|---|---|
| 生態・言い伝え・行動 | 「焚き火のそばに寄ってくる」 | **自由に書く。ここで個性を出す** |
| 色・発光・温度感 | 「淡く凍てついた色の角」 | 使える。ただしパレットとの突き合わせが要る |
| 造形(骨格・付属物・表面の意匠) | 角の形・翼の構造・苔・霜・斑紋 | **説明文から外す** |

- ❌「角がつららのように鋭く伸びる獣。雪山の稜線を跳ぶように移動する」
- ⭕「淡く凍てついた色の角を持つ獣。雪山の稜線を跳ぶように移動する」

62件を書き直した。判定の線引きは「**絵を描き直さないと成立しない主張か**」の一点だけ。

そして結果的に、**図鑑としてはこちらのほうが読み物になった。**
個性を「形」で出そうとすると絵の制約に真正面からぶつかるが、
「振る舞いと来歴」で出すぶんには制約がない。制約に合わせて書き直したら、テキストとして良くなった。

## おまけ:「たくさん書けば効く」も違った

関節のない型(車輪・花・霧・粘体)がアクションカットでどうしても直立から動かない、という問題があった。
プロンプトを500字から1444字まで5段階に増やして測った。**動きは1ミリも増えなかった。**

効いたのは量ではなく**指示の宛先**だった。増やしていたのは全部「体をこう曲げろ」という被写体への指示で、
関節がない型にはその指示に応じる部位が存在しない。何字盛っても無意味だった。
被写体をやめて**画面と地面に指示を出す**(画面を傾ける/地面を荒らして飛沫と軌跡を出す)と、
関節を一切要求しないので全型で成立した。

ついでに分かったこととして、**プロンプトの形式は品質に関係ない**(カンマ区切り1行でも、
ラベル付きの設計書形式でも、差が出ない)。ということは長さの予算は空いているので、
新しい指定を1つ足すコストはゼロと見なしてよい——という判断ができるようになった。

ただし例外がある。**前方に置いた句は、効きが強いだけでなく構図の取り分も奪う。**
目の描き方を強い位置に長く書いたら、その分だけ画面の予算が頭に回って**頭でっかちになった**。
長さは品質に影響しないが、**前方の長さは構図を動かす**。ここは区別がいる。

## 現在地

★1〜★5、全217体 × 3カット(正面・固有アクション・配合)を生成し終えた。
バッチ実行は事故ゼロで、途中で ComfyUI が静かに死んでも同じコマンドを叩けば続きから走る作りにしてある。
未実装なのは背景の透過処理と画角の正規化で、そこは画像処理の仕事なので生成AIの出番ではない。

以下、後半は環境と設定値の備忘録になる。

---

# 後半:環境・設定値・不採用リスト(Claude Code に読ませる用)

> ここから先は、**次の別プロジェクトで AI コーディングエージェントに読ませることを想定した形式**で書いている。
> 値・コマンド・ファイル構成をそのまま流用できるように、散文を避けて表と箇条書きで並べる。

## 1. 環境

| 項目 | 値 |
|---|---|
| GPU | AMD Radeon RX 9070 XT(gfx1201) |
| ランタイム | ROCm 7.14 / torch 2.12.0+rocm7.14.0 |
| 生成フロントエンド | ComfyUI(`C:\ComfyUI` — **リポジトリ外に置く**) |
| Python | `C:\ComfyUI\venv\Scripts\python.exe`(3.12.13) |
| 物理RAM | 61.6GB |
| OS | Windows 11 Pro |

**NVIDIA でなくても動く。** AMD + ROCm で ComfyUI と FLUX がそのまま動く。
Windows 上の PyTorch も ROCm ビルドが提供されている。

### 起動コマンド

```bash
cd /c/ComfyUI && ./venv/Scripts/python.exe main.py --cuda-device 1 --listen 127.0.0.1 --port 8188
```

- **`--cuda-device 1` は必須。** device 0 は CPU 内蔵GPU(gfx1036・1CU)で、
指定しないとそちらを掴んで実用にならない。**この1行に一番時間を溶かした。**
- 起動に20〜30秒かかる。準備完了の確認は `curl -s http://127.0.0.1:8188/system_stats`。
- VRAM 断片化による OOM が起きるなら、起動時に
`PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True` を付けると再発しない。

### 未解決の環境問題(**次のプロジェクトでも踏む可能性が高い**)

**FLUX のチェックポイントは 17.2GB あり、これはコミットメモリの空き次第でしか読み込めない。**
物理RAM が 61.6GB あってもページファイルが小さいとコミット上限で頭打ちになる。

| 症状 | 見え方 |
|---|---|
| 症状1 | `OSError: ページング ファイルが小さすぎるため、この操作を完了できません。 (os error 1455)` |
| 症状2 | `--disable-pinned-memory` を付けると segfault(exit 139) |
| 症状3 | ComfyUI が **exit 0 で静かに死ぬ**。クライアント側は `ConnectionResetError` → 以後 `ConnectionRefused`。クラッシュログのスタックは `_safetensors_rust.pyd`(17GB のメモリマップ失敗) |

- **空きが26.8GB あっても落ちることがある**。再現性がないので原因の切り分けが難しい。
- **対処は「ComfyUI を再起動して同じコマンドをやり直す」。** 同じコマンドが後で成功する。
- 恒久対策はページファイルの拡張(初期32GB / 最大64GB)。
- 空きの確認:
```bash
powershell -c "$os=Get-CimInstance Win32_OperatingSystem; 'コミット上限: {0:N1}GB / 空き: {1:N1}GB' -f ($os.TotalVirtualMemorySize/1MB),($os.FreeVirtualMemory/1MB)"
```

**→ 一括生成ツールは「出力済みを飛ばして再開できる」ことが必須。** あると便利な機能ではない。

## 2. モデル

| モデル | ファイル | サイズ(bytes) | ライセンス | 判定 |
|---|---|---|---|---|
| **FLUX.1 Schnell** | `flux1-schnell-fp8.safetensors` | 17,236,328,572 | **Apache-2.0** | **採用**(UNet+CLIP+T5+VAE 全部入り) |
| FLUX.1 Redux | (img2img の代替。参照画像で見た目を条件付け) | — | dev系=**非商用** | 採用(アクション絵のみ・商用化時は要差し替え) |
| Illustrious XL v1.0 | `Illustrious-XL-v1.0.safetensors` | 6,938,040,736 | — | 不採用(画風が崩壊する) |
| Pony Diffusion V6 XL | `ponyDiffusionV6XL.safetensors` | 6,938,041,050 | — | 不採用(指示に従わない) |

- 大きいファイルのダウンロードは **curl を1本だけ**走らせる。2本が同じパスに書くと無言で壊れる。
- **サイズ照合だけで完了と判断しない。必ず sha256 も見る。**

## 3. 固定パラメータ

| 項目 | FLUX 系 | SDXL 系(不採用モデル) |
|---|---|---|
| 解像度 | 1024×1024 | 1024×1024 |
| sampler | `euler` | `euler_ancestral` |
| scheduler | `simple` | `normal` |
| steps | 4 | 30 |
| CFG | 1.0 | 5.0 |
| seed | 20260802(固定) | 同 |
| 品質トリガー接頭辞 | **付けない**(自然文で読むので逆効果) | 必要(`masterpiece, best quality, …` / `score_9, …`) |

**CFG 1.0 なのでネガティブプロンプトは働かない。** これが前半の思い込み4の根拠。

| img2img / Redux の運用値 | 値 | 備考 |
|---|---|---|
| 属性展開の denoise | **0.45 固定** | 上げると別個体・下げると平板 |
| denoise の崖 | 0.80 と 0.82 の間 | 「元絵を保つ/別個体になる」がここで切り替わる。**連続ではない** |
| Redux 強度(関節のある型) | **0.38** | 0.30 は動くが色が化ける。0.46 で動きが死ぬ |
| Redux 強度(塊・根を張る型 11型) | **0.22** | これ以上下げても姿勢は変わらない |
| Redux `attn_bias` | 0.15〜0.30(既定 0.3) | 0.0 で黒く潰れる。0.45 以上で直立に戻る。`multiply` は使わない |
| 差し色の面積 | 彩度**上位5%** | 絶対値の閾値では型ごとに効きが違いすぎる |
| 差し色の色相 | 基本色から**±60°以内**(類似色) | 補色は「塗った」ように見える。類似色は「そういう部品」に見える |
| 塗りの色相回転 | keep 0.55 / shift 34° / sat_pull 1.0 / hold 1.0 | 順序が決定的(回転→シフト。間にグラデーションマップを挟み直さない) |

## 4. パイプライン(型ベース方式)

```
[1] txt2img で「型」を1枚生成 …… 30型 × レア度

[2] コードでパレット置換(GPU不要・数秒) …… 7属性ぶん
↓ + 彩度上位5%に差し色
[3] img2img(denoise 0.45)で描き直す …… 陰影と線を戻す

[4] 完成(造形は完全一致・色だけが違う)
```

**カットごとに作り方が違う。ここを混同しない。**

| カット | 方式 | 理由 |
|---|---|---|
| 正面(図鑑) | 型ベース(上図) | 全種族が同じ姿勢なので型から展開できる |
| 固有アクション | **型ベースを持たない。**その個体の正面絵を Redux の参照に渡して1体ずつ | 動きが種族ごとに違う。img2img は構図まで持ち込むので使えない |
| 配合 | 型ベース(`--pose breed`)。**Redux は使わない** | 全種族が同じ場面。Redux だと参照の正面向きが勝って向きを変えられない |

- 配合は**左向き1枚だけ生成し、右側の親は水平反転**して使う。
- **エフェクトは絵に焼き込まない。** UI 側で重ねる(属性・レア度で出し分けられる)。
- 額縁・レア度枠・属性アイコンも同様にクライアント側で描く(焼き込むと再生成が必要になる)。

## 5. プロンプトの部品表(12スロット)

```
{STYLE_LEAD}, {CAMERA}, {LINEAGE_LEAD}, {RARITY}, {EYES}, {EYES_GUARD},
{POSE}, {COLOR}{SUBJECT}, {SIGNATURE}, {MOTIF}, {MATERIAL}, {STYLE}
```

| 部品 | 単位 | 本数 | 置き場所の理由 |
|---|---|---|---|
| `STYLE_LEAD` | 共通 | 1 | **必ず最前。**末尾の `STYLE` だけでは絵柄が保たない |
| `CAMERA` | 共通 | 1 | FLUX は前方トークンを重く見る。ポーズ専用の画角があればそれに差し替え |
| `LINEAGE_LEAD` | 系統 | 10 | トーン(荘厳・幽玄・無機質)**だけ**。文化・地域の指定はしない |
| `RARITY` | レア度 | 5 | **★1〜2 に `simple` と明記するのが必須**(書かないと勝手に盛って格差が消える) |
| `EYES` | 系統 | 10 | **瞳の作りだけ**を言う。大きさ・表情は SUBJECT の担当 |
| `EYES_GUARD` | 共通 | 1 | 目の直後に画角を再指定(頭でっかち対策) |
| `POSE` | ポーズ | 4 | **立ち姿の語を書かない**(脚のない型と衝突する) |
| `SUBJECT` | 型 | 30 | 姿勢(四足か直立か)もここ |
| `SIGNATURE` | 型 | 30 | SUBJECT の**直後**(前に出すと画角を奪う)。外へ突き出す部位を1個だけ名指す |
| `MOTIF` | 系統 | 10 | 体に付いている具体物。**抽象語は効かない** |
| `MATERIAL` | 型 | 30 | **主素材+対比する部位の素材の2つ**。1つでは密度差にならない |
| `STYLE` | 共通 | 1 | 触らない |

### スロットを足すときの規則(実測で確定した3つ)

1. **前方は効きが強いが構図の取り分も奪う。** 造形の話は SUBJECT の直後、表面の話は末尾寄りでよい。
2. **FLUX は足さずに置き換える。** SUBJECT が既に名指している名詞を新スロットで使うと、
新しい部位が生えるのではなく**元の部位が消える**。名詞が被ったら書き直す。
3. **同じことを2箇所に書かない。** 弱い位置にある記述は一度も絵に出ないまま、
強い位置の記述と矛盾を起こす。

## 6. ツール構成と CLI

```
tools/imagegen/
prompts.py 部品表(1174行)。30型・10系統・4ポーズ。組み立ては build_positive() 1関数
gen.py ComfyUI を叩く層だけ(386行)。txt2img / img2img / Redux
recolor.py パレット置換・差し色・色相回転(391行)
batch.py 一括実行(348行)。**出力済みを飛ばして再開できる**
sheet.py / shrink.py 目視レビュー用のシート作成
check_descriptions.py 説明文の色語矛盾・造形語を機械検出
ASSET_SPEC.md 何を何枚どの角度で作るかの正本(v39 まで実測を追記)
HANDOVER.md 環境・モデル比較・未解決問題
```

```bash
# プロンプトだけ確認(ComfyUI なしで動く)
python tools/imagegen/gen.py wraith --pose attack --style flux --dry-run
```

```bash
# 1枚生成
"C:/ComfyUI/venv/Scripts/python.exe" tools/imagegen/gen.py beast --ckpt flux1-schnell-fp8.safetensors --style flux --out docs/images/out.png
```

```bash
# 属性7色(1段目・GPU不要/2段目・属性ごとに1回)
"C:/ComfyUI/venv/Scripts/python.exe" tools/imagegen/recolor.py docs/images/v4_flux_beast.png --out-dir docs/images --prefix v5_recolor_beast
"C:/ComfyUI/venv/Scripts/python.exe" tools/imagegen/gen.py beast --ckpt flux1-schnell-fp8.safetensors --style flux --element fire --init docs/images/v5_recolor_beast_fire.png --denoise 0.45 --out docs/images/v5_hybrid_beast_fire.png
```

```bash
# レア度ごとの一括実行(同じコマンドを叩き直すと続きから走る)
python tools/imagegen/batch.py --rarity 1 --dry-run
python tools/imagegen/batch.py --rarity 1
python tools/imagegen/batch.py --rarity 1 --pose breed
python tools/imagegen/batch.py --rarity 1 --action
```

`batch.py` の主要オプション:

| オプション | 用途 |
|---|---|
| `--only fm_horn,fm_beast` | 型を指定して撮り直す |
| `--seed 7002` | 型ごとに seed の当たり外れがある。目視で落ちた型だけ振り直す |
| `--force` | 出力済みでも作り直す |
| `--repaint` | `--force` と併用し、**型ベースだけは撮り直さない**(txt2img は同じ seed でも同一の絵になる保証がないため、造形を保つには撮り直してはいけない) |
| `--no-accent` | 差し色を置かない |
| `--redux-strength` | 未指定なら型ごとの既定値(0.38 / 0.22) |
| `--dry-run` | 対象一覧だけ出す |

- 失敗した種族は出力ファイルが無いので、**同じコマンドをもう一度叩けば拾い直せる**。
- ComfyUI が落ちたときのリトライは2回・30秒待ち。復帰しなければその1体を諦めて次へ進む
(1体の失敗で全体を止めない)。

## 7. 出力形式

| 段 | 解像度 | 形式 | 置き場所 |
|---|---|---|---|
| 生成直後 | 1024 | PNG(白背景) | ローカル。**コミットしない**(400KB × 868 ≈ 350MB で git が壊れる) |
| 正本 | 512 | WebP(透過) | リポジトリ(≈35MB) |
| アイコン | 128 | PNG(透過) | アプリ同梱。217枚 ≈4MB |
| 戦闘用 | 512 | WebP(透過) | API 配信。同梱しない |

- 命名は `{species_id}_{pose}.png`、中間物は `base_{form_id}_{pose}.png` と**名前空間を分ける**。
- **アイコンは全身の縮小にする(バストアップにしない)。** 識別子は型=シルエットであって顔ではない。
128px で7色すべて判別できることを確認済み。
- 角度は **3/4(斜め前)**。完全正面だと四足の胴が消えてシルエットで型が読めない。

## 8. 試したが入らなかったもの(**証拠として残してある**)

| 項目 | なぜ入らなかったか |
|---|---|
| Illustrious XL / Pony Diffusion V6 XL | 上記モデル表のとおり。ファイルは消さずに保持 |
| 案1:プロンプトに色語を足して属性展開 | 3属性が3体とも別の生き物になった |
| 案2:パレット置換のみ(img2img なし) | 造形は一致するが平板。案3の1段目として生き残った |
| `--detail` / `DETAILS`(種族固有の意匠句) | 角型7属性で7回中0件。denoise を上げても意匠より先に同一性が壊れる。**コードは残す**(不採用の証拠) |
| 和風縛り(神社・狛犬・注連縄・浮世絵) | 種族名(炎装兵ヴァルカ/世界樹ユグドラ/深海竜リヴァイア)と食い違う。**基準は「種族名と絵が噛み合うこと」の1点だけ**にした |
| 4ポーズ(idle/attack/damaged/victory) | 中止。**必要なのは正面・固有アクション・配合の3種類**だった。副産物として 2048px シートは落ちずに生成できると分かった |
| 補色の差し色 | 玩具・化粧に見える。類似色に変更 |
| ネガティブプロンプトによる不具合修正 | 5件中0件。CFG 1.0 では原理的に届かない |
| あおり(低い画角)でのポーズ付け | 被写体が大きく写るだけで姿勢は変わらず、全身が枠から切れた |
| squash-and-stretch で塊型を動かす | 効かない。丸い塊のシルエットは動かせないと受容した |
| プロンプトの長文化(500→1444字) | 動きは増えない。効くのは量ではなく宛先 |
| ドット絵の手続き生成パイプライン | 前身の方式。**削除していない**(`src/sprites/` `data/sprite_*.json` `scripts/gen_sprites.py`)。データ構造(型×属性×ポーズ)はそのまま今の入力に流用できた |

## 9. 次のプロジェクトへ持ち出す原則

1. **1回に1変数。** seed・解像度・参照画像・ネガを固定し、測りたいものだけ動かす。
2. **モデルは「1枚の質」でなく「差分を入れたときの分散」で選ぶ。** 量産では後者が支配的。
3. **ライセンスを選定の第一関門に置く。** 出口が塞がってから気付くと全部撮り直しになる。
4. **プロンプトで解けない問題は画像処理で解く。** 色・面積・彩度はコードのほうが確実で速い。
5. **不具合はネガティブではなく本文で直す。** 特に CFG が低いモデルでは減算指示は届かない。
6. **本文とネガが逆を言うと、モデルは奇形という逃げ道を作る。** 画角を替えたらネガも対で替える。
7. **指示の宛先を変える。** 被写体が応えられないなら、画面・地面・光に指示を出す。
8. **前方の句は効きが強いが構図の予算も奪う。** 長さは品質に効かないが、前方の長さは構図に効く。
9. **仕様と絵が食い違ったら、動かせるほうを動かす。** 絵の制約は硬く、テキストは柔らかい。
10. **一括実行は最初から再開可能に書く。** 落ちるのは例外ではなく前提。
11. **不採用の実装を消さない。** 「試したが効かなかった」を後から再確認できることに価値がある。
12. **判断の根拠になった画像と数値を、決定と一緒に残す。** 3週間後の自分は理由を覚えていない。

## 10. 未解決

- 白背景 → 透過の切り抜き(`cutout.py`)が未実装。接地影も一緒に落ちる想定でよいか要確認。
- 画角の正規化(バウンディングボックス → 高さ占有率85% → 接地線)が未実装。
- 魚型・海竜型が真横で出る。3/4 指定が効いていない。実害は小さいが並べると角度が揃わない。
- 無彩色寄りの5型(岩・結晶・車輪・粘体・霧)は色相回転が効かない。壊れはしないが属性差が出にくい。
- 同じ型の★1と★2が色しか違わない。仕様上は筋が通っているが、絵としては格が出ない。
- ページファイル拡張が未実施。実施すれば症状1〜3が消える見込み。

いいなと思ったら応援しよう!