PavilionDV7の雑多なやつ

Qiitaから移行しました。UE4に関する記事から興味のあることまで色々書きます。

【UE4】Navigation Raycastの動作について

はじめに

UE4にはNavigation Raycast(以降Nav Raycastと呼ぶ)というノードがあります。このノードの動作は少々癖があり自分の想像していた結果と異なることが多々あるため、一度Nav Raycastノードの動作を整理してみようと思いこの記事を書きました。

Nav Raycastとは

ナビメッシュ上で動作するRaycastであり視線チェック等に使われるLine Trace by Channelといったお馴染みのRaycastとは異なるものです。このRaycastはUE4が採用しているナビゲーションメッシュ構築ツールセットのRecast & Detourにて実装されているものです。

A地点からB地点までの一直線上に障害物が有るか一直線に歩行可能かを調べたいときに有効です。A地点からB地点までの間に何かしらの障害物や歩行不可(いずれかがナビメッシュ上に無い)の場合はTRUEが返ります。何も障害物等にぶつからなければFALSEが返ります。この返り値の関係についてはお馴染みのRaycastと同じです。

Nav Raycastの動作で重要な点として高さ情報が無視されるというのがあります。高さ情報が無視されるとどういう結果になるのかについては以降の検証作業でご理解いただけると思います。

Navigation Raycast(BPノード) Navigation Raycast(Recast & Detour)

Nav Raycastの動作検証

検証方法

検証に使うレベルレイアウトは次のようになっています。

f:id:PavilionDV7:20200915210941p:plain

Nav Raycastの結果に併せてFind Path to Location Synchronouslyノード(以降Find Pathと呼ぶ)の結果も提示します。これは実際の経路探索した結果との違いをわかりやすくするためです。ただしFind Pathは部分的な経路探索の結果を返すことを許容されており、たとえターゲットに到達不可能だったとしても、その直前までの経路を返します。このような部分的な結果はIs Partialノードで知ることが出来ます。今回の検証では到達可能の場合のみを考慮したいのでIs PartialノードがTRUEだった場合は経路探索失敗として処理します。

検証1 : A地点B地点ともにフロアに配置

1-1 : A地点とB地点の間に障害物無し

f:id:PavilionDV7:20200915144817p:plain

Nav Raycastは「直線上に障害物無し」を表すFALSEが返ってきており、Find Pathについても「B地点まで到達可能である」を表すTRUEが返っています。これは期待通りの動作と言えます。

1-2 : 障害物有り

f:id:PavilionDV7:20200915145110p:plain

Nav RaycastとFind Pathの動作の違いがよく分かる状況だと思います。Find PathはB地点まで到達可能と判断しており、その経路(赤三角)も示されています。しかしNav Raycastは障害物を検知したと判断しTRUEを返しています。

これは初めの「Nav Raycastとは」で紹介したとおり「一直線上に障害物が有るか一直線に歩行可能かをチェックしている」という動作を示しています。

このことからNav Raycastというのは経路の有無を調べるのには不向きであることがわかります。

1-3 : A地点とB地点を障害物で分断

f:id:PavilionDV7:20200915152858p:plain

検証1-1、1-2の結果を踏まえて見ると両者ともに期待通りの動作と言えます。

1-4 : A地点とB地点を地形で分断

f:id:PavilionDV7:20200915153531p:plain

こちらは結果は1-3と同様です。

検証2 : A地点はフロア、B地点は高台に配置

2-1 : 障害物無し。高台下にナビメッシュ有り

f:id:PavilionDV7:20200915162657p:plain

検証1は同じ階同士の動作検証でしたが検証2は異なる階でどのように動作するかを調べます。

高台下は他のエージェントも通れるくらいの高さがありナビメッシュが敷かれています。両者の結果も期待通りの動作と言えます。

2-2 : 障害物無し。高台下にナビメッシュ無し

高台下にNav Mesh Modifier Volumeを配置してナビメッシュに穴を開けてみた場合の結果です

f:id:PavilionDV7:20200915162921p:plain

検証1-2と同じようにNav Raycastは障害物有りと判断しましたが、Find Pathは到達可能と判断しました。B地点のアクターはナビメッシュ上に確実にいるのですが、少し不思議な結果に見えます。

この結果は「Nav Raycastとは」であったように高さ情報は無視されるという仕様によるものです。A地点やB地点がどの高さにいようと、足元にきちんとナビメッシュが敷かれていようとNav RaycastはA地点B地点を最下層のナビメッシュに居るものと仮定して判断します。

もしB地点の足元にナビメッシュが無く、下層にナビメッシュが敷かれている場合は次のような結果になります。

f:id:PavilionDV7:20200915215159p:plain

Find Pathは当然B地点がナビメッシュ上にないため到達不可能と判断していますが、Nav Raycastは障害物無しと判断しています。

2-3 : 障害物有り。高台下にナビメッシュ有り

f:id:PavilionDV7:20200915163811p:plain

Find Pathは失敗していますが、これは障害物があるため当然の結果と言えます。しかしNav Raycastについては障害物無しという判断がされています。これも理由は検証2-2と同じです。

  • 2-4 : 障害物有り。高台下にナビメッシュ無し

f:id:PavilionDV7:20200915165433p:plain

Find Pathは失敗ですが、今度はNav Raycastも障害物有りと判断しています。これも理由は検証2-2と同じです。

検証3 : A地点はフロア、B地点は3階建ての高台の最上階に配置

3-1 : 障害物無し。全階にナビメッシュ有り

f:id:PavilionDV7:20200915194845p:plain

検証2-1と結果は同じです

3-2 : 障害物無し。2階にナビメッシュ無し

f:id:PavilionDV7:20200915195017p:plain

検証2-1と結果は同じです

3-3 : 障害物無し。1階にナビメッシュ無し

f:id:PavilionDV7:20200915195113p:plain

検証2-2と結果は同じです

3-4 : 障害物有り。全階にナビメッシュ有り

検証2-3と同じです。

3-5 : 障害物有り。2階にナビメッシュ無し

検証2-3と同じです。

3-6 : 障害物有り。1階にナビメッシュ無し

検証2-4と同じです。

Nav Raycastの動作まとめ

検証1の結果からNav Raycastは、Start地点からEnd地点まで一直線上に障害物やナビメッシュの穴があるかチェックしており、検証2と検証3の結果からStart地点やEnd地点の高さ情報は無視され最下層のナビメッシュ敷設状況のみ考慮されていることがわかります。

f:id:PavilionDV7:20200915203915p:plain

まとめ

リファレンスに書いてあるとおりの結果でした。

参考

ナビメッシュを利用した2点の座標のパス検索について - UE4 AnswerHub