見出し画像

【VRChat】ワールドの見える距離 ~カメラのnearとfar、並びに現在のFarの上限について~

はじめに

最近、フレンドのワールドで、『カメラのFarは正しく設定しているはずなのに、ワールドの端が表示されない』という相談を受けました。

これについては私が知っている情報ですぐに解決したのですが、その情報があまりにも周知されなさすぎているので文書化することにしました。

そのうちアップデートによって直った場合は取り下げようかと思いますが、それまでの間この文章がお役に立てば幸いです。

そもそもNearとFarって何?


分かる人は飛ばして、次の章を読んでください。

以下、私の別記事からかなり引用して、説明しています。
(改めて書くのがめんどくさかったので)

Unityではプレイヤーの視点としてCameraコンポーネントが使われます。
VRChatでは悪用されないようにという目的だと思いますが、プレイヤーの視点となるCameraコンポーネントに直接アクセスする方法は禁止されています。

ですが、キチンと設定を行えば、プレイヤーの視点となるカメラにいくつかのパラメータを反映することが出来ます。

そのパラメータのうちの一つとして、重要なものがClipping PlanesのNearとFarになります。

Cameraコンポーネント

カメラを選択している時に、画面上に白い枠線の台形が表示されますが、これはカメラを視点としたときのプレイヤーの見える範囲を示しています。

この範囲外にあるオブジェクトについては描画が行われません。カメラの位置から、この台形の手前側までの距離がNearで、奥側までの距離がFarになります。

仮に100m先にオブジェクトがあるときにFarが30(m)だと、そのオブジェクトは描画されなくなってしまいます。ですので、遠くにあるオブジェクトをキチンと見せたい場合にFarの値をその距離よりも大きくすることが大事です。

またNearの値は俗にいうガチ恋距離のような、至近距離で描画されなくなる値です。0.01とかにすると顔を近づけても描画されなくなることがほぼなくなります。

このNearとFarを適切に設定したMain Cameraを用意して、VRCWorldのVRC Scene DescriptorコンポーネントのReference Cameraの欄にドラック&ドロップしてあげましょう。

それによりプレイヤーの視点に設定したNearとFarが適応されます。
(Reference CameraがNoneの場合はNearとFarはデフォルトの0.3と1000が適応されます)

再生ボタンを押し、Client Simでのデバッグを開始すると、このNearとFarが適応された状態になるので、きちんと見えているかどうかはそれで確認できるはずです。

現在(2024/07/04)、特定の条件下でFarに50000という上限が付く

ということをご存知でしょうか?結構知らない人も多いと思います。

その条件は『オクルージョンカリングを使用していること』です。
(オクルージョンカリングって何って方で知りたい方はこちらをどうぞ)

私の記憶に間違いがなければ、半年前くらい前に、オクルージョンカリングしてるしていないにかかわらず50000の上限が付くようになりました
(これは確かvrchat側のunityが2021になってからで、それまでは上限はありませんでした)

それから少し後のアップデートで修正がちょっと入って、オクルージョンカリングを使用している時のみ上限が付くようになったはずです。

必死にそのアップデートの情報ソースを探したのですが出てきませんでした……代わりにこちらのCannyをご覧ください。

このCannyを見ると、将来的にはオクルージョンカリングを使用しているしていないにかかわらず、Farの上限は撤廃されそうですが、現状はそのままのようです。

またすぐに直せない理由として、Unity側の問題かもしれないといった内容が散見されます。

ですので、直るまでは巨大なワールドではオクルージョンカリングを使わないほうが良いかもしれません(あるいは遠くの描画がされないことを承知で使うかですね)

オクルージョンカリング使えない場合の負荷対策

個室が何個かあるだけのワールドであれば対策は簡単で、コライダーを使ったUdonでプレイヤーを検出して、近くに居ない時にオブジェクトを消してあげれば良いです。

ただしコライダーによる検知だと、椅子に座ったユーザーは検知できないです。アバター持ち込みによる椅子でも同様です。

デカいワールドは素朴に厳しいかもしれません。特に航空機などは椅子に座ったまま移動してるので、この代用法は使えないかもしれません。

若干制御が難しい&プレイヤーの設定で左右されるところもありますが、LODのcullingを上手く利用して極端に離れた時にオブジェクトをカリングしてあげるのは有効だと思います。

まぁ余計な手間が増えることは間違いないので、早めに修正が入ってくれることを祈りましょう。

おわりに

何となくこの情報を頭に入れてて、困っている人には教えたりしていました。しかしながら、空恐ろしいほど周知されていない現状があります。

ですので、困っていた人がこの記事で助かれば幸いです。以上、読了お疲れさまでした。



おまけ 深度バッファの精度の低下について

NearとFarの間が大きすぎると弊害もあることを知っておくと良いでしょう。

具体的には深度バッファの精度の低下です。
これはワールド製作者に身近なところですと、重なった物体がチラチラするZ-fightingに影響してきます。

あくまでおまけなので、ざっくりと話しますが、Unityでは描画する過程で深度による比較を行います。

深度による比較で、手前にあるか、奥にあるか……つまり描画するか、しないか判断することがあります。

この時精度が落ちると、手前にあるオブジェクトと奥にあるオブジェクトが同じ位置にあるものとみなされることがあります。

そうすると
『俺が手前だ!!』
『いや私が手前だね!!』
と醜い前後争いが始まり、描画順が入れ替わりチラチラします。

それがZ-fighting(=奥行きであるZ方向の戦い)というわけです。深度精度が低下すると、これが起こりやすくなります。

特にQuestはPCに比べて精度が低いので、実際に重なってなくても重なったものとみなされやすいです。PCは座標で0.01離して置けば問題ありませんが、Questは0.01だと足りないことがあります。
(PCは正直全然気にしなくていいと思います。Questが鬼門)

ですので、不必要にNearとFarの間を離さないことをオススメします。


この記事が気に入ったらサポートをしてみませんか?