196の日記

完全に開発メモと雑談、その他忘れそうな計算式などを書き溜める場所になっています!

Unity VR どこでもドア ポータル ワープ

(` ・ ω ・)
f:id:thinline196:20170506180337p:plain

どこでもドア

をVRで表現した展示があるという噂を聞きました。それ意外と簡単にできるんじゃね?なんて甘い考えから始まった制作。

しかし、既に制作した方がいました笑
qiita.com


そしてそれを unity ネイティブのVRライブラリに書き換えてくれている方もいらっしゃいました。
tuti107.hatenablog.com



あああ、もう何番煎じなんだよって感じです。。。


仕方ないので、レガシーはありがたく参考にさせていただきます。




今回作ったもの

上の方々が作っていない(ブログに書いていないだけかも)、瞬間移動の部分(ワープ)を実装しました。


github.com

上のリンクから、今回のプロジェクトを落とすことができます。一応、HMDの種類は問わないはずです。





気をつけるポイント

・解説されていますが、視差をつけてのレンダリングでしょうかね。unityではカメラで見えているものをそのままTextureにレンダリングする機能がありますが(しかも簡単)、これをHMDで見た場合、当然スクリーンに映し出されたようなものになります。
・後は、合わせ鏡のようなオブジェクトの配置への対策。最適解は見つけ出せていないのでアレですが、処理落ちしてアプリケーション自体も落ちます。



使い方

・移動はWASDでの移動で、視線の先を常にWとしそれを基準にASDも決定される。
・Gで目の前にポータルを生成。
・ポータルをくぐることによって、Main空間とSub空間を移動することができる。

未実装&注意点&バグ

・出現させたポータルの裏側はシースルー状態になっていますが、コライダーの判定が残っているので通り抜けることができません。別の世界へ移動してしまいます。動画では上手くできているように見せていただけです。
・合わせ鏡状になると落ちる趣旨の話をしましたが、それ関連の話で、ポータルから別世界を覗いた時に、別世界にあるポータルは表示されないようになっています。なので、トンネル状態にして今の空間から別空間を挟んで今の空間を覗くことが今の所できません。これはなんとかなりそうな気もするので、いい案が浮かんだらやるかもです。
・動画上ではそれほど気になりませんが、HMDからポータルをのぞいた時、頭の揺れとポータルの映像が本当に少しだけズレる。描画順に問題があるのか、HMDの描画が酔い対策で異常に早くなっているのか。
・もし配置しているオブジェクトにrigitbodyなどを付ける場合、ポータルと被ると移動時に挟まったりエラーになったりしそうなので、その場合はコライダーを空間ごとにまとめてOnOffを管理する機能を作るべきだと思います。
・たまに、ポータルを潜っても空間が移動できずすり抜けてしまうバグがあります。原因不明。主に起動後の最初の1回目に起こります。







このプロジェクトのキモ

・LayerとSkyboxを上手く使っています。
・LayerをmainObjectとsubObjectに分けることによって、カメラに別空間のオブジェクトが写らないように、Skyboxをカメラごとに変更し上手く切り替えることで、まるで移動したかのように見せています。
・qiitaの方にまとめてくださっていた方は、二つの空間を少し離した位置に生成し、それを複数カメラで位置同期を上手く行いながらプロジェクトを作られていましたが、LayerとSkyboxを使うことにより、カメラは全て同じ座標を共有するようにし、二つの空間のオブジェクト配置も同じ位置に移動することができました。
・カメラとポータルの表面で衝突判定を取っているので、それにより世界が切り替わります。
・そのため、どこでもドアとは離れましたが、瞬間移動をお手軽に実装できました。


まとめ

ふと思ったけれど、VR空間上で広い荒野にドアを設置しておいて、開けた瞬間にドアの先に部屋を生成したら意外とそれっぽくなりそう笑