こんにちは!
Unity の NavMesh 機能をつかって自動車を実装したところ、自動車が地面から浮いてしまう問題が発生しました。
今回はこの問題の調査・解決記録です。
[toc]
浮き上がる自動車
Unity NavMesh で自動車を実装したところ、下の画像のように若干浮いてしまう事象に直面しました。
影の描画が ON だと、かなり目立ちます…。
原因
ググったところ Qiita の記事がヒットしました。
@VeyronSakai氏の投稿記事 : NavMeshが若干浮いてしまう時の対処法
この記事に基づいて NavMesh の Bake 結果を見てみたところ、確かに NavMesh が浮いていました。
下の画像は、車道と歩道の境界線を拡大したところで、白線の引いてある車道メッシュよりも水色の NavMesh が高い位置に設定されていること・浮いていることがわかります。
これはどうやら Unity の NavMesh を Bake するプロセスによって引き起こされているようです。
Unity では NavMesh を抽出するときに、3D 空間を NavMesh Agent のサイズ基準でボクセル化するようで、1 ボクセルのサイズが大きいほど、このように高度のずれが発生するようです。
そのため解決方法としては、下記 2 点が有効のようです。
- NavMesh Agent の高さを低くする
- ボクセル精度を上げる
(先の Qiita の記事でも解決策について言及があります)
対策
今回はボクセル精度を上げることで対策します。
Voxel Size (ボクセルサイズ)とは何か・・・これは公式サイトのマニュアルに書いていたので引用します。
マニュアルボクセルサイズは、ベイクプロセスが動作する精度を変更することができます。
NavMesh ベイク処理は、任意のレベルのジオメトリから NavMesh をビルドするためボクセル化を行います。アルゴリズムの最初の段階で、シーンがボクセルにラスタライズされ、歩行可能な面が抽出されます。最終的に、この歩行可能な面が NavMesh になります。ボクセルサイズは、最終的にできる NavMesh がどのくらい正確に作成されるかの指標となります。エージェントの半径あたり 3 個のボクセルがあるようにデフォルトの精度が設定されています。つまり、全部のエージェントの幅は 6 ボクセルです。これは、精度とベイク速度との間の良好なトレードオフです。ボクセルサイズを半分にすると、メモリ使用量が4倍に増加し、それはシーンをビルドするために4倍長く時間がかかります。
とりあえず 0.05 に設定して Bake したところ、下図のようになりました。
まだ若干浮いていますが、だいぶ良くなりました。
ちなみに Voxel Size を最小値の “0.012” にしたところ Bake 処理が終わらなくなったので Unity を強制終了しました😅
PC の性能に依存するとは思いますが、最小値に設定するのは止めたほうがよさそうです。
結果
これで自動車の走行実験です。
おぉー素晴らしい!😆
よーく見ると少し浮いているように見えますが、全然気にならないので、とりあえずこれで実装を進めます!
きょうも最後までご覧いただき、ありがとうございました!
コメント