机や椅子といった小物から、衛星通信アンテナみたいな巨大構造物まで、静的オブジェクトって山ほどありますよね。家具は厳密にはstaticと言い切れないかもですが、まあHavokで動くことは無いのでとりあえず。
こうしたオブジェクトの一部が、
見る角度次第で突然消えたり現れたりした!
なんて経験無いです?
バニラでは恐らく起きない筈ですが、セル改変を伴うMODの構造次第では、こうした不具合が結構発生します。CTDリスクにはならないですが、見た目が落ち着かないので修正することにします。
※お手本扱いではなく、『こんなんでも対策できたらしい!』位のスタンスでお願いします。用語はCK定義に倣ってるつもりですが、嘘あるかもです。
- 角度によって消える机
- 見る角度によって机が消えてしまう原因
- Precombined Visibility(Previs)とは?
- 机の消え方とカメラ位置の関係を確認
- 対策1.Previsの無効化
- 対策2.PrecombinationとPrevisをCKで作成
- 対策後の動作確認
- Precombinationの確認
角度によって消える机
Park Street Stationの、とある一角の机。
この机の見る角度を変えていくと・・・机が消えてしまいました!
無くなる訳ではなくて、見る角度によって表示されたり消えたりを繰り返してしまいます。 すごい鬱陶しいw
順を追って、原因を見ていきます。
見る角度によって机が消えてしまう原因
問題の机は、Perk Street StationにあるRefID:0013B6F4
。各地の地下鉄を接続する
Subway Runnerを入れてる為、机の位置がバニラから変更されてます。
バニラでは奥の壁沿いに置かれてますが、Subway Runnerでドア(RefID:xx023A74
)を設置してる為、邪魔になったんでしょう。
当初は、追加されたドアのほぼ真後ろに置かれてました。
この『バニラの静的オブジェクトを移動した』ということが、角度によって机が消えてしまう原因なんです。セル内のオブジェクト配置と、Precombined Visibility(PreVis)の間に不整合が起きてます。
Precombined Visibility(Previs)とは?
簡単化の為、プレイヤキャラのカメラ(視界、画角)を、平面的に捉えてみます。超アバウトですが!
下図のような位置関係で考えます。
この平面図だとレキシントンの街並みはコルベガに完全に遮られてる為、プレイヤのカメラには入りません。絵面的には、無くてもOKということになります。つまり、描画しても無駄な負荷が増えるだけで、デメリットにしかならないです。数が多いと、深刻なperformance issueに繋がります。
※実際は奥行きがあるので背の高い建物は見えますし(描画されないと困る)、逆にコルベガ内でも完全に遮蔽されたオブジェクトなら、描画しても意味が無いことになります。
そこで、
カメラに入らないオブジェクトは描画しないよ!
的な対処が必要で(Occlusion Cullingとかですかね)、これに使われるのがPrecombined Visibility(Previs)です。セル毎のPrevisファイルを参照し、Visibility(カメラに入ってるか否か)を判定することで、カメラに入らないオブジェクトを描画しません。これなら最小限の負荷で済みますね。カメラに入ったら部分的に謎の光被せるMODとか作れんのかなこれ。
重要ポイントとして、Previsファイルはゲーム内で作成される物ではなく、事前に作成しておく必要があります。よって、セル配置されたオブジェクトとPrevisファイルの間に齟齬があると・・・描画の可否判定に異常が起こりそうな予感!
机の消え方とカメラ位置の関係を確認
カメラの角度を振って確認。この状態だと、かつて『バニラの机』のあった位置が画角に入っており、机が正常に描画されてます。
右に振って『バニラの机』を画角から外すと、同時に机が消えました。
別の角度でも実験。まだ机が表示されてます。
カメラを下に振って『バニラの机』を画角から外すと、やはり机が消えました。
以上から、セル内の机の位置を変更したものの、Visibilityはバニラの座標のままで計算されていることが、机が消える現象の正体と考えて良さそうです。
対策1.Previsの無効化
手軽なのからいきます。該当セル(ここではPark Street Station)に対して、Previsの使用を無効化します。FO4Editで簡単なパッチ作るだけ。
これで表示上は解決しますけど・・・Previsを無効化するということは、
見えないオブジェクトも常時全部描画する
ことになります。
セルによりけりですが、強烈な負荷上昇に繋がることは、容易に想像できますね。不要な物に大きくリソース取られることになる為、かなり無駄。
セル改変でバニラオブジェクトを移動してるMODの多くは、こちらで対策されてると思います(もしくは何もしてない)。セル改変で劇的に重くなることがあるのは、これとPrecombination(Precombined mesh)の解除が主な原因ですね。入植地の解体対象オブジェクトを増やしたり、入植地そのものを増やすMODも大抵解除してる為、同様に重くなります。
Precombinationについては、別記事にて。
対策2.PrecombinationとPrevisをCKで作成
Moddingしたセルに合わせて、Precombination(Precombined mesh)とPrevisを再作成します。
まずはPrecombination。『Park Street Station』のセルをロードした状態で、『PreCombine Geometry for Current Cell』を実行。
さして時間もかからずに、Perk Street StationのPrecombined meshが出力されました!
実際は、もっと大量にファイルあります(僕の環境では647個)。
当然プラグインからの指定も変わってる為、競合確認必須です。
続いてPrevis。『Generate Precombined Visibility for Current Cell』を実行。
こちらも正常に出力完了!
対策後の動作確認
『バニラの机』を画角から外しても、ちゃんと表示されるようになりました。現在の座標でPrevisが再作成されたおかげですね。
ちなみにMODをアンインストールする時は、Precombination及びPrevisの削除も忘れずに。でないと今度は、この机位置が画角内に無い時、バニラ位置に戻った机が消えます。
Precombinationの確認
Subway Runnerで追加された、扉面の壁。変更前はターゲットすることでID取得が可能ですが、
変更後は取得できなくなりました。Precombinationが機能してますね(Precombined meshに差し変わって単体IDのメッシュファイルを使ってない為)。
家具やコンテナは対象外なので、机は事前結合されません。RefID取得可能のままです。
それと、この記事の支度が終わった後に気づいたことなんですが・・・。Perk『Demolision Expert』のrank2取得でグレネードの投擲軌跡が表示されますが、時々うまく表示されない経験ありません?
これ、どうもPrecombinationとPrevisを使ってないセルで発生するようです。詳細は次回にて。と言ってもPrecombinationとPrevis作るだけなんで、やること同じですがw
おまけ記事にしようかと思ったんですが、目的が違うので別記事にした方が読み易いかな、ということで。
以上、おしまいです!