HoloLens上でVuforiaとUnityを使ったARを試してみました。かたりぃなです。
Vuforiaとは
VuforiaはARフレームワークです。 マーカーを登録することで、それを認識するためのライブラリが生成されます。
対応プラットフォームは
ライブラリは各種プラットフォーム用のものを出力でき、Android, iOS, UWP, Unityなどがあります。
マーカーの種類
Vuforiaで扱えるマーカーはいくつかの種類があって、次の中から選択することができます。
- 平面画像マーカー
- 直方体マーカー
- 円柱マーカー
- 立体マーカー
今回試したのは1と4です。
平面画像マーカー
平面画像マーカーは、写真などの二次元画像をマーカーとして使用できます。 写真をアップロードすると、特徴点を算出して、そのマーカーの認識しやすさを表示してくれます。 こんな感じに。
ちょっと特徴点が少なすぎて認識できないですね。 そもそも三次元物体に対する認識を二次元でやろうというのは少々無理があるかと。
立体マーカー
今回のメインは、この立体マーカーです。立体マーカーを作る方法は2つあります。
- Androidの立体スキャンアプリを使って立体スキャンする
- CADデータをVuforia_Model_Target_Generaterで処理する
どちらも以下のURLからダウンロードしたツールを使って実現できます。 https://developer.vuforia.com/downloads/tool
今回は都合よくCADデータと、それを3Dプリントして塗装仕上げしたものがあるので2の方法でいきます。
CADデータはこんな感じです。
3Dプリントして塗装したのはこんな感じです
技術系ブログなのに方向性がおかしくなってきてる気がしますが、突き進みます。
CADデータってどんなの?
厳密な定義はおいといて、Vuforiaが3Dマーカーとして使えるCADデータのフォーマットとしてはFBX, STLなどがあります。
ここではSTLを使います。STLデータとは3DプリンタやCNC切削機で利用できるデータ形式です。
STLのデータ形式はWikipediaにある詳細説明のとおりです。
- 頂点3つで構成されるポリゴン
- そのポリゴンの表裏を表現する法線
これを1つの要素として、その集合として表現されるものです。
3DCGとの最大の違いは、次のような情報が含められないということです。 原理的に当然といえば当然なのですが。
- マテリアル
- テクスチャマップ
- 法線マップ
なので、3Dプリントするデータは生ポリゴンで全部表現する必要があります。
CADデータを取り込んでマーカーをつくる
ModelTargetGeneratorを起動するとライセンス入力を求められるので、Web上で登録して、そのライセンスコードを入力します。
使い方はこのあたりを参考にします。 https://library.vuforia.com/articles/Solution/model-target-generator-user-guide.html
そして新規プロジェクト作成でCADデータを読み込ませると、設定画面が開きます。
先にこたえを書くと、出力可能な状態にまで設定するとこんな画面になります。
Model Target Generatorの基本設定
起動時に設定したモデルが表示されるので、次のものを設定します
- 単位系
- モデルの上方向
ここで単位系をあわせておかないと、Unityにもっていったときに認識サイズが大きすぎる/小さすぎるなんてことになります。 まあUnity側でスケールかければいいんですが。
マーカーの検出位置を設定
DetectionPositionというボタンを押すと、画面右側にシルエットが表示されます。
よくわかってませんが、どうやらこのシルエットが認識するオブジェクトの情報のようです。
なので、現実世界のオブジェクトのシルエット(実際に3Dプリントしたデータ)と一致しないようなシルエットが表示されるときは、CAD側で修正もしくは他オブジェクトを使うなどの対応が必要になります。
上のシルエットも、同様の理由から3Dオブジェクトの一部しか使用していません。
シルエットが一致しないケースとして
- 組み立て時の誤差。3Dプリントして塗装、接着して組み立てるとどうしても誤差が出ます。
- 光沢が大きな素材。マニュアルにはこう書かれてるのですが、実際どうなのかはよくわからないです。背景が白だと光沢出たときに穴になるというのはわかるのですが。
- 遮蔽物による影響。手で持つ部分などは基本的に遮蔽されるので、認識には向かないです
などがありますので、適宜工夫する必要がありそうです。
エクスポート
ModelTargetGeneratorのメニュー右端の「Generate Target」ボタンを押すと、マーカーとして認識するライブラリを生成できます。(Unity)
無料ライセンスでは10回までという制限があるので、その点だけ気を付けましょう。
Unity側でARの設定をする
エフェクト出したいので、Unityで作業していきます。こういうのはC++でやるの辛すぎるので。
unity 2018.2.2です。
Vuforiaの設定をする
事前にHololens用の設定を済ませておきます。
そのうえで、このページを参考にVuforiaの設定をします。 https://library.vuforia.com/articles/Training/Developing-Vuforia-Apps-for-HoloLens
ModelTargetを設定する
先ほどModelTargetGeneratorで出力したパッケージをインポートします。
インポートしたパッケージをシ、ーンヒエラルキに追加してから、必要な項目を設定します。
UnityのPlayerモードで動作確認
ここまでできると、Unity上からマーカーを認識するかなど、確認できるようになります。 シーンに追加したModelTargetの子オブジェクトとして任意の3Dオブジェクトを配置して、正しく認識するか確認します。
もし認識できていれば配置した3Dオブジェクトが表示されます。 認識できていない場合は次の点を見直すとよいです。今回はこの2つが原因でした。
- マーカーの質が悪い。光沢がありすぎたりすると、マーカーとして認識しづらいようです
- 3Dオブジェクトが大きすぎる マーカーの大きさより小さくなるようスケール設定しましょう。画面からはみ出していると何も表示されません。
エフェクトを出す
大した事してないので、簡単に説明します。
3Dモデル(天球儀)の周りに回転するタロットカードを出したいので、その一枚ポリゴンを配置します。 とりあえず4枚くらいあればいいでしょう。
タロットカードはニコニコモンズにあがってる無料素材を使わせていただきました。
あとは雰囲気だしたいので適当なパーティクルを置きます。
オクルージョンの設定
現実世界では、視点からみて奥にある物体は、手前にある物体にさえぎられると見えなくなります。あたりまえですね。
仮にコレが無い場合、今回のようなマーカーの周りを周回するエフェクトは、すべてマーカーより手前にあるように見えてしまいます。
このあたりまえをUnityに設定してあげる必要があります。
即ち - Hololensの空間マッピング機能でえられたマップを取得する - そのマップをZバッファに反映するよう指示する
まあ、このドキュメントのVisualizationあたりまでやっておけばその通りになります。 https://docs.microsoft.com/en-us/windows/mixed-reality/holograms-230
(実際に可視化の段階でZバッファにも書き込まれるので。)
空間マップの詳細説明はまだ理解が追い付いてないのでまたの機会にします。
できた!
Hololens使って天球儀にエフェクト出た!
— かたりぃな (@Catalina1344) 2018年8月9日
手に持っちゃうとNeerClipで消えちゃうので、こうやって撮影。
オクルージョン効いてる理由が椅子なのか天球儀なのかわかんないけど。
コミケ2日目に持って行って、太陽光の下でどれくらいうごくか試してみる。(たぶん動かない) pic.twitter.com/VbG1qJm0kr
感想と今後の展望
技術ブログのはずが、段々サブカル要素が混ざってカオスになってきましたが気にしないことにします。
これからの時代、一つのカテゴリだけで生き残るのではなく複数カテゴリのコンビネーションができたほうが有利だと思います。
というわけで今回はこれくらいで。