非常に広大なワールドでは、画面がチラついたりぐにゃぐにゃになったりします。
これは浮動小数点数の仕組み上の限界によるもので、技術的な限界です。
精度を高めることは可能ですが、相応の計算量が必要となります。
直径8kmで、長さ32km
超巨大なワールドとして、Space Colony “Island-4″が公開されました。
ワールド「Space Colony “Island-4″」を公開しました!
— S_朝霧@VRC (@s_asagiri_v) October 7, 2021
直径8km×長さ32kmの密閉型スペースコロニーです。
巨大スケールな円筒世界をお楽しみください!#VRChat_world紹介 https://t.co/X35dpkLj5r pic.twitter.com/2vycqGMqxG
直径8kmかつ長さが32kmにもおよぶ超広大なワールドで、歩いていては日が暮れてしまうので公共交通機関としての電車と自動車が用意されています。
自動車は最高で150km/hまでの速度を出すことができ、これは一般的にアバターで移動する速度(4.0m/s=14.4km/h)の約10倍です。
ワールドの構造としては以下のようになっているとのことです。
黄色い部分が(設定上の)本ワールド(Pleiades Cylinder)。直径8kmで、長さが32kmあるとのことです。
浮動小数点数の限界
これだけ広大なワールドとなると、浮動小数点数の精度の限界が現れます。
限界に達した場合、小数点以下(厳密には下位桁)の数値が切り詰められるようになります。
Unityでは、各GameObjectの位置や角度を単精度浮動小数点数型で取り扱います。10進数に換算すると、およそ7桁の有効数字となります。
コンピューターはデータ型の精度を超える値を取り扱えません。
「原点から1キロ離れた位置では0.1ミリを加算するのがギリギリ」
という話になります。
さらに10倍してみると、
「原点から10キロ離れた位置ではもう1ミリがギリギリ」
という話にもなります。これはけっこう無視できない値です。
とのとおり、数十キロメートル離れると目立つほどの精度低下が現れます。
精度低下により、GameObjectの存在する座標の精度も切り詰められるので(下位桁溢れ)、視界にあるあらゆるものが大きく揺れ動いたり乱れたりちらついたりするようになります。
先ほどのワールドでは、そのままでは円筒の端まで到達するとおよそ原点から16.492km離れることになります。ミリ単位でのずれが発現してしまいます。
これはワールド原点が完全に円筒の中心にあるものと仮定したものであるため、実際にはもっと離れているかもしれません。
精度低下への対策
原点から離れてしまうのであれば、原点からできるだけ近い範囲にオブジェクトを納めればよいです。
つまり、何が何でもできるだけ小さな正六面体の中にあらゆるオブジェクトを押し込んでしまえばよいわけです。
直方体では長辺を含む対角線の距離が大きく伸びてしまいますが、正六面体であれば抑制できます。
抑制するのみであって、絶対的な距離が遠い場合は当然のことながら現象は発生してしまいます。
先ほどのIsland-4は水平方向に長いワールドです。水平方向に長いと、それだけ原点からの距離が伸びてしまいますが、垂直方向にはまだ余裕があります。
したがって、水平方向にある一定以上離れた場合は垂直方向にワープさせてしまえばよいわけです。
原点から大きく離れないうちに垂直方向の別の階層へワープさせることにより、GameObjectの位置の精度低下を抑制しているようです。
なお、VRChatでワープが発生した場合はTrail Rendererなどで検知できます。
尻尾から光が出るようにしたり、アバターペンを取り出したままにしておくことで判別できます。ワープは高速なGameObjectの移動であるため、GameObjectの移動の軌跡を表示するTrail Rendererで知ることができます。
先ほどの円筒をそのまま設置した場合、原点から完全に離れた場合の距離は約16.492kmとなります(直方体換算では、約16.971km)。
このワールドの体積は、直方体に換算すると2048㎢です。可能な限り小さな正六面体に詰め込んだ場合、原点から完全に離れた場合の距離は約12.699kmまで短縮できます。
ワールドが一定以上に大きくなった場合は、できるだけコンパクトに詰めることで浮動小数点数の精度低下による影響を抑止できます。
ワールドそのものの実装
ワールドの実際の実装においては、異なる階層にいるプレイヤーを見えないようにするなど違和感をできるだけ抑える対策がなされているということです。
これこれ
— S_朝霧@VRC (@s_asagiri_v) October 10, 2021
この対策なしだと、float仕様の精度低下がとてもじゃないけど許容できないレベルだった。
自分と別の階層にいるプレイヤーは見えないようにしたりして、可能な限り違和感がないようにしてある https://t.co/4RfgEjb1Lb