LIDARではじめる、ギラギラAR

この記事はTech KAYAC Advent Calendar 2020の19日目の記事です。

こんにちは。CL技術部の藤澤覚司です。 普段はUnityを使ったAR開発などを行っています。前回の記事では、可愛いキツネさんがsoft particleの中を走り回っていましたね。コンコン。

最近サイバーパンク2077が発売されましたね。職場の人間はみんなサイバーでパンクな物が大好きなので、僕もすぐ買いに行きました。

www.spike-chunsoft.co.jp

サイバーパンク2077をプレイしていて感じましたが、やっぱりしているサイバーな街並みを見ていると、テンションが上がってきますね。僕の代わり映えしない日常もと発光していたらいいのに。だから僕はhololiveを見るための板になっていたiPadをおもむろに取り出しました。

作りたかったもの

ARKit3.5から新しく追加された機能、LIDARを使って、外環境をメッシュとして取得し、させる。それを目標としました。

開発環境

 Unity 2020.2.0b2
 ARFoundation 4.0.2
 URP 8.2.0
 iPad Pro 2020 (ipad os 14.2)

※ LIDARが使えるのは、現状ボトムズみたいなカメラが付いた端末だけなので、ご注意ください。

www.apple.com

実装

環境構築

まずビルドを成功させるために、以下の設定を行います。

・ Unityプロジェクトを作成したら、ARFoundationとURPをPackageManagerからダウンロード。

・ BuildSettingsからPlatformをIOSに切り替え。

・ PlayerSettings->OtherSettingsのTarget minimum IOS Targetを12.0に、CameraUsageDescriptionを適当に記入。

・ ProjectSettingsのXR Plug-in ManagementのPlug-in ProvidersのARKitをチェック。

このぐらい設定したら、おそらくビルドはできるようになるかと思います。

次にARFoundationでURPを使うための設定を行います。設定方法はjyuko様の記事を参考にさせて頂きました。

www.jyuko49.com

これで、URPを使ったPostProcessingやShaderGraphが有効になります。

外環境をメッシュで取得できるようにする

Unityフォーラムを参考にさせて頂きました。

forum.unity.com

ARFoundation4世代から追加された、ARMeshManagerを使うことで、簡単にLIDARからメッシュを取得できるようになります。MeshPrefabには、MeshRendererとMeshFiltterがアタッチされているPrefabを用意してアタッチすれば、そのPrefabが外環境の形状にメッシュを更新してくれます。

f:id:fujisawa-satoshi-carp:20201213215525p:plain

f:id:fujisawa-satoshi-carp:20201213220732p:plain

メッシュをさせる

Shaderを用意する

外環境の形状に変形しているメッシュに、Shaderを適応してさせます。r-ngtm様が最高にサイバーでパンクな六角Shaderを公開してくださっているので、そちらを参考にさせて頂きました。

r-ngtm.hatenablog.com

※ ShaderGraphのどこかのアップデートのタイミングで、C#で定義されたカスタムノードが使えなくなってしまっていたので、その対応に、pio様の記事を参考にさせて頂きました。

qiita.com

その結果、こんな感じのShaderが用意できました。 次はいよいよ、外環境のメッシュにこのShaderを流していきます。

f:id:fujisawa-satoshi-carp:20201214121319p:plain

f:id:fujisawa-satoshi-carp:20201214120338g:plain

メッシュにShaderを流す

やることは簡単で、外環境に変形するメッシュのPrefabのMaterialに先ほど作成したShaderを割り当てるだけです。

f:id:fujisawa-satoshi-carp:20201214165435p:plain

ただし、一つ罠があります。現状ARMeshManagerからUVや頂点カラーが取得できないため、ShaderでUVノードを使用しても、期待した動作をしてくれません。

f:id:fujisawa-satoshi-carp:20201215132103p:plain

この厄介な問題の対策を、Hidesato_Nakamura様が記事にしてくださっていたので、参考にさせて頂きました。

qiita.com

Hidesato_Nakamura様の記事によると

メッシュのUVではなく、オブジェクト座標を用いてテクスチャを貼る。 という方法で実現をしました。

とのことなので、こんな感じにUVを入力する部分にこんなノードを繋げてみると・・・

f:id:fujisawa-satoshi-carp:20201215132847p:plain

f:id:fujisawa-satoshi-carp:20201215164201p:plain

おお・・・してきました。

もうちょっとさせる

今回はURPからPostProcessingが使えるので、Bloomを有効にしてさせます。

f:id:fujisawa-satoshi-carp:20201216104312p:plain

最終的にこんな感じになりました。

f:id:fujisawa-satoshi-carp:20201216110059g:plain

街を歩いてみた

f:id:fujisawa-satoshi-carp:20201217112311g:plain

f:id:fujisawa-satoshi-carp:20201217112454g:plain

!!!

f:id:fujisawa-satoshi-carp:20201216192326g:plain

ふぅ。満足しました。

まとめ

LIDARを使って外環境をメッシュを生成し、ShaderGraphで作成したShaderを適応してさせてみました。ほぼコードを書かずに、ARコンテンツが作れるなんて、すごい時代になりましたよね。(もちろん先人の方々の力を借りまくりですが)。もっと手の込んだShaderが書ければ、表現の幅がもっと広がると思うので、色々試してみたいなと感じました。

あしたの担当は、僕と同じヘッドフォンを使っている@chanchihiroさんです。