いいね、そのT-pose座標系はもう「OSの原点」として十分に硬い。
じゃあその上に、顔パーツの標準座標系=FaceSpace をきちんと載せよう。
1. 顔の意味モデル(何を“守る”座標系か)
まず、OSとして守りたいのは比率と意味。
- eye-line: 感情・視線の主戦場
- nose-axis: 顔の中心線(x=512 と一致)
- mouth-line: 発話・表情の主戦場
- chin: 顔の下限(デフォルメの基準)
T-poseの頭部は:
- head(頭頂):
y = 120 - neck(首):
y = 180
なので、顔の有効範囲をこう定義する:
- face_top = 120
- face_bottom = 180
- 顔高さ:
H_face = 60
この中を、意味で3分割する。
2. 顔パーツの標準座標(OS コア)
基本比率(face内の意味レイヤ)
- eye-line: 顔の上から 40%
- nose: 顔の上から 60%
- mouth: 顔の上から 75%
- chin: 顔の下端(= neck の直上)
数値にすると:
y_eye = 120 + 0.40 * 60 = 144y_nose = 120 + 0.60 * 60 = 156y_mouth = 120 + 0.75 * 60 = 165y_chin = 180
横方向の比率(x=512 を中心に)
- 顔幅の“意味幅”を
W_face = 220とする- 左端:
x = 512 - 110 = 402 - 右端:
x = 512 + 110 = 622
- 左端:
その中で:
- eye-L / eye-R: 顔幅の ±30%
- mouth-L / mouth-R: 顔幅の ±25%
- nose: 中央
計算すると:
x_eye_L = 512 - 0.30 * 220 = 446x_eye_R = 512 + 0.30 * 220 = 578x_mouth_L = 512 - 0.25 * 220 = 457x_mouth_R = 512 + 0.25 * 220 = 567x_nose = 512
まとめテーブル
| joint | x | y | 説明 |
|---|---|---|---|
| eye-L | 446 | 144 | 左目中心 |
| eye-R | 578 | 144 | 右目中心 |
| nose | 512 | 156 | 鼻先/鼻柱 |
| mouth-L | 457 | 165 | 口左端 |
| mouth-R | 567 | 165 | 口右端 |
| mouth-C | 512 | 165 | 口中央(任意) |
| chin | 512 | 180 | 顎先 |
※ すべて head–neck の間に収まる意味座標。
3. SVG 標準レイヤ(FaceSpace の OS 実装)
<g id="layer-face" data-role="face">
<!-- eyes -->
<circle id="eye-L" cx="446" cy="144" r="12" stroke="#000" fill="none"/>
<circle id="eye-R" cx="578" cy="144" r="12" stroke="#000" fill="none"/>
<!-- nose (simple line) -->
<path id="nose" d="M512 144 L512 156" stroke="#000" fill="none"/>
<!-- mouth (neutral) -->
<path id="mouth" d="M457 165 Q512 170 567 165" stroke="#000" fill="none"/>
<!-- chin (optional guide) -->
<circle id="chin" cx="512" cy="180" r="2" fill="#000"/>
</g>
ここで大事なのは、座標そのものより「比率がOSの真実」ということ。
キャラごとの頭部サイズは:
H_face_charW_face_char
として、T-poseの比率からスケールすればいい。
4. キャラ固有頭部へのマッピング式
T-pose基準を ((x_T, y_T))、
キャラ固有の顔矩形を:
- 上端:
y_top_char - 下端:
y_bottom_char - 左端:
x_left_char - 右端:
x_right_char
とすると、
- 縦比率: [ r_y = \frac{y_T - 120}{60} ]
- 横比率: [ r_x = \frac{x_T - 402}{220} ]
キャラ座標は:
[ x_{char} = x_{left_char} + r_x \cdot (x_{right_char} - x_{left_char}) ] [ y_{char} = y_{top_char} + r_y \cdot (y_{bottom_char} - y_{top_char}) ]
これで:
- OSは比率だけを真実として持つ
- 各キャラは自分の head/neck から顔矩形を定義するだけ
という責任分離になる。
5. なぜこのFaceSpaceが“絶対基準”になれるか
- T-poseの head–neck 間を顔の意味空間として固定
- その中を eye / nose / mouth / chin の比率で定義
- キャラごとの差は スケールと矩形だけ
- AIがどれだけデフォルメしても、
「目はこの意味レイヤ」「口はこの意味レイヤ」 が崩れない。
これで:
PoseSpace(身体)
+ FaceSpace(顔)
= CharacterOS の意味座標系
が揃った。
もし次に進めるなら:
- 表情ベクトル(smile, anger, sad)を mouth の制御点変位として定義する
- eye の開閉・視線を angle+scale で定義する
までやると、Geminiに渡す「顔の意味IR」がかなり気持ちよくなる。どこまで踏み込みたい?