Thursday, January 5, 2017

2d - How can I generate a navigation mesh for a tile grid?


I haven't actually started programming for this one yet, but I wanted to see how I would go about doing this anyway.


Say I have a grid of tiles, all of the same size, some traversable and some not. How would I go about creating a navigation mesh of polygons from this grid?


My idea was to take the non-traversable tiles out and extend lines from there edges to make polygons... that's all I have got so far. Any advice?



Answer



Here's one of the methods I came up with when doing navmesh for an RTS game. Note that it is homebrew, no third-party tools were used, it took me about 3 weeks to implement and bugfix:



  1. Use Marching Squares algorithm to convert obstacle tiles into outlines. Note that map edges is an outline too and need to be included as well.

  2. Reduce number of points in outlines using Douglas-Peucker algorithm (purple lines on the bottom picture)

  3. Feed all points into Delaunay triangulation (to get most uniform triangles)


  4. Add additional points in empty areas and along the map edges (to get more even navmesh)

  5. Check along obstacle outlines and flip polygons produced by Delaunay to match outlines. - Often Delaunay could place triangles (grey) mismatching your outlines (red), then you need to detect and flip them. Adjoining them back into a polygon, split it along outline(s) and triangulate it manually enter image description here

  6. Clip obstacles innards - remove polygons that are within obstacles (pink on the picture above)

  7. Fill in connectivity data between remaining triangles and vertices as you need - that's your navmesh.


Result:


tilemap navmesh


No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...