超AR
超ARという、私のARの原点であり超えられない壁。
kosakasakas.github.io
このブログの起源。
bibinbaleo.hatenablog.com
技術的にARはおまけみたいなもので、メインはWebCam の映像からIBLすること。
でも終わってから気づいちゃったけど、これって既にARkitとかで実装されている環境光推定なのでは~~~~
IBLとは
IBLとはイメージベースドライティングのこと。
画像(イメージ)をもとにライティングする。周りの風景が赤かったら物体もほのかに赤くなるみたいな。主に環境光。ふつうに写真に写る太陽や光源の画像から影をつけるのもIBLと思う。
bibinbaleo.hatenablog.com
再現するぞ!
当時はUnity始めたばっかりでスクリプト 見ても何も分からないマンだった。継承とかも全く分からなかったので多分そこで躓いて再現できなかったんだと思う。
今ならできるかな!がんばるぞ!!
当時の自分に教えるように当社比少し丁寧に書いていく。(かも)
環境はUnity2018.3.8のWindows です
Luxシェーダーを適用する
このLuxというアセットを入れる。
github にもあるので、私はそっちからとってきた。
github.com
普通の使い方はこちらの記事が詳しい。
無料アセットで簡単にIBLが出来るオープンソースシェーダLux - Qiita
そして、ARしたい(もしくはIBLを反映させたい)オブジェクトのマテリアルにLux系のシェーダーを付ける。
とりあえずIBLさせるだけなら何でもいいのかな?
Unityちゃんでやるときは
自分は肌系はLux/Bumped Diffuse、洋服系はLux/Bumped Speculaer、髪はLux/Human/Hairを設定しています。
だそうです。
下準備終わり!
3年前の私も、今日の私もこの下準備をやっていなかったからできなかったんだ。。。
まじでアホや
IBLを動画に対応させる
こちらのCustomSetupLuxを入れる。
ユニティちゃんを超ARしてみたときのコード群 · GitHub
gistのCustomSetupLux.csのスクリプト はクラス名がtestになってるから、適宜変えてファイル名と合わせようね。
CustomSetupLuxはSetUpLuxを継承している。
最初に入れたLuxアセットの中にあるSetUpLux.csのvoid Start()とvoid Update()の前にpublic virtualを付ける。
docs.microsoft.com
これでエラーは消えた!!当時はこの時点でエラーまみれで終わってた気がする。
またこれはオブジェクトの大きさによると思うけど、生成されるカメラのx位置が10になっていて半球の映像が映らなかったので私は0にしました。
なんで10なのかよくわからない。
その後CustomSetUpLux.csを適当なオブジェクトにつける
セットするのはTargetObjだけでいいと思う。
TargetObjは光を当てたいメインのオブジェクトのこと。
この位置をもとにカメラやcubemapを生成している
こちらからsemiSphere.objを使わせてもらう。
ユニティちゃんを超ARしてみたときのコード群 · GitHub
メモ帳に中身コピーして.objで保存した
内側だけ描画される半球
マテリアルは何でもいい。Unlit/Textureとかのほうがきれいに映るかな
そして同じgistのWebCamBehaviourScriptを作って半球に貼る。
最初renderer.matrialのところに「これは非推奨です」って赤線出たけど、
いったん保存してUnity戻ってスクリプト に戻ったら勝手にいい感じに変わってた。そんな機能?あるんだ。
エラー:Renderがない
実行したらRenderがないって言われた。
半球の空の親にスクリプト を付けてた。
MeshRendereがついているほうにスクリプト を付けたら治った。
エラー:Could not find specified video device
もう一つエラー。
ERROR - Could not find specified video device UnityEngine.WebCamTexture:Play() WebCamBehaviourScript:Start() (at Assets/WebCamBehaviourScript.cs:27)
カメラがないみたいに出てるけど、ないときは
Debug.LogError("Webカメラ が検出できませんでした。");って出るはずなので他の何か。
あとでVuforiaを設定したときに分かったけど、カメラの1番目がVRHMDのDell になっていたみたい。
こちらの記事を参考に3番目のカメラからwebCamTextureを作るようにした。
nn-hokuson.hatenablog.com
new WebCamTexture()の中の最初にdevices[2].name を加えた。
半球に映像が映り、IBLされる
うまくいくとちゃんと半球にWebCam の映像が映り、Luxシェーダーを付けたオブジェクトにIBLされます。
ガンマの値を上げすぎたりしていると真っ白になるので調整したほうがいい
VuforiaでAR
はっきり言ってARはもはや何でもいい。もはやARしなくてもいいまである。
とりあえずなれているVuforiaで
世界一役に立つ私の過去記事を参考にARする。Unity2018
bibinbaleo.hatenablog.com
IBLする前にARした時はできたのに、今できなくなっちゃった!
はあ
WebCamTextureを貼ったら画面が真っ黒になるし、CustomSetUpLuxをアクティブにしたら上みたいになる。AR用のWebCam が生きてない感じ。
いろいろなモデル
VIDEO youtu.be
この二人を置いてみます。
Luxのシェーダー付けたらトマシープちゃんが変になっちゃった。でも実行すると普通になる。
あんまりトマシープちゃんは環境光の影響受けてない。
最後に
なんかARできなかったけど、成長は感じられたので良かった。
当時は何が分からないかもわからなくて、誰にも聞けなくて結局あきらめた。
VuforiaARが載ってるらしいよ!
(おまけ)IBLされない問題
以下はマテリアルにLuxのシェーダーを付けてなくて、IBLされなかった時の嘆きです。
----------------------------------------------------------------------------------------------------------------
なぜーーー IBLされない!
まずスクリプト で生成されるカメラとcubemap2種類がちゃんと生成されているかを見る。
cameraとCubemapをpublicにします
実行中見てみるとちゃんと生成されています。
ダブルクリックするとインスペクタを見ることができました。
ちゃんと生きてそう。
ただカメラのx位置が10になっていて半球の映像が映っていないような気がするので0にします。
なんで10なのかよくわからない。