顔の動きで光源を動かす：10年前に作った“リアルっぽいCG”の話

## はじめに

筆者が高専在学中に取り組んでいた、顔の動きに応じて3Dモデルの光沢を動かすシステムの試作について紹介します。

当時は、MediaPipe や ARKit といった高精度な顔認識ライブラリは存在せず、  
PCも非力、GPUはミドルクラス以下が当たり前という環境でした。  
そんな中で、**顔の動きに応じて3D空間上の光源を動かし、物体の“光沢感”を強調する**という仕組みを構築したのがこの研究です。

手段としては、OpenCVによる顔検出、OpenGLによる3D描画、  
そしてプロジェクタを使った独自の投影装置によって、動的な光沢表現のリアルタイム制御を実現していました。

## 目次
- 研究の目的と背景
- システム構成
- 顔検出と光源追従の仕組み
- 主観評価と光沢感の強調
- 余談
- 今の技術と比べて
- おわりに
- 補足

## 研究の目的と背景

CGにおける「現実感」の再現には、形・動き・質感の3要素が不可欠ですが、  
特に“光沢”は材質や立体感を印象づける重要な要素です。  
本研究では、その「光沢感」を視覚的に強調するために、**観察者の頭部の動きに合わせて光源の位置を変化させる**というアプローチを取りました。

動作の流れを簡単に言えば、次のような仕組みです：

1. カメラで観察者の顔の位置（主に横方向）を検出  
2. 顔の位置を元に仮想光源の位置をリアルタイムに更新  
3. その光源を使って OpenGL 上の3Dモデルに光沢を描画  
4. 表示結果をプロジェクタで半透過スクリーンに投影

この構成により、**観察者が顔を左右に動かすと、モデル上の光の反射位置も追従して変化する**ため、  
静止画では得られない“物理的なリアリティ”を演出することができました。

## システム構成

本研究で構築したシステムは、大きく分けて以下の4つの構成要素から成り立っています：

- **観察者とカメラ**  
  観察者はスクリーンの正面に位置し、その頭部の動き（主に左右方向）をUSBカメラがリアルタイムに捉えます。

- **処理用PC（C++＋OpenCV＋OpenGL）**  
  カメラ映像を受け取ったPCは、OpenCVを使って顔の位置を検出し、その位置に応じて仮想光源の位置を計算します。  
  計算結果はOpenGLの描画処理に反映され、モデル上にリアルタイムで光沢が再現されます。

- **表示用プロジェクタ2台（前方・後方からの投影）**  
  描画結果は2台のプロジェクタを使って半透過のスクリーンに前後から投影されます。  
  前方のプロジェクタは主に鏡面反射の表現を、後方は拡散反射（ベースの形状と色）を担当し、合成されることで“立体的な光沢”を再現します。

- **スクリーン（トレーシングペーパー製）**  
  スクリーンには光を透過・拡散するためのトレーシングペーパーを使用し、  
  観察者側から見ると、両方のプロジェクタからの投影が1枚の3Dオブジェクトとして視認できる仕組みです。

このように、**ハードウェア的な工夫とソフトウェア的な処理を組み合わせて、現実感のある光沢描写を構成**していました。

## 顔検出と光源追従の仕組み

顔の検出には、OpenCVに標準で搭載されているHaar-like特徴量分類器を使用しました。  
これは、白黒の矩形パターンを多数組み合わせ、顔らしさを判定する古典的な手法ですが、当時はリアルタイム処理が可能で有力な選択肢でした。

処理の流れは以下の通りです：

1. **カメラ映像から顔領域を検出**  
   顔検出用の学習済み分類器（カスケード分類器）を用い、毎フレーム顔の位置を取得します。  
   顔が検出できない場合には前フレームの値を保持して処理を継続します。

2. **顔の位置から光源位置を計算**  
   顔のX座標（左右位置）を基準に、仮想光源をモデルの左右方向に移動させます。  
   単純な線形変換（視野範囲を0〜1に正規化）により、顔の動きと光源の位置が対応するようにしました。

3. **OpenGL側に光源位置を反映**  
   OpenGLではPhongシェーディングを用い、リアルタイムでライティング結果を更新。  
   観察者が顔を動かすたびに、光沢のハイライト位置が動き、立体感の強調が得られる仕組みです。

なお、実験環境はCore 2 Duo＋GeForce 8400GSという今では非力な構成でしたが、  
それでも顔検出と描画を同時に実行できる程度のリアルタイム性能は確保していました。

## 主観評価と光沢感の強調

光沢の知覚における“自然さ”や“リアルさ”は、定量的な指標で測ることが難しいため、  
本研究では主観評価実験によって、複数の表示条件を比較しました。

### 評価方法：
- 使用した手法は **サーストンの一対比較法**。  
 これは、提示された2つの選択肢のうち、どちらがより光沢感があるかを選んでもらい、  
 その結果から各パターンの順位付けを統計的に導く方法です。

- 被験者は8名（男女混在）、各条件の組み合わせに対して選好を記録。

### 評価対象となるパターン（プロジェクタの割り当て）：
- パターン1：前面→拡散反射、後方→鏡面反射
- パターン2：前面→鏡面反射、後方→拡散反射（※この構成が最も高評価）
- パターン3：両方→拡散反射
- パターン4：両方→鏡面反射

結果として、**「前面プロジェクタが鏡面反射、後方が拡散反射」**という構成が最も“光沢が強く、自然に見える”という評価を得ました。

また、「観察者の動きに応じてどこを動かすのが一番自然か」という比較では、

- 光源を動かす
- モデル（物体）を回す
- 観察視点を仮想的に動かす（カメラ移動）

という3つの手法を用意したところ、**「光源を動かす方式」が圧倒的に自然で光沢感が強いと感じられる**という結果になりました。

これは、人が現実世界で経験している「自分が動くと照明の反射がズレる」という知覚に合致しており、  
**視覚的なリアリズムは“物理的に正しい描画”よりも、“知覚に馴染む挙動”が鍵になる**という重要な示唆を得ることができました。

## 今の技術と比べて

この研究を行ったのは2010年代前半。  
当時の顔検出はHaar-like特徴量が主流で、深層学習による検出器は未登場か、重すぎてリアルタイム動作に耐えないものでした。

しかし現在（2025年）は状況が大きく変わっています。

| 技術要素 | 当時（2010年代前半） | 現在（2025年） |
|----------|------------------------|------------------|
| 顔検出 | Haar-like (OpenCV) | MediaPipe / Dlib / YOLOFace |
| 光沢表現 | Phongモデル | PBR（物理ベースレンダリング） |
| 制御対象 | OpenGL固定関数パイプライン | Unity / UnrealのリアルタイムGI |
| 表示手段 | プロジェクタ＋スクリーン合成 | HDRディスプレイ / ARグラス / HoloLens |

今であれば、MediaPipeを使って高精度かつ安定した顔トラッキングが可能であり、  
Unityを使えばリアルタイムなPBR＋光源制御で、**はるかに高品質かつ効率的なシステムを数日で組み上げることができます**。

しかし、**“人間の知覚にどう応えるか”という設計思想そのものは、今でも変わらず重要**です。  
道具が変わっただけで、やろうとしていたことの本質は今でも通用すると感じています。

## 余談：頭の動きでフィギュアを鑑賞するという遊び

本研究のシステムを使って、少し遊び心のある応用実験も行っていました。  
具体的には、メタセコイア形式で作成された3Dキャラクターモデルを読み込ませ、  
観察者の顔の動きに応じてキャラクターの向きを変えるという“インタラクティブな鑑賞システム”です。

例えば、顔を左に動かすとキャラクターが右向きに回転し、  
まるでガラスケースの中にあるフィギュアを体を傾けながら眺めているような感覚になります。

当然のことながら、「スカートの中を覗こうとする」という行動も可能で、  
当時はそれが一種の“探索インタフェース”として機能していることに興味を持ちました。

今思えばこれは、**ユーザーの視線方向を通じて「どこを見たいのか」がそのまま入力になる**という意味で、  
視覚的没入感や存在感を高める、初歩的なAR/VR的鑑賞体験だったのかもしれません。

技術的には、当時ネット上で公開されていた `.mqo` ファイルの読み込みコードを参考にし、  
OpenGLでリアルタイム描画を行うことで、**商用エンジンを使わずに自分で動かせる鑑賞ツールを作れた**という手応えもありました。

## おわりに

この研究を振り返ると、**限られた技術の中でも“人がどう感じるか”に向き合う設計ができたこと**が最も得難い経験でした。

顔の動きと光沢のインタラクションは、今ではXR（VR/AR/MRを含む拡張現実の総称）やVTuberなどで広く応用されていますが、  
当時の手作業的な作り込みによって“視覚と知覚”を自分の手で調整した経験は、今も技術者としての核に残っています。

## 補足：当時の技術スタック

- 言語：C++  
- ライブラリ：OpenCV（顔検出）、OpenGL（描画）  
- 顔検出：Haar-like カスケード分類器  
- 表示：プロジェクタ2台（前面・背面）＋トレーシングペーパー製スクリーン  
- 評価：サーストン法による一対比較実験（被験者8名）

---

> ここまでお読みいただき、ありがとうございました。  
> 技術は進化しても、人間が「どう感じるか」を考える視点は、いつまでも有効です。