UE4のdtPolyの関係NavArea、AreaFlagsとリキャスト

 
 

Navmeshはリキャストナビゲーションを使用して、UEの根底にあり、通常、実質的にこれらのポリゴンを使用して経路探索され、グリッドリキャスト凸多角形に分割されます。

/// Defines a polyogn within a dtMeshTile object.
/// @ingroup detour
struct dtPoly
{
	/// Index to first link in linked list. (Or #DT_NULL_LINK if there is no link.)
	unsigned int firstLink;

	/// The indices of the polygon's vertices.
	/// The actual vertices are located in dtMeshTile::verts.
	unsigned short verts[DT_VERTS_PER_POLYGON];

	/// Packed data representing neighbor polygons references and flags for each edge.
	unsigned short neis[DT_VERTS_PER_POLYGON];

	/// The user defined polygon flags.
	unsigned short flags;

	/// The number of vertices in the polygon.
	unsigned char vertCount;

	/// The bit packed area id and polygon type.
	/// @note Use the structure's set and get methods to acess this value.
	unsigned char areaAndtype;

	/// Sets the user defined area id. [Limit: < #DT_MAX_AREAS]
	inline void setArea(unsigned char a) { areaAndtype = (areaAndtype & 0xc0) | (a & 0x3f); }

	/// Sets the polygon type. (See: #dtPolyTypes.)
	inline void setType(unsigned char t) { areaAndtype = (areaAndtype & 0x3f) | (t << 6); }

	/// Gets the user defined area id.
	inline unsigned char getArea() const { return areaAndtype & 0x3f; }

	/// Gets the polygon type. (See: #dtPolyTypes)
	inline unsigned char getType() const { return areaAndtype >> 6; }
};

2つのカスタムを見つけることができるこのような構造の注意深い観察は、フラグは、16ビットがさらにareaAndtype、8ビット、および6はareaAndtype領域を示す使用されている、2タイプを示し、領域を格納するために使用することができますカスタムデータ。

UE、およびナビゲーション領域の種類にUNavAreaを有しています。NavArea書き込み型ナビゲーション領域を作り直すように構成領域を表します。そこに加えNavAreaも同時に書かAreaFlags、では、このAreaFlasは、独自のデフォルトは1.0である非歩行を表して定義することができます。また、NavigationQueryFilterは、クエリクエリ時間または除外の種類に使用するタイプを設定するためにこれらのフラグを使用することができます。

// 
// Use UNavigationSystem.DescribeFilterFlags() to setup user friendly names of flags
// 
USTRUCT()
struct NAVIGATIONSYSTEM_API FNavigationFilterFlags
{
	GENERATED_USTRUCT_BODY()

#if CPP
	union
	{
		struct
		{
#endif
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag0 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag1 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag2 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag3 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag4 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag5 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag6 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag7 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag8 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag9 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag10 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag11 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag12 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag13 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag14 : 1;
	UPROPERTY(EditAnywhere, Category=Flags)
	uint32 bNavFlag15 : 1;
#if CPP
		};
		uint16 Packed;
	};
#endif
};

NavLinkもあり、異なる領域を接続するために、最上位ビットはフラグを表現します。

// setting up the last bit available in dtPoly::flags
NavLinkFlag = ARecastNavMesh::FNavPolyFlags(1 << (sizeof(((dtPoly*)0)->flags) * 8 - 1));

現在のポリゴンの面積タイプを照会するために、多角形領域の領域ID照会することによって得ることができ、およびID UClassに対応し得ることができます。残念なことに、ArealD及びタイプフラグは1に一つであり、デフォルトのオブジェクトUClassに、同じクラスNavAreaポリゴン領域と対応するフラグメモリは同じです。例えば、2 NavModifierを展開シーンで、型障害の領域は、その後のナビゲーションで、私は地域の私の現在の障害を知ることができます修正、それは多角形を照会することによって、障害物領域では知られていません。

が類似デマンドで、またはエンジンのコードを変更する場合に、フィールドに情報を追加、または他の場所に記憶されたフラグ、または追加情報16を再利用する方法を見つけます。最初の2つの方法は、後者は必要なときに照会されますたとえば、ナビゲーション中に保存多角形の異なる領域に構築することができ、より便利な方法だ、エンジンを変更する必要があります。

おすすめ

転載: www.cnblogs.com/haisong1991/p/11442816.html