0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「AIでドット絵キャラの構図を自由に変えたい」— DALL-E × PIL × SVGで6パターン試して全部失敗した話

0
Last updated at Posted at 2026-02-21

やりたかったこと

ブランドキャラクターをドット絵で持っていて、ブログのサムネイルやスライドに毎回違うポーズで登場させたい。

要件はシンプルです。

  • ✅ ドット絵として高品質(プロが見ても「ちゃんとしてる」レベル)
  • ✅ 構図・ポーズを自由に変更できる
  • ✅ プログラムで自動化できる(毎回手作業は嫌)

「AIならいけるでしょ」と思って6つのアプローチを試しました。全部失敗しました。

でも失敗から見えたものが面白かったので、全部晒します。

まず、プロのドット絵師から学ぶ

闇雲に試す前に、プロがどうやってドット絵を作っているのか調べました。ここで得た知見が、後の検証の判断基準になっています。

レギュレーション設定が最重要

いちあっぷの解説記事によると、ドット絵はまずレギュレーション(キャンバスサイズ、色数、主線の有無、パレット)を決めるところから始まります。自由に描くのではなく、制約を先に決めるのがドット絵の流儀です。

4ステップフロー

@APO_PLUS_さんの制作過程を見ると、「シルエット → 色置き → 特徴抽出 → 光と影」の4ステップで描いています。いきなり細部から描くのではなく、大きな形から詰めていく。

パーツ取捨選択の極意

@ari_oriさんの名言:「消しましょう。全て。」 — 小さいキャンバスでは描けないパーツは思い切って省略する。ドット絵は「何を描くか」より「何を描かないか」の勝負です。

ゲーム別サイズ・色数の目安

レトログラムの記事によると、歴代ゲームのキャラサイズは:

  • FF(FC): 16×24px
  • ポケモン(GBA): 32×56px程度
  • ロックマン: 24×24px

思ったより小さい。128×128でも「でかい」部類に入ります。

検証1: SVG rect手打ちドット絵

アイデア: Claude(LLM)にSVGの<rect>要素で1ピクセルずつドット絵を描かせる。48×48キャンバス、16色パレット。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"
     shape-rendering="crispEdges">
  <rect x="20" y="3" width="1" height="1" fill="#4a3728"/>
  <rect x="21" y="3" width="1" height="1" fill="#4a3728"/>
  <!-- ...数百行続く... -->
</svg>

6回リトライしました。

結果: ❌

01-svg-handmade-v6.png

びっくりするくらいセンスがない。人間が見たら「何これ?」と言うレベルです。

考察: LLMは座標(x, y)と色#RRGGBBの関係を絵として理解していません。テキストとして「x=20にrectを置く」ことはできても、それが視覚的にどう見えるか把握できない。画像生成AIとは根本的に違う能力です。

検証2: DALL-E 3全身生成 → pixelate

アイデア: DALL-E 3で高品質なイラストを生成し、PILでドット絵に変換する。

from PIL import Image

img = Image.open("dalle_original.png")

# 128x128にリサイズ(ニアレストネイバーでドット感を出す)
small = img.resize((128, 128), Image.NEAREST)

# 表示用に拡大
big = small.resize((512, 512), Image.NEAREST)

# パレット削減(128色、メディアンカット法)
quantized = big.quantize(colors=128, method=Image.MEDIANCUT).convert("RGB")
quantized.save("pixelated.png")

結果: ✅ 品質OK、❌ 構図変更不可

02-pixelated-128x128.png

品質はかなり良いです。パレット削減とニアレストネイバーリサイズの組み合わせで、ちゃんと「ドット絵っぽく」なる。

問題: この方法だと元のDALL-E画像が1枚固定なので、ポーズを変えたければ元画像を変えるしかない。そして元画像を変えると→検証3の問題にぶつかります。

検証3: 同一プロンプトで5ポーズ生成

アイデア: キャラクターの仕様(髪色、服装、体型、画風)をプロンプトにフル記述して、DALL-E 3で5つのポーズを生成する。

同じプロンプトのキャラ仕様部分はこんな感じです:

"A pixel art character: short brown hair, round glasses, navy hoodie, light skin, chibi proportions (3-head tall), white background..."

これに pointing forward / thinking pose / waving / surprised / guts pose とポーズ指定を変えて5枚生成。

結果: △ ポーズは変わるが微妙に別人

03-dalle-pointing.png
03-dalle-thinking.png

ポーズ自体は変わります。でも毎回微妙に顔が違う、体型が違う、色味が違う。「同じキャラの別ポーズ」ではなく「似たキャラの5人」が生成されます。

考察: DALL-E 3には「キャラクターの同一性を保つ」仕組みがありません。これはRedditでも頻繁に指摘されている既知の限界です。プロンプトでいくら詳細に記述しても、ランダムシードが違えば別人になります。

検証4: pixelate後のnumpy操作でポーズ変更

アイデア: 検証2で作った良い感じのドット絵を、numpy配列としてスライスしてパーツを切り出し、再配置してポーズを変える。

import numpy as np
from PIL import Image

img = np.array(Image.open("pixelated.png"))

# 「腕っぽい領域」を切り出して移動...
arm = img[40:70, 80:100, :]
# 回転して別の位置に貼り付け...

