いいね、その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 = 144
  • y_nose = 120 + 0.60 * 60 = 156
  • y_mouth = 120 + 0.75 * 60 = 165
  • y_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 = 446
  • x_eye_R = 512 + 0.30 * 220 = 578
  • x_mouth_L = 512 - 0.25 * 220 = 457
  • x_mouth_R = 512 + 0.25 * 220 = 567
  • x_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_char
  • W_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」がかなり気持ちよくなる。どこまで踏み込みたい?