Navmesh on a spherical planet

I think the previous implementation used a raycast and then just moved the agent directly to the surface. So it was roughly equivalent to an infinite gravity.

You can change the parameters of the existing nodes in the navmesh. That will work just fine, you just cannot use e.g navmesh cutting to cut the navmesh.

Hi everyone,

@aron_granberg Thanks so much for adding the spherical example on the latest beta! It works great.
I’ve been trying to implement a way to avoid obstacles in real time but I can’t find an efficient way to do it.
Navmesh Cut and Tag Manipulation doesn’t work on this new type of navmeshes.

Does anyone have a method to avoid real time obstacles on spherical navmesh? Thanks.

Hi

Tag manipulation should work as mentioned in my previous post. Isn’t it working for you?

Thanks Aron for your continuous support. Tag manipulation didn’t work for me but I might be doing something wrong. I’ll give it another try. Thanks.

Here is an example of tag manipulation that took me a bit to figure out. This should work for the planet/ocean dilemma @phil.atha mentioned by simply measuring the distance of each node from the planetCenter and setting it to my ocean tag (1) if it’s shorter then the landRadius…
@chocominyo perhaps a similar approach could help you having an obstacle check if nodes are within an obstacle’s bounds?

    public NavMeshGraph NMG;
    public GameObject Planet;
    public Vector3 planetCenter;
    public int LandRadius;
    
    public void SetNodes()
    {
        NMG = AstarPath.active.data.navmesh;
        planetCenter = Planet.transform.position;
        Vector3 tileV3;

        for (int z = 0; z < NMG.tileZCount; z++)
            {
                for (int x = 0; x < NMG.tileXCount; x++)
                {
                NavmeshTile tile = NMG.GetTile(x, z);
                for (int i = 0; i < tile.nodes.Length; i++)
                    {
                    GraphNode node = tile.nodes[i];
                        tileV3 = (Vector3)node.position;
                    float dist = Vector3.Distance(planetCenter, tileV3);
                    if (dist <=LandRadius)
                    {
                       // tile.nodes[i].Walkable = false;
                        tile.nodes[i].Tag = 1;
                    }
                    else
                    {
                        //tile.nodes[i].Walkable = true;
                        tile.nodes[i].Tag = 0;
                    }
                    }

                }

            }
        
    }

first if there are any glaring problems with this forgive me. I’m not a great coder AT ALL lol. This took me an embarrassing long time to figure out. I suppose if its for sure a navmesh type then the first two for loops could be done away with and use the line:

NavmeshTile tile = NMG.GetTile(0, 0);
as NavmeshGraphs only have one tile, right?

This above approach left me with some questions however… the line " NMG = AstarPath.active.data.navmesh;" gets the first navmesh type graph on the main A* component. What is an easy way to get a specific navmeshgraph from say 5 different navmesh graphs in one scene?

Also for say an “obstacle” that can set tags within it’s bounds how can one keep a list of nodes affected by it to later reset them once it is moved? Hmmm, maybe just have each obstacle use a list of bools that correspond to each node and cycle through em?

Any recommendations as far as optimally getting nodes within a volume? Thx

1 Like

@Christougher

So you’re method doesn’t work for my scenario but you got me on the right path. In my case, my planets have mountains, ocean floors, and then clamped areas in the middle. The clamped areas are the ‘safe zones’ where the pathfinding/player can move. Since I happen to know these vertices and my navmesh is 1:1 with the model anyway I can simply iterate through these and then set the matching node position to Walkable since I can be sure the Vector3s are exactly the same. So far this appears to mostly work. Comparing against the distance of the ocean inwards to the center will only work for areas under the seabed.

            for (int i = 0; i < verts.Count; i++)
            {
                NNInfoInternal nnii = graph.GetNearest(verts[i]);
                if ((Vector3)nnii.node.position != verts[i])
                    nnii.node.Walkable = false;
            }

1 Like

@Christougher
Nice! Great example.
There are a few ways to simplify it a bit though.
Here is some updated code

public NavMeshGraph graph;
public GameObject Planet;
public Vector3 planetCenter;
public int LandRadius;

public void SetNodes() {
	graph = AstarPath.active.data.navmesh;
	planetCenter = Planet.transform.position;
	Vector3 tileV3;

	graph.GetNodes(node => {
		var nodePosition = (Vector3)node.position;
		float dist = Vector3.Distance(planetCenter, nodePosition);
		if (dist <= LandRadius) {
			// node.Walkable = false;
			node.Tag = 1;
		} else {
			//node.Walkable = true;
			node.Tag = 0;
		}
	});
}

Thx for the reply! I had wondered how GetNodes worked! :slight_smile: I had to clean up the code a little bit more such as changing tileV3 to nodePosition in the dist calc and changing the tile.nodes[].Tag=1 lines to
node.Tag = 1;

1 Like

Hi, after about a year now since the spherical pathfinding beta came out i was just wondering if there might be plans to work it permanently into A*PP? Especially as you are now in ernest delving into jobifying… (droooool…) :grinning:

1 Like

+1 very interested in it being updated and added to the main package.

I’m kind of stuck using Unity 2018 on a project by using the spherical beta. Unity 2019 gives out several editor errors with it…

1 Like

Hello,Aron,I want to ask whether the newer version has the sphetical beta?I see that the spheretical beta is in the 4.1.2,but i can’t find the related scripts in 4.2.2,such as the script ‘AIPathAlignToSurface’,should I have to use the version 4.1.2 to develop the sphertical system in my game?

1 Like

Yeah, 4.1.2 is the most recent spherical beta. No word on potential future updates.

Hi

I am working on moving the spherical beta into the main beta right now. Hopefully I will have something ready in a few days.

1 Like

Hi

I have uploaded beta version 4.3.9 now which includes an updated version of the spherical beta. It now runs on burst as well which means it is wayyy faster.

https://www.arongranberg.com/astar/download
Docs: https://www.arongranberg.com/astar/documentation/dev_4_3_9_08deafd2/spherical.html

:smiling_face_with_three_hearts:Thank you !

1 Like

Hello,aron,How Can I deal with jumping from low to high or from high to low like unity’s offmeshlink?I see similar curves in “Recastexample2”, but can I automatically generate these curves like offmeshlink through this plug-in unit?

Automatic placement of nodelinks is currently not supported. =/

nav Hello,aron,Will this sphere world system be able to achieve this function in the future?

Hi

I’m not sure what in that image has anything to do with spherical worlds.

The image that @rey4033 is showing is the default unity NavmeshComponents automatic nodelink placement. Where it automatically places nodelinks on the navmeshes.