VRChatワールドギミック「カメラスイッチャー」のメモ
はじめに
受注案件で作ったワールドに設置したカメラスイッチャーをメンテしようとして久しぶりに触ったら自分で作ったにも関わらずだいぶ構造を忘れてしまっていた。これではメンテナンスに支障があるのと、クライアント側からみて完全なブラックボックスになってしまうのでその構造について書いてみたい。
いまやBOOTHを漁ると『Lura's Movie Director Panel【β】』や『MultiAngleCamera』を始めとして似たようなツールや更に高機能なツールが売られている昨今だが、何らかの事情で自作したり構造を解明したい人の手助けになれば幸いである。
カメラスイッチャーとは
配信などでVRChatを使う時にあらかじめワールドに設置してある複数のカメラを選択し、それを切り替えながら配信したい時がある。もともとVRChatに搭載されているカメラでもワールドの任意の場所にカメラを固定できるとはいえ、固定できる数が限られている上にそもそも毎回ワールドを立てるたびに設定するのは面倒だ。
そんな時にワールドにカメラスイッチャー機能があれば、カメラを固定したままであらかじめ設定した良いアングルからのカメラを切り替えながら配信出来る。そんな訳でVRChatでも音楽イベントワールドを中心にカメラ切り替え機能があるワールドはそこそこあるとはいえ、悪用可能な視界ジャック機能を使うせいなのか、少なくともワールドを作った当初は意外と資料が無くて大変だった。
使い方と機能
最初に簡単にワールドに置いたカメラスイッチャーの機能を説明したい。
まずVRChatのカメラを客席側に向けてワールド固定する。
次に正面スクリーン脇にあるカメラ切り替えボタンをONにする。
するとカメラの画像をジャックする形で配信用カメラの画像が表示される。あとは必要に応じてOBS等でカメラの画像を取り込めば配信出来る。
構造について
では実際にUnity上でどのようになっているか解説する。
スイッチャー自体は単純にみんなが使っているLura's SwitchでON,OFFさせている。
スイッチャー自体はカメラとPlaneから出来ていて、カメラで撮った画像はRender Textureに転送され、それをPlaneに貼られている特殊な視界ジャックShader経由でVRChatのカメラに転送するようになっている。
カメラで撮った画像は"Target Texture"で指定したRender Textureに転送される。Render TextureとはUnityでメインカメラとは別視点の映像を表示するのに使われる機能で一度レンダリングした画像をテクスチャ領域に書き込み、 レンダーテクスチャ(RenderTexture)として他の視点でのれレンダリングに再利用することが出来る。(具体的な使用例)
次にこのレンダーテクスチャに送られた画像をVRChatのカメラに転送するために、いわゆる視界ジャックシェーダーを使用する。
視界ジャックシェーダーと言うのは俗称で、要はカメラに対して視界エフェクトをかけられるシェーダーの中でカメラで撮ると、シェーダーに設定されている画像が元のカメラから見ている映像を上書きしてカメラに表示される特殊なシェーダーの事である。
視界ジャックシェーダーはBOOTHを始めとしてGitHubやDiscordなどで様々なものが配布されているが、今回は「VRChatのカメラだけ」に影響を与えるものを選択する必要がある。
(さもないとONにした途端にHUDのカメラまでジャックされて、プレイヤーの視界が奪われてしまう)
なおVRChatでどのカメラが使われているかは、VRChatのシェーダー向けにカメラの種類を区別する変数が提供されているので、それを使ってシェーダーから指定する事が出来る。
とはいえ自分でシェーダーを書くのはしんどいので今回はBOOTHで公開されている神城工業さんのTexture Overlay Shaderを使わせてもらった。
これをUnityのPlaneに適用しMain Textureに先ほど設定したレンダーテクスチャを適用する。
あとはこれを客席側に配置してLura's SwitchでONにすれば、手元のカメラの画像がジャックされて配信用カメラに切り替わる仕掛けである。
ここで注意するのは設定を間違えるとメインカメラまでジャックされて目隠し状態になってしまうことだ。
作業中やテスト中に何度もこれをやって文字通り手探りで復旧させることになったのは内緒である。
この記事が気に入ったらサポートをしてみませんか?