/// <summary> /// Draws a debug visualization of a corridor. /// </summary> /// <param name="mesh">The navigation mesh associated with the corridor.</param> /// <param name="corridor">The corridor to draw.</param> public static void Draw(Navmesh mesh, PathCorridorData corridor) { if (corridor.pathCount == 0) return; DebugDraw.SimpleMaterial.SetPass(0); Vector3[] tileVerts = null; for (int iPoly = 0; iPoly < corridor.pathCount; iPoly++) { NavmeshTile tile; NavmeshPoly poly; mesh.GetTileAndPoly(corridor.path[iPoly], out tile, out poly); if (poly.Type == NavmeshPolyType.OffMeshConnection) continue; NavmeshTileHeader header = tile.GetHeader(); if (tileVerts == null || tileVerts.Length < 3 * header.vertCount) { // Resize. tileVerts = new Vector3[header.vertCount]; } tile.GetVerts(tileVerts); GL.Begin(GL.TRIANGLES); GL.Color(polygonOverlayColor); int pA = poly.indices[0]; for (int i = 2; i < poly.vertCount; i++) { int pB = poly.indices[i - 1]; int pC = poly.indices[i]; GL.Vertex(tileVerts[pA]); GL.Vertex(tileVerts[pB]); GL.Vertex(tileVerts[pC]); } GL.End(); // Not drawing boundaries since it would obscure other agent // debug data. } Vector3 v = corridor.position; DebugDraw.XMarker(v, positionScale, positionColor); DebugDraw.Circle(v, positionScale, positionColor); DebugDraw.Circle(v, positionScale * 0.5f, positionColor); DebugDraw.Circle(v, positionScale * 0.25f, positionColor); v = corridor.target; DebugDraw.XMarker(v, goalScale, goalColor); DebugDraw.Circle(v, goalScale, goalColor); DebugDraw.Circle(v, goalScale * 0.5f, goalColor); DebugDraw.Circle(v, goalScale * 0.25f, goalColor); }
/// <summary> /// Draws a debug visualization of a corridor. /// </summary> /// <param name="mesh">The navigation mesh associated with the corridor.</param> /// <param name="corridor">The corridor to draw.</param> public static void Draw(Navmesh mesh, PathCorridorData corridor) { if (corridor.pathCount == 0) { return; } DebugDraw.SimpleMaterial.SetPass(0); Vector3[] tileVerts = null; for (int iPoly = 0; iPoly < corridor.pathCount; iPoly++) { NavmeshTile tile; NavmeshPoly poly; mesh.GetTileAndPoly(corridor.path[iPoly], out tile, out poly); if (poly.Type == NavmeshPolyType.OffMeshConnection) { continue; } NavmeshTileHeader header = tile.GetHeader(); if (tileVerts == null || tileVerts.Length < 3 * header.vertCount) { // Resize. tileVerts = new Vector3[header.vertCount]; } tile.GetVerts(tileVerts); GL.Begin(GL.TRIANGLES); GL.Color(polygonOverlayColor); int pA = poly.indices[0]; for (int i = 2; i < poly.vertCount; i++) { int pB = poly.indices[i - 1]; int pC = poly.indices[i]; GL.Vertex(tileVerts[pA]); GL.Vertex(tileVerts[pB]); GL.Vertex(tileVerts[pC]); } GL.End(); // Not drawing boundaries since it would obscure other agent // debug data. } Vector3 v = corridor.position; DebugDraw.XMarker(v, positionScale, positionColor); DebugDraw.Circle(v, positionScale, positionColor); DebugDraw.Circle(v, positionScale * 0.5f, positionColor); DebugDraw.Circle(v, positionScale * 0.25f, positionColor); v = corridor.target; DebugDraw.XMarker(v, goalScale, goalColor); DebugDraw.Circle(v, goalScale, goalColor); DebugDraw.Circle(v, goalScale * 0.5f, goalColor); DebugDraw.Circle(v, goalScale * 0.25f, goalColor); }
//用递归的方式生成路径点,因为直接用MoveAlongSurface寻路找不到太复杂的路径 private void generatePointPath(NavmeshPoint startPoint, NavmeshPoint endPoint) { int nVisitedCount; Vector3 targetPos; NavStatus status = query.MoveAlongSurface(startPoint, endPoint.point, mCrowdManager.QueryFilter , out targetPos, polyResultBuffer, out nVisitedCount); float dis = Vector3.Distance(targetPos, endPoint.point); if (Vector3.Distance(targetPos, endPoint.point) > mMaxPointDis) { int nPolyCount; //点路径过为复杂,计算失败,根据三角形路径拆为两段递归计算 status = query.FindPath(startPoint, endPoint , mCrowdManager.QueryFilter, polyResultBuffer , out nPolyCount); if (nPolyCount > 2) { uint midPoly = polyResultBuffer[nPolyCount / 2]; NavmeshTile tile; NavmeshPoly poly; navmesh.GetTileAndPoly(midPoly, out tile, out poly); if (tile.GetTileRef() != tileBufferRef) { tile.GetVerts(tileBufferPoints); } int minIndex = -1; float minDistance = 0.0f; for (int i = 0; i < poly.vertCount; i++) { ushort index = poly.indices[i]; Vector3 pos = tileBufferPoints[index]; //Debug.Log("pos=" + pos.ToString()); float distance = Vector3.Distance(pos, endPoint.point); if (minIndex < 0 || distance < minDistance) { minDistance = distance; minIndex = index; } } Vector3 midPos = tileBufferPoints[minIndex]; NavmeshPoint midPoint; query.GetNearestPoint(midPos, Vector3.one, mCrowdManager.QueryFilter, out midPoint); generatePointPath(startPoint, midPoint); generatePointPath(midPoint, endPoint); return; } else if (nPolyCount == 1) { uint PolyIndex = polyResultBuffer[0]; NavmeshTile tile; NavmeshPoly poly; navmesh.GetTileAndPoly(PolyIndex, out tile, out poly); //if (poly.Type == NavmeshPolyType.OffMeshConnection) { Debug.Log(poly.Type.ToString() + ":" + startPoint.point.ToString() + endPoint.point.ToString()); } int minIndex = -1; float minDistance = 0.0f; for (int i = 0; i < poly.vertCount; i++) { ushort index = poly.indices[i]; Vector3 pos = tileBufferPoints[index]; Debug.Log("pos=" + pos.ToString()); float distance = Vector3.Distance(pos, endPoint.point); if (minIndex < 0 || distance < minDistance) { minDistance = distance; minIndex = index; } } } else { //中间没有多个多边形,直接过去 Debug.Log("go stright:" + startPoint.point.ToString() + endPoint.point.ToString()); if ((pointResultCount < 1) || (Vector3.Distance(startPoint.point, pointResult[pointResultCount - 1]) > mMaxPointDis)) { pointResult[pointResultCount] = startPoint.point; pointResultCount++; } pointResult[pointResultCount] = endPoint.point; pointResultCount++; } } else { //已经找到简单路径,输出 int pathCount; query.GetStraightPath(startPoint.point, targetPos , polyResultBuffer, 0, nVisitedCount , pointResultBuffer , null, null, out pathCount); if ((pointResultCount < 1) || (Vector3.Distance(pointResultBuffer[0], pointResult[pointResultCount - 1]) > mMaxPointDis)) { pointResult[pointResultCount] = pointResultBuffer[0]; pointResultCount++; } for (int i = 1; i < pathCount; i++) { pointResult[pointResultCount] = pointResultBuffer[i]; pointResultCount++; } } }