LoginSignup
7
1

More than 3 years have passed since last update.

ARグレイマンを歩かせてみよう!! UE4-ARCoreのTipsと、AR Shadowについて

Last updated at Posted at 2020-12-23

はじめに

いきなりネタバレですが:stuck_out_tongue:、上のツイートはARグレイマンをUniversal CityWalk Hollywoodで歩かせた時のムービーです。
世の中的にはモバイルARと言えば、LiDARが載ってるiOS端末でARKit!!、というのが主流な気がしますが、GoogleのARCoreも負けてはいません。
私は二年落ちのGoogle Pixel3を使っているので、UE4-ARCoreにチャレンジしてみたいと思います。

開発環境

  • UE4.26.0
  • デバイス Pixel3

UE4のARCoreサポート状況

ARCoreが発表され始めた頃は、GoogleがUE4へのインテグレートを行ってたのですが(https://github.com/google-ar/arcore-unreal-sdk)、
最近は更新もぱったり止まってしまっていました。
そんな中2019年12月にARCoreがDepth APIのリリースを発表、Unityのサポートも名言、UE4に関しては全く言及なし、という事で、ああこれはもう先が無いかな~、と正直思ってたんですが、なんとなんと!! 4.26でARCore 1.8とDepth APIのサポートをEpic自らインテグレートしてくれました!! (https://docs.unrealengine.com/en-US/WhatsNew/Builds/ReleaseNotes/4_26/index.html)
DepthはARにとって非常に大きな要素です。レンダリングのコア部分に踏み込めるEpicがインテグレートしてくれた意味は大きいと思います。

HandheldARサンプルでDepth APIを有効にする

とりあえずUE4でARと言えば、ここから始まるHandheldARサンプル。
デフォルトではDepth機能が無効化されているので、これをオンにしてみましょう。
image.png
- Use Scene Depth for Occlusion=ON
- Enable Session Tracking Feature=Scene Depthにセット
そしてAndroidビルドを作るだけです。

結果はご覧の通り。椅子の後ろのオブジェはちゃんとオクルージョンされているのがわかります。ただし半透明マテリアルにはオクルージョンが効いてないんですよね…。ちゃんとDepth Testはオンにしてるのですが…。ちゃんとエンジンソースを読めばわかるかもしれませんが理由は不明です。

HandheldARサンプルにグレイマンを入れ込む

これは色々なやり方があると思いますが、今回はタッチした場所に歩くようにしたかったので、TopDown C++サンプルから、AssetsとCodeをマイグレートする方法で行いました。C++プロジェクトでなくBPプロジェクトを使っても問題ないと思います。
Assetのオペレーションで細かい部分を書くと大変なので端折りますが:sweat:、大雑把にやった事としては、以下の通りです。

  • Codeをマイグレート。ContentはMannequin,TopDownCPP以下のMapをマイグレート。
  • BP_ARPawnをReparentして、TopDownのPawnの子供にする。
  • BP_ARPlayerControllerをReparentして、TopDownのPlayerControllerの子供にする。
  • TopDownExampleMapの余分な壁などを削除、DefaultGameMapにセット。
  • Map上にCameraActorを配置。Auto Activate for Player=Player0をセット。

AR Shadowについて調べてみた

ARでは影は非常に重要な要素の一つです。影の有無で、存在感が全く変わってきます。
HandheldARでは、プリミティブなオブジェクトしかないので丸影を使っていますが、やはりグレイマンからは、ちゃんとCast Shadowを落としたい所です。
しかし調査し始めて、これがかなり難しそうな事に気付きました:frowning2:
まず情報が少ない。情報があったとしてもかなり古くてそのまま使えないものがほとんどでした。
https://youtu.be/Z6FAl6v0ax0

そんな中では、このムービーが一番有益だったと思います。が、このムービーも4.17でARKitを使っているので、そのまま持ってくることは出来ませんでした。

AR Shadowのマテリアル発見!!

色々調べた末に、何とEngineの中に使えるサンプルマテリアルがある事に気付きました。灯台下暗し!:stuck_out_tongue:
\Engine\Plugins\Runtime\AR\ARUtilities\Content\Materials
この中のM_ScreenSpacePassthroughCameraが今回使用するマテリアルです。
image.png

ScreenSpacePassthroughCameraマテリアルを使ったAR Shadowの実装

(最初ツイートした時にはEngine改造が必要だと書きましたが、4.26正式版でもう一度トライしてみたらEngine改造無しで出来ました!!:grinning:
このマテリアルをそのまま使う事は出来なかったので、以下の様な変更を行いました。
1. /Engine以下のファイルを変更するのは、あまり好ましくないので、まずM_ScreenSpacePassthroughCameraを自分のContentディレクトリにCopyします。
2. M_ScreenSpacePassthroughCameraを変更します。
- ShadingModelDefaultLitに変更。
- 最終OutputをEmissiveColorからBaseColorに繋ぎなおす。
image.png
3. M_ScreenSpacePassthroughCameraからMaterialInstanceを作成して(MI_ScreenSpacePassthroughCamera)、変更する。
- UseExternalTextureと、ExternalCameraTextureをOn。
image.png
4. BP_ARPawnにShadowレシーバー用のShadowMeshを作って、MI_ScreenSpacePassthroughCameraをアサイン。
image.png
5. BP_ARPawnのBlueprintを変更。
- MaterialInstanceDynamic型のVariable、ShadowMaterialを作成。
- 以下のロジックを追加。TickでGetARTextureで取得したCameraImageを、TextureParameterValueExternalCameraTextureに更新させるのがポイント。
image.png

動いた!! けどいくつか問題点が…

これで最初のツイートで見せた、ARShadow付きの歩くグレイマンが動きました!!
別テイクのムービーも載せておきます。

しかしムービーを見てもらえればわかると思いますが、Litマテリアルはライティングの影響を受けてしまっているので、よく見るとShadowMeshが見えてしまいます。これの解決法も現時点ではわかりません。誰か知ってる方がいましたら教えて下さい…:sweat:
(前述のチュートリアルムービーでは、CastModulatedShadowsを使えばUnlitマテリアルにも影が落とせると言及されていたのでテストしてみましたが、動きませんでした。)

あとオクルージョンが上手く判定出来ないケースもやはり多いですね。下の柵は割といい感じに取れているのですが、背景がごちゃごちゃしてると誤認識してしまう事がままあります。まあこれはGoogleが頑張ってもらうのを待つか、LiDARが載ってるデバイスを買うしかなさそうですね。

今後の予定?

せっかくUE4-ARCoreの基本がわかってきたので、時間をみつけて今後も何かしたいと思っています。
VRマルチプレイヤーFPSはさんざん作ってきたので、ARマルチプレイヤーFPSを作ってみたいのですが…、まずもう一台ARCoreが動く端末を手に入れないといけませんね:sweat:

ここまで読んでいただいてありがとうございました。UE4-ARCoreをやってる人はかなり少数派だと思うのですが、がんばっていきましょう~。

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1