はじめに
Leap Motionからオープンソースとして公開されたARヘッドセット「Project North Star」。
本記事ではexiii山浦氏が製作された簡易版Project North StarをUnityで動かす上で行った変更やキャリブレーションについて解説します。
公式のProject North Starとの違いは上記のブログをご参照ください。
Project North Star(#exiii 山浦さん@yamaulab 製)でUnityシーンを動かしました。#LeapMotion#ProjectNorthStar pic.twitter.com/1HLrAsFqaq
— afjk(エーエフ) (@afjk01) July 6, 2018
Project North Starの構成
左右2枚のLCDに表示される映像を眼前のリフレクターで反射させ、現実と重ね合わせて表示させます。
キャリブレーションでは、表示された映像が現実空間上の正しい位置に表示されるように調節します。
引用元:http://blog.leapmotion.com/northstar/
PCとの接続
1.Leap Motion、HDMI2つを接続。
2.ディスプレイ設定
接続したLCDをディスプレイ2、3として設定します。
向きを縦(もう一方は縦[反対向き])、解像度はLCDに合わせて1080 x 1920とする。
Unity側準備
公式ドキュメント
https://github.com/leapmotion/ProjectNorthStar/blob/master/Software/README.md
・Unityバージョン:Unity 2018.1b13以上
・Project North StarのGitHubレポジトリから、LeapAR.unitypackageを入手してインポートする。
https://github.com/leapmotion/ProjectNorthStar/tree/master/Software
・LeapMotion/North Star/Scenes/NorthStar.unityシーンを開く
NorthStar.unityシーンについて
シーン内の左右の目に当たるカメラで撮影した映像を歪めてプロジェクションし、
その映像を別のカメラで撮影してGame Viewに表示しています。
North StarにGame Viewを表示する
Game Viewを外部ディスプレイに移動、表示できるようにするため、ディスプレイ1の幅と外部ディスプレイの解像度を設定する必要があります。
AR Camera Rig設定
Window Offset Managerのxshiftにディスプレイ1の幅の値を設定する。
ソースコード修正箇所
LCDの解像度が公式と異なるため、ソースコードを書き換える必要があります。
公式:(2880, 1600 )
簡易版:(1080*2, 1920)
変更箇所は以下の3か所。実際に使用するLCDの値に書き換えてください。
\Assets\LeapMotion\North Star\Scripts\CalibrationDeformer.cs 25行目
Vector2 screen = new Vector3(2880, 1600);
\Assets\LeapMotion\North Star\Scripts\WindowOffsetManager.cs 59行目
SetPosition(xShift, 0, 2880, 1600);
\Assets\LeapMotion\North Star\Editor\WindowOffsetManagerEditor.cs 43行目
var size = new Vector2(2880, 1600 + UNITY_MENU_HEIGHT);
上記設定後、AR Camera RigのWindow Offset Managerコンポーネントの
[Move Game View to Headset]ボタンを押すと、North StarにGame Viewが移動します。
Game Viewの表示が反転してNorth Starに表示される事を確認してください。
※Game Viewにフォーカスを当てないとキー操作出来ないので、移動後もう一つGame Viewを表示しておきましょう。
以上でUnityの映像がNorth Starで表示できるようになりました。
キャリブレーションファイルの設定
キャリブレーションの結果はUnityでの実中にSerialized Calibrationスクリプトでjsonファイルとして保存/読み込みできます。
Calibration Folder、Output/Input Calibration Fileを下記の通り設定してください。
保存はSキーを押すと実行されます。
保存される対象は、Left Eye/Right Eye/Left Screen/Right Screen/Leap Hand ControllerのTransformおよび、CalibrationDeformerコンポーネントの情報(Left Eye/Right Eyeのみ)。
※保存対象を追加することも可能。
公式のキャリブレーション手段で対応しきれない場合は、上記GameObjectのTransform/CalibrationDeformerの値を直接変更して対応しました。
キャリブレーションの実行
ここからは、Project North Starを被って映像を見ながら調整する作業になります。
以下の手順は、基本的に
UnityのPlayボタンで実行→見ながら調整→Sキーで保存
という流れになります。
キャリブレーションのポイント
・キャリブレーションバーを表示(Cキー押下)し、縦横のラインがまっすぐ表示される事。
・手を上下、水平、前後方向に動かし、Leap Motionの手も同様に移動していること。
・片目ずつ、実際の手とLeap Motionの手が合うように調整する。
前提条件.LCDのアスペクト比の違いを調整
公式とLCDのアスペクト比が異なるので、Left/RightScreenのScaleを変更する。
scale (1.1, 0.83333333, 1)
※xは解像度の比率では1440/1080 = 1.33333だが、LCDパネルのもともとの比率のためか、1.1くらいが丁度よかった。
ロゴなどを貼った立方体を置くと目視で合わせやすい。
手順1.IPD調整
目の位置、距離に関する設定。
基本的に現実の物理的な位置に合わせる。
→キー:IPDを広げる
←キー:IPDを狭める
↑キー:目の位置を上げる
↓キー:目の位置を下げる
[キー:リフレクターと目の距離を広げる
]キー:リフレクターと目の距離を縮める
手順2.Calibration Deformer調整
左右の映像のズレを個別に調整する。
映像が左右の目で上下左右にズレている場合にこの設定変更が有効です。
公式の方法では、マウス左クリックでコントロールポイントを追加して、ドラッグで調整と書かれています。
Left Mouse
on the Game View to Place and Drag Manual Calibration Distortion PinsRight Mouse
to Remove Manual Calibration Distortion Pins
ただ、この方法では細かい調整が難しかったのでLeftEye/RightEyeにあるCalibration Deformerコンポーネントの設定を直接変更して合わせました。
vetex Indices
size:1
Element 0:0(+1ごとに上下にずれ、+31ごとに左右に移動するようです)
Control Points
size:1
Element 0:
Xを変更すると上下移動
Yを変更すると左右移動
Zを変更すると奥行移動(基本0で良い)
手順3.手のトラッキング位置を調整
現実の手とLeap Motionの手が全体的に上下左右にズレている場合、Leap XR Providerの位置を調整して合わせます。
おわりに
Project North Starはオープンソースで自作する都合上、どうしても個体ごとに差異が出てしまいます。
その問題をキャリブレーション手段を提供することで対応するのは面白い試みと思いました。
他の方が作成されたNorth Star向けアプリケーションも、キャリブレーションファイルを置き換える事で自分のNorth Starで動作させる事が出来るのでアプリケーション配布の可能性も見えてきます(ソースコードを変更した箇所は難しいですが)。
とはいえ、正確なキャリブレーションは難しく、キャリブレーションされていなければ体験を損なうことになります。
Project North Starのキャリブレーションにあたり本記事が参考になれば幸いです。
公式のプロジェクトも今後さらにアップデートされていくと予想されますので、期待して待ちたいと思います。