デフォルトの設定では、NavData の精度は限定的になっており、地形メッシュの垂直方向の高度と一致することは保証されません。NavMesh の目的は、地形の移動可能性とトポロジを抽象的に表現することであるため、Gameware Navigation ランタイム コンポーネントの観点からは、移動可能な領域とそうでない領域の区別ができてさえいれば、地形の高度に厳密に従っている必要はありません。
しかし、場合によっては、正確な高度の情報を直接 NavMesh に埋め込む方がよいこともあります。たとえば、キャラクタが歩き回るときに地面に沿って表示されるように高度を調整する場合、たとえ通常の結果が多少厳密さを欠いていても、物理的なレイキャストを使用するよりも NavMesh の高度を使用する方が CPU 時間ではるかにコストがかからないと感じるでしょう。
より高い精度が必要な場合、NavData 生成システムは、指定した許容値内で、元の地形メッシュの高度に合うように NavMesh の高度を強制的に合わせることができます。このようにすると、一般的には、NavMesh を構成するトライアングルが小さくなり、数が多くなります。
NavData 生成システムは、地形の NavData を作成した後で、元の地形メッシュの高度にさらに近くなるように NavMesh の高度を調整する後処理ステップを実行します。
このシステムでは最初に、設定可能な間隔で水平方向のサンプリング グリッドを作成します。そしてこの間隔は、元々は地形メッシュのラスタライズ用に設定されていたピクセル サイズの倍数になるように内部的に調整されます。これはこのグリッドを元のラスタライズ処理と合致させるためです。このサンプリング グリッド上の各ポイントで、地形メッシュと NavMesh との高度の差が計算されます。
デフォルトの NavMesh と垂直方向の高度が正確な NavMesh との違いを、次に示す地形のサンプルを使用して説明します。
NavData 生成システムに対して設定されている移動範囲モデルでは、これらのピラミッドの表面をキャラクタが自由に移動できるようになっているとすると、デフォルトの設定では次のような NavMesh が生成されます。
上の図の NavMesh は、この領域の移動可能性を正確に表しており、実行時に Bot が使用するうえで問題はありません。ただし、この NavMesh では、地形の大まかな形状が表現されているものの、元の地形メッシュの高度が正確に反映されているわけではありません。キャラクタの足が実際の地面の高さで捉えているように見せるための高度を、衝突システムを使用しないで NavMesh の高度を基に決定した場合、キャラクタが交互に出す足は地面から少し浮くか、ピラミッドに少しめり込んで見えます。(Z ファイティング を回避するため、NavMesh の高度は Navigation Lab によって表示目的で地形の高度から少しオフセットされます。NavMesh の実際の高度は、位置によっては地形メッシュよりも下へと超えていきます。)
このような場合に、NavMesh が地形に沿う精度を高めるには、垂直方向の許容誤差(および水平方向のサンプリング ステップ)を小さくします。必要であれば、次の図のように忠実さを極度に高めることもできます。
高度の許容誤差は、Gameware Navigation Lab と NavData 生成システムの API の両方で設定できます。
高度の許容誤差を Navigation Lab で設定するには:
高度の許容誤差を Generator で設定するには:
Altitude tolerance (m) コントロールに目的の値を設定することにより、デフォルトの高度の精度を下げることができます。
生成に要する時間は短くなり、NavData の最終的なサイズも小さくなりますが、ほとんどの場合、この設定はお勧めできません。NavMesh の高度が地形の高度と大きく異なる領域では、地面と同じかそれよりも高い 3D 位置に対応する NavMesh を、Bot および障害物の空間化のためにランタイム コンポーネントが正しく取得できなくなる可能性があります。その結果、移動可能かどうかの照会が正しく行われず、障害管理システムを適切に使用できなくなる可能性があります。