要求仕様書(案) Ver.0.1
1. 目的
240×240 pixelの小型LCDを搭載したESP32上で、キャラクターの表情・目・口・その他のパーツを独立したスプライトとして合成し、イベントドリブン方式でアニメーション表示するシステムを構築する。
本システムでは、キャラクター全体を毎フレーム描き直す方式ではなく、
-
顔本体
-
目
-
口
-
その他の表情パーツ
-
エフェクト
を独立した「スプライトレーン」として管理する。
これにより、限られたESP32のメモリ・処理能力でも、少ない画像データから多数の表情・アニメーションパターンを生成可能とする。
2. 基本設計思想
2.1 レイヤー合成方式
1枚の完成画像を大量に用意するのではなく、複数のパーツを重ね合わせて最終画面を生成する。
基本構成:
Layer 0 : BACKGROUND
Layer 1 : FACE
Layer 2 : EYES
Layer 3 : MOUTH
Layer 4 : EFFECT / ACCESSORY
必要に応じてレイヤーを追加できるものとする。
2.2 スプライトレーン
各パーツは独立したスプライトレーンとして管理する。
例:
FACE_LANE
EYE_LANE
MOUTH_LANE
EFFECT_LANE
各レーンは少なくとも以下の情報を持つ。
sprite_id
visible
x
y
frame
duration
priority
ESP32側ではイベント発生時に該当レーンの状態を変更する。
3. 表示基本仕様
3.1 画面サイズ
画面解像度:240 × 240 pixel
画面比率 :1:1
キャラクターは原則としてこの画面内に収める。
3.2 基準キャラクター
制作開始時点では、
「正面を向いたキャラクター」
を標準モデルとする。
斜め顔、横顔、上下方向、身体動作等は基本モデル完成後の拡張とする。
4. キャラクター座標系
4.1 基本座標
画面左上を原点とする。
(0,0)
↓
┌──────────────────────┐
│ │
│ │
│ CHARACTER │
│ │
│ │
└──────────────────────┘
(239,239)
X:右方向が正
Y:下方向が正
5. キャラクター基準点
パーツ合成時の位置ずれを防止するため、キャラクターには基準点を設定する。
最重要基準点:
CROWN / NOSE REFERENCE
特に顔パーツについては、過去の制作で使用した鼻先を基準とする位置合わせ方式を基本とする。
5.1 鼻先基準
鼻先を、
NOSE_REFERENCE_X
NOSE_REFERENCE_Y
として定義する。
目・口等の相対位置は、この基準点からのオフセットとして管理する。
例:
MOUTH_X = NOSE_X + mouth_offset_x
MOUTH_Y = NOSE_Y + mouth_offset_y
これにより、顔の種類を変更してもパーツ位置の再調整を最小限にできる。
6. 顔本体セル規定
6.1 顔セル
顔本体は、原則として口を描かない状態で制作する。
FACE_001
FACE_002
FACE_003
...
などの独立セルとして保存する。
6.2 完全なくちなし
顔セルには口を描かない。
以前の制作で設定した、
A~E:完全なくちなし
という思想を基本仕様として継承する。
口の存在を示す線・影等も、可能な限り除去する。
目的は、口セルを重ねた際に元の口画像が干渉することを防止することである。
7. 目セル規定
目は顔本体から完全に分離する。
例:
EYE_00 : 通常
EYE_01 : 半開き
EYE_02 : 閉じ
EYE_03 : 驚き
EYE_04 : 笑い目
EYE_05 : 特殊表情
目セルには原則として顔、鼻、口等を含めない。
7.1 目のアニメーション
目については、少なくとも以下を想定する。
通常
↓
半閉
↓
閉
↓
半開
↓
通常
これを瞬きイベント等から呼び出す。
8. 口セル規定
口は本システムにおいて最重要の独立アニメーションパーツとする。
口は顔セルに描き込まず、完全に独立したセルとして制作する。
9. 240×240用口パク規格
9.1 基本方針
口パクは単純な「口を開く/閉じる」だけではなく、発声時の口形状を複数種類用意する。
基本的な口形状:
M0:閉口
M1:微開口
M2:小開口
M3:横長
M4:縦長
M5:大開口
M6:「い」系
M7:「う」系
M8:「お」系
最終的な種類数は制作試験によって決定する。
9.2 口セルの原則
口セルは、
「口だけ」
を含む透明背景画像とする。
┌────────────────┐
│ │
│ MOUTH │
│ │
└────────────────┘
顔・鼻・目・輪郭等は含めない。
10. 口セルのサイズ
口セルは240×240全画面画像とする必要はない。
原則として、
MOUTH_SPRITE_WIDTH
MOUTH_SPRITE_HEIGHT
による小型矩形スプライトとする。
ただし、制作段階では位置合わせを容易にするため、必要に応じて240×240キャンバス上に配置した検証用画像を作成してもよい。
最終的なESP32用データでは必要領域のみを切り出す。
11. 口セルの基準位置
口セルには基準点を設定する。
基本基準:
鼻先
または
口中心
を採用する。
本仕様では、まず鼻先基準方式を標準とする。
12. 口パクアニメーション
口パクは複数の口形状を時間軸上で切り替える。
例:
M0
↓
M1
↓
M3
↓
M5
↓
M3
↓
M1
↓
M0
この一連を「口パクシーケンス」とする。
13. 発声イベント
ESP32側では、音声・会話・イベント等をトリガとして口パクシーケンスを呼び出せる構造とする。
例:
EVENT_TALK
↓
MOUTH_SEQUENCE
↓
M0 → M1 → M3 → M5 → M3 → M1 → M0
イベントと画像データを分離する。
14. アニメーションデータと制御データの分離
画像そのものと、画像をどう動かすかという制御情報を分離する。
例:
画像データ:
M0
M1
M2
M3
M4
M5
制御データ:
TALK_01 =
M0, 80ms
M1, 50ms
M3, 50ms
M5, 80ms
M3, 50ms
M1, 50ms
M0, 80ms
これにより、同じ口セルを異なるアニメーションに利用できる。
15. イベントドリブン方式
ESP32側では、常時全フレームを再生する方式を基本としない。
イベントを受信した場合に該当するアニメーションを実行する。
例:
EVENT_IDLE
EVENT_TALK
EVENT_BLINK
EVENT_SURPRISE
EVENT_HAPPY
EVENT_SLEEP
イベント発生:
EVENT_TALK
↓
FACE:維持
EYES:維持
MOUTH:再生
瞬き:
EVENT_BLINK
↓
FACE:維持
EYES:BLINK_SEQUENCE
MOUTH:必要に応じて維持
16. 複数レーン同時動作
複数のアニメーションを同時に実行可能とする。
例えば、
FACE :通常顔
EYES :瞬き
MOUTH :発声
EFFECT :なし
を同時に成立させる。
これにより、
「喋りながら瞬きをする」
「笑いながら口を動かす」
「驚いた顔で口を開く」
等の複合表現が可能となる。
17. レイヤー優先順位
基本的な表示順:
最背面
↓
BACKGROUND
FACE
EYES
MOUTH
EFFECT
↓
最前面
後から追加するパーツについてもpriorityを設定可能とする。
18. パーツ制作時の禁止事項
以下を原則禁止する。
顔セル
口を描き込まない
目を描き込まない
目セル
顔輪郭を描き込まない
口を描き込まない
口セル
顔輪郭を描き込まない
鼻を描き込まない
目を描き込まない
目的は各パーツを完全に独立させることである。
19. 透過仕様
独立パーツは透明背景を基本とする。
例:
PNG
RGBA
等の形式を制作マスターとして使用可能とする。
ESP32用データ形式は、使用するLCDライブラリおよび描画速度を考慮して別途決定する。
20. 制作マスターとESP32データの分離
制作環境では、
MASTER
↓
位置合わせ
↓
透過処理
↓
トリミング
↓
ESP32用変換
↓
LCD表示データ
という工程を採用する。
制作段階の高品質画像と、ESP32で使用する軽量データを同一形式に固定しない。
21. 正面キャラクター制作工程
最初の制作工程は以下とする。
STEP 1
正面を向いたキャラクターを制作
STEP 2
240×240キャンバス上で位置決定
STEP 3
顔輪郭・鼻・その他固定パーツを確定
STEP 4
口を完全除去
STEP 5
目を分離
STEP 6
口を分離
STEP 7
鼻先基準点を設定
STEP 8
各パーツの相対座標を測定
STEP 9
合成テスト
STEP 10
ESP32表示テスト
22. 正面モデルの標準化
正面モデルについて以下を固定する。
Canvas :240×240
Face Center :固定
Nose Point :固定
Eye Position :固定
Mouth Area :固定
以後の表情・アニメーションは、この標準モデルを基準に制作する。
23. 位置合わせ検証
制作時には補助線を表示した検証画像を作成可能とする。
例:
縦中心線
横中心線
鼻先基準線
左右目基準線
口基準線
特に過去の制作で問題となった「元画像の微妙な位置ずれ」を防止するため、目視だけでなく座標値による管理を行う。
24. アニメーション品質基準
最低限、以下を満たすこと。
-
口交換時に顔輪郭が動かない
-
口交換時に鼻位置が動かない
-
目交換時に顔位置が動かない
-
各パーツの基準点が一致する
-
アニメーション中に不要な画像領域が表示されない
-
240×240画面外への不要な描画を避ける
-
ESP32上で十分な描画速度を確保する
25. 拡張仕様
基本モデル完成後、以下を追加可能とする。
目
眉
口
耳
髪
頬
汗
涙
赤面
影
アクセサリー
手
身体
エフェクト
これらも可能な限り独立レーン化する。
26. データ命名規則
原則として以下の命名体系を採用する。
FACE_xxx
EYE_xxx
MOUTH_xxx
EFFECT_xxx
例:
FACE_001
EYE_NORMAL
EYE_BLINK_01
EYE_BLINK_02
MOUTH_M0
MOUTH_M1
MOUTH_M2
MOUTH_M3
MOUTH_M4
MOUTH_M5
アニメーション:
ANIM_BLINK_01
ANIM_TALK_01
ANIM_TALK_02
ANIM_SURPRISE_01
27. 最終的なシステム構成
┌──────────────┐
│ EVENT │
└──────┬───────┘
↓
┌──────────────────┐
│ Animation Engine │
└────────┬─────────┘
↓
┌──────────────┼──────────────┐
↓ ↓ ↓
FACE LANE EYE LANE MOUTH LANE
↓ ↓ ↓
FACE CELL EYE CELL MOUTH CELL
└──────────────┼──────────────┘
↓
COMPOSITOR
↓
240×240 LCD
28. 本仕様書における最重要原則
本システムでは、
「アニメーションを絵として作る」のではなく、「パーツと時間軸を組み合わせてアニメーションを生成する」
ことを基本思想とする。
したがって、
完成画像 100枚
を作るのではなく、
顔 5種類
目 10種類
口 8種類
エフェクト 10種類
程度の素材から、組み合わせによって多数の状態を生成することを目標とする。
29. 初期開発範囲
初期バージョンでは機能を限定する。
Phase 1
240×240正面顔
+
くちなし顔
+
通常目
+
瞬き目
+
口セル
Phase 2
口パク
+
瞬き
+
複合アニメーション
Phase 3
複数表情
+
イベント制御
+
エフェクト
Phase 4
複数キャラクター
+
複数アニメーションセット
+
データ圧縮
+
高速描画最適化
30. 今回の最初の制作目標
最初に完成させるべきものは、
「240×240の正面顔・くちなしマスター」
とする。
その上に、
①目セル
②口セル
③基準点
④座標表
を設定する。
この基準モデルが完成するまで、複雑なアニメーション制作には進まない。
31. 未確定事項
以下は今後の試験によって決定する。
・LCDの実際の色深度
・ESP32の使用可能RAM
・画像格納方式
・SPI転送速度
・使用LCDライブラリ
・PNG等からの変換方式
・口セルの最適サイズ
・口形状の最終種類数
・口パクのフレーム時間
・瞬きのフレーム時間
・透過方式
・画像圧縮方式
・同時表示可能レーン数
これらはESP32/LCD実機によるベンチマーク後に確定する。
32. 開発上の基本方針
制作側とESP32プログラム側を分離する。
【画像制作側】
キャラクター
↓
セル分割
↓
基準点設定
↓
座標データ
↓
アニメーション定義
【ESP32側】
イベント受信
↓
アニメーション選択
↓
レーン制御
↓
セル選択
↓
座標配置
↓
LCD描画
この分離により、キャラクターを変更してもESP32側のアニメーションエンジンを再利用できる構造とする。
33. 仕様書の次段階
本仕様書Ver.0.1では、**「正面顔を基準にしたセルアニメーション方式」**を定義した。
次の設計段階では、実際の240×240キャラクター画像を1体選定し、
FACE
EYE
MOUTH
NOSE_REFERENCE
CENTER_LINE
MOUTH_REFERENCE
を実測する。
その結果から、
「240×240キャラクター用セル規格 Ver.1.0」
として、各パーツのピクセルサイズ、基準座標、命名規則、口形状、フレーム時間、透過領域を数値で固定する。
最初の完成物は、**「正面・無表情・完全なくちなし・目分離可能な240×240マスター」**とする。