結果: ❌

04-numpy-repose-chimera.png

キメラが生まれました。

考察: ピクセルの色だけでは「どこが腕でどこが髪か」がわかりません。人間は一目で「ここが右腕」と認識できますが、プログラムにとってはただの色の配列です。セマンティック情報(意味情報)がピクセルデータには含まれていない。これが根本的な問題でした。

検証5: 知見をプロンプトに凝縮 → DALL-E直接生成

アイデア: 先ほどのプロのドット絵師の知見(レギュレーション、4ステップ、パーツ取捨選択、サイズ目安)を全部プロンプトに詰め込んで、DALL-E 3にピクセルアートを直接生成させる。

プロンプトは長くなりましたが、「48×48キャンバス相当」「16色パレット」「主線なし」「シルエット重視」など、プロの知見を技術的な制約として記述。

結果: △ 雰囲気は出るが真のピクセルアートではない

05-pixelated-48x48-16col.png

「ピクセルアート風」にはなります。でもよく見ると、ピクセルの格子が不均一だったり、色数が指定より多かったりする。DALL-E 3は「ドット絵っぽい見た目」は生成できても、「48×48の格子に正確にスナップした絵」は生成できません。

結局pixelateすると検証2と同じ結果に戻ります。

検証6: パーツ別DALL-E生成 → レイヤー合成

アイデア: 「全身を一度に生成するからキャラが統一できないのでは?」と考え、頭・胴体・腕L/R・脚を個別にDALL-E 3で生成。それぞれをpixelate→背景透過→PIL.Image.pasteで合成。

from PIL import Image

canvas = Image.new("RGBA", (512, 512), (0, 0, 0, 0))

# パーツを配置
head = Image.open("part_head_pixelated.png")
torso = Image.open("part_torso_pixelated.png")

canvas.paste(head, (160, 0), head)    # 頭を上部に
canvas.paste(torso, (170, 180), torso)  # 胴体を中央に
# ...腕と脚も同様に配置
canvas.save("composite.png")

結果: ❌

06-parts-composite.png

完全にキメラです。各パーツの画風・サイズ感・パースが全部バラバラ。頭はアニメ調なのに胴体はリアル調、腕の太さが左右で違う、影の方向が一致しない。

当然といえば当然です。DALL-E 3は各パーツを独立して生成するので、全体の統一感が保たれる仕組みがありません。

見えてきた根本問題

6つ試して全滅。でもパターンが見えてきました。

          高品質
            ↑
            |  検証2 ✅
            |  検証5 △   検証3 △
            |
            |
            |  検証1 ❌   検証4 ❌   検証6 ❌
            +————————————————————→ 構図変更可能

「高品質」と「構図変更可能」はトレードオフになっています。

  • AI生成(DALL-E): 品質は出るが、制御できない
  • プログラマティック(numpy, SVG): 制御はできるが、品質が出ない

そして根本原因はピクセルデータにセマンティック情報がないこと。人間が「ここは腕」と認識できる情報が、ピクセルの色配列には含まれていません。

突破口: 次に試すアプローチ

全部失敗しましたが、「人間のセマンティック情報をどこかに入れる」ことが鍵だとわかりました。

1. 2Dリギング(Spine / DragonBones)

ドット絵にボーン(骨格)を人間が設定して、プログラムでポーズを変える。Live2Dのドット絵版のようなイメージです。人間がセマンティック情報(どこが腕か)を入力する仕組み。

2. 3Dモデル → ピクセルシェーダー

VRoid Studioでchibiモデルを作り、three.jsでピクセルシェーダーをかけてレンダリング。3Dモデルは構造的にパーツが分離しているので、ポーズ変更が自然にできます。

3. プロ発注 + ツール化

ドット絵師にパーツシートを発注し、プログラムで組み立てる。人間の品質 × プログラムの制御性のハイブリッド。

共通するのは、AIだけで完結しようとしないこと。人間のセマンティック情報をパイプラインのどこかに入れる設計です。

まとめ

ドット絵は 「制約の芸術」 です。キャンバスサイズ、色数、格子への正確なスナップ——すべてが制約。一方、AI画像生成は 「制約なしの自由生成」 が得意です。

この2つは本質的にミスマッチでした。

学んだこと:

  • 🎮 ドット絵の品質は「制約をどう設計するか」で決まる
  • 🤖 DALL-E 3は同一キャラの再現性に限界がある
  • 🧩 ピクセルデータにセマンティック情報はない → 機械的なポーズ変更は無理
  • 🔧 「全部AIでやろう」は(現時点では)罠
  • 🤝 AI + 人間の組み合わせが最適解

6回失敗しましたが、「なぜ失敗するのか」が明確になったので良い実験でした。次は2Dリギングか3Dモデルのアプローチを試してみます。

同じようにAIでキャラクターアセットを量産しようとしている方の参考になれば幸いです。


📘 関連Book
この記事の内容をさらに深掘りしたい方へ、Zennで有料Bookを公開しています。

実践Claude Code — コンテキストエンジニアリングで開発が変わる
CLAUDE.mdの設計思想から実践パターン、チーム開発、セキュリティまで全19章・12万字超の実践書です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?