メルで目指したこと
私たちは空想の生き物がそこにいると感じる作品を作ることを目指しています。それを実現するには、現実と同じような視覚的刺激はもちろん大事ですが、それだけではただの立体視の映像と変わりません。そのうえで、コミュニケーションを取れることが重要だと考えています。コミュニケーションとはいっても、様々なものがありますが、特に生物の中で人間だけが行うと考えられているものが効果が強いように感じています。
メルにおいては、真珠を与え、そのお礼として似顔絵を描き、プレゼントするということがそれにあたります。まず、似顔絵を描くというのを人間以外が行うというのは聞いたことがありません。それに加えて、真珠と似顔絵の交換、つまり、贈与や交換というのは文化人類学的に社会的なつながりを構築する手段と捉えられる場合があります。
他にも、似顔絵を描くときのペンが描くのを感じるハプティクスや、体験者の目を見るアイコンタクト、ジェスチャーへの反応など、細かなインタラクションを積み重ねることで、メルの実在感を作り出しています。
メルの体験の流れ
メルは以下の様な体験の流れで進みます。

1. メルと出会って少しふれあう
2. 真珠を入れる
3. メルが上に昇って行く
4. 貝の形のカードをホルダーに入れて体験者が手で押さえる
5. メルが似顔絵を描く
6. メルが戻ってくる
7. 体験者が手を振るとメルが振り返す
筐体
筐体は EMARF というサービスで木材を切ってもらい、それをビスケットジョイントで組み立てています。設計は Grasshopper で行っています。塗装はオスモカラーを使用しました。
筐体が黒い理由は後述する似顔絵の仕組みでカーボン紙と筐体が同じ色になることで、認識しづらくなることを狙っています。
ハードウェア
メルのハードウェア構成は以下の様になっています。

・Windows PC
SONY ELF-SR2 (立体に見えるディスプレイ)
Logicool STREAM CAM (似顔絵の顔認識用カメラ)
Ultraleap 3Di (ハンドトラッキングデバイス)
Dobot Magician (似顔絵を描くためのロボットアーム)
・自作の真珠検出装置

水槽から似顔絵を描く仕組み
体験として似顔絵を描いてもらうと考えたとき、裏側の仕組みを見せずにメルに絵を描いてもらう必要があり、また、画面がある都合から、自然な方法でその仕組みがある場所まで移動してもらう必要がありました。移動は人魚なので上に泳いでもらえばよいので問題無かったのですが、仕組みを見せずに描く方法に悩みました。そこで考えたのが以下の方法です。
水槽の内側から似顔絵を描く仕組みは、トレーシングペーパーに重ねたカーボン紙をロボットアームでなぞることで実現しています。通常絵を描くという用途ではペンプロッタが用いられることが一般的だと思われますが、ペンプロッタは重力でペンを押しつけるものが多く、垂直の面に対してカーボン紙で写せるくらい押しつけながら描くという用途には使用できません。そのため、ロボットアームを使用しました。
最初は MyCobot 280 という6自由度のアームで制作していましたが、今回の用途では剛性が足りず線が不安定になってしまったことと、自己衝突を起こさないルートで動かすモーションプランニングが必要で、ROS の MoveIt にチャレンジしましたが、難易度が高かったことから諦めました。
その後、以前別のプロジェクトのために購入した Dobot Magician という3自由度のロボットアームであれば、剛性の問題がないのではないかということで実験した結果、問題が無かったためこちらを採用しました。ただ、こちらはこちらで SDK に難があり、最終的にプロトコルの仕様書を元に Rust で IK や FK もあわせて SDK 相当のものを書きました。ここが非常に大変でした。
なおロボットアームには、革細工や粘土細工で使用されるエンボスペンというものを取り付けています。
真珠を検出する仕組み
樹脂の真珠は非常に軽いため、フォトインタラプタ LTH-301-32 を Arduino Uno R4 経由で使用して検出しています。ユニバーサル基板が得意ではないので、JLCPCB でプリント基板を発注しました。
筐体右上の真珠を入れる穴の裏側には以下のような3Dプリンタで作成したパイプと受け皿を用意しました。ELF-SR2 と干渉するため取り付けは両面テープで行っています。パイプの内側は傾斜がついており、真珠が途中でとまりづらいようになっています。
ソフトウェア
ソフトウェアは Unreal Engine を使用しています。あまり複雑なことはやっておらず、ロジックはシンプルなステートマシンになっています。ロボットアームとの通信や似顔絵関連処理など Blueprint では難しい部分は、Rust で書いて DLL を作成して C++ で呼び出しています。C++ が苦手なのでできるだけ書かずに済む方法をとっています。
細かな Tips としては ELF-SR2 の描画も似顔絵ロジックも GPU で動くため、以下の様な cVars を設定してクオリティと応答速度のバランスを取っています。
t.MaxFPS 60
r.ScreenPercentage 85
似顔絵ロジック
本当は Stable Diffusion を用いた生成 AI による似顔絵ロジックを作成しようとおもっていたのですが、出力が安定しなかったため、もう少しシンプルな方法をとっています。
まず、FacePerceiver/facer を使用して、顔のパーツのサイズやアトリビュートを取得します。それを使用して、事前に決めたルールにしたがって、顔のパーツを決定します。たとえば、髪と顔の比率がこのくらいならこのパーツ、前髪のアトリビュートが高いならこのパーツのように決定しています。
パーツは Illustrator で作成し、SVG で書き出し、Rust の RazrFalcon/resvg で読み込んでパスを抽出し、ベジエを短い直線に分解しロボットアームで描いています。
アート
メルや背景は以下の様なステップで制作しました。

1. 水族館で展示を見たり参考の写真を撮ってくる
2. Megascans のアセットを用いてシーンを組み立てる
3. メンバーのラキュフィーがキャラクターデザインをする
4. Blender でモデリング
5. Substance Painter でテクスチャリング
6. Unreal Engine でマテリアル設計
7. Blender でボーンを入れてウェイト調整
8. Unreal Engine で Control Rig でリギング
9. Unreal Engine でモーション付け
マテリアルは一般的な PBR のマテリアルに加えて、サブサーフェーススキャッタリングを肌などに使用しています。目はドールアイを参考に、白目を凹ませてキラキラした金属的な瞳を作り、それをガラス的な凸型のメッシュで覆っています。
髪については板のメッシュで作成していますが、本当は Houdini で作ったヘアを持ってくる予定でしたが、ELF-SR2 でのレンダリングが正しく行われなかったため今回は諦めました。
UE 側でリグをいれている理由は、プロシージャルなリグがよかったことと、使い慣れている DCC ツールがないことと、シーンに合わせて最終的なルックと同じ環境でアニメーションを付けたかったからです。リグの上の方にあるのは、体験者の顔の方を向く視線コントロールと、リグ構造の切り替えスイッチです。通常の人と同じく足下にルートがあり腰から両方に別れるリグと、頭がルートになっているリグを用意しています。
Control Rig やシーケンサでのアニメーション付けはちょっとまだ不安定なところがあり、次回は DCC ツールでのアニメーション制作でもいいのかなと少し感じています。
Back to Top