AI Libraries for Panda3D


Here’s my vertex processing code, It’s mostly ripped straight from the manual.

I extract all the edges, and then use them to form “nodes” which are basically triangular areas in the mesh. The edges then link the nodes together, forming a graph which I can traverse with A*.

def _processNode(self, node):
		geomNodeCollection = node.findAllMatches('**/+GeomNode')
		for nodePath in geomNodeCollection:
			geomNode = nodePath.node()
		for edge in self.edges:
			if len(edge.nodes) <= 1:
				# This edge isn't between two nodes, so we don't need to worry about it when pathfinding.
				# But we still need it for determining which node an agent is in.
				edge.navigable = False

	def _processGeomNode(self, geomNode):
		for i in range(geomNode.getNumGeoms()):
			geom = geomNode.getGeom(i)
			state = geomNode.getGeomState(i)

	def _processGeom(self, geom):
		vdata = geom.getVertexData()
		for i in range(geom.getNumPrimitives()):
			prim = geom.getPrimitive(i)
			self._processPrimitive(prim, vdata)

	def _processPrimitive(self, prim, vdata):
		vertex = GeomVertexReader(vdata, "vertex")
		prim = prim.decompose()
		def getVertex(index):
			vi = prim.getVertex(index)
			return vertex.getData3f()
		for p in range(prim.getNumPrimitives()):
			s = prim.getPrimitiveStart(p)
			e = prim.getPrimitiveEnd(p)
			for i in range(s, e):
				v = getVertex(i)
				if i + 1 >= e:
				v2 = getVertex(i + 1)
				edge1 = self.addEdge(v, v2)
				if i + 2 >= e:
				v3 = getVertex(i + 2)
				edge2 = self.addEdge(v2, v3)
				edge3 = self.addEdge(v3, v)
				self.nodes.append(NavNode(edge1, edge2, edge3))

To determine which node an agent is in, I just do a dot product from the agent’s position to the center of each of the three edges. If all three dot products are positive (or negative, I can’t remember), the agent must be inside the node. I do some other stuff for vertical testing as well. It’s all in the A3P repository.


I hope it’s my search skills failing, but I haven’t been able to find a version of the Navigation Mesh Generator for Linux. In the download section of the PandaAI website there’s only Windows exe and source. Is it included in Panda 1.7? And if so, under what name and/or in what directory (of it’s not /usr/bin)? Thanx in advance.



You are right. There isn’t one. But to aid you I have re-factored some of the code and have the source code for the Mesh Generator available to be downloaded at : (MeshGen_Linux)

Unfortunately, I don’t have an executable ready to use, so you will have to build it in your version of Linux using this source code.

The executable should work the same way as the documentation states.

Do let me know if this works fine.


Thanks for the reply. I’ve actually managed to build it in the meantime (had to recall how to use g++, hehe) from the source on the PandaAI download website. It seems to work, but if I happen to hit a wall with it, I’ll try your version.

Still, I think it should be included with Panda itself. It’s kind of a non-sense for PandaAI itself to be included, but not the most important tool to make full use of it.


Is there any progress on the Blender side of things? I’ve tried making the most simple possible navmesh (a sudivided plane) and failed completely, with the character ending up totally confused with the map (as expected given the previous post on the subject). Is there any chance this will get resolved soon? I have no access to neither Max nor Maya and I need PandaAI, so it’s a rather huge problem for me…


Cool. Good to hear you got it working. I will leave this code up anyways since it is a cleaner version and have removed any panda dependencies (since the mesh generator really doesn’t need any).

Sorry, the blender support is still in progress due to time constraints.

Try to use a trial version of Max or Maya till then.


I fully understand that time is a problem, and I really appreciate your work so far. However, is it possible to estimate how long it will take to get it to work? I’m only asking this because I’m working on a rather big project (in which I’m planning to make extensive use of PandaAI), and need at least some indication, so that I can plan my work. Don’t get me wrong, I’m not trying to hurry you up, I just need to know where I’m standing. I hope you understand that.

Unfortunately I really can’t use Maya nor Max, trial included. Max is not an option because I’m on Linux, and I don’t seem to currently meet the requirements for Maya.

Thanks very much.


Sure. I understand.

Give me a couple of days(upto a week) to get back to you on this.



Thanks very much, I really appreciate it.


@ coppertop

I am sorry but I don’t think we can give a definite answer on the Blender support as of now due to time constraints and lack of our knowledge on the EggData side, which I have been researching.

I hope I can get more time to spend on this apart from my other responsibilities (as I am not full time on PandAI anymore). Please assume that there is no Blender support as of now. I hope you still can use other parts of PandAI.

I will post it up when it is fixed.


That’s a shame, but I fully understand the situation. And I will definitely make use of the rest of PandaAI. Thanks.


Good News!!!

We are excited to say that the PandAI pathfinding solution now supports Blender. We have created a separate mesh generation tool for creating a navigation grid from a plane made using Blender. You can download the required files from here:

In the above zip file you will find the following:

  1. A ReadMe file which explains how to use the tool.
  2. The python script required to generate navmesh.csv from Blender full and collision planes.
  3. Sample planes created in Blender which were used for testing.

A few IMPORTANT things:

a. Make sure your the full and collision planes that you make are on the ‘X - Z plane’ of Blender.
b. This is for planes created using ONLY Blender. For Max and Maya please continue to use our previous meshgen tool.

Here is a video of pathfinding working with planes created in Blender:

NOTE: The lag is due to a lot of spheres being rendered as nodes.

Lastly, it would be really helpful if people using PandAI and Blender could give us feedback about this new tool we have provided. If you come across any bugs or discrepancies please report it in this thread.

Thanks a lot for your support!

  • Team PandAI.

Help with Egg File Parsing in Python

You guys are just fantastic. I have downloaded already and I will test it and give feedback as soon as I can. This is really great news.

Thanks very much for all your hard work.


Thanks a lot.

We are glad that you can still use it.


This looks like it will be very useful in my current project; I’m trying to build an RTS game, and hope to use PandAI for navigation, since it’s far more practical than writing my own algorithms.

I am a little confused as to how to use the Navigation Mesh Generator Tool for Blender, however. It says in the instructions to use two arguments, a plane file and a plan collision file. At the moment, I have my visible geometry and my collision geometry in the same .egg file, on different layers. Does this mean I have to make a separate file with collision geometry? And if so, what is the geometry I need to pass - all collision geometry, i.e. floors, walls, and everything else?

Also, it may be related to me misusing the mesh generator, but when I try to run it the meshgen crashes, either at step 2 or step 3 (creating notes on the mesh, or identifying neighbour nodes for each node on the mesh). I get no error message in the console, just a windows pop-up telling me that meshgen.exe is no longer working and needs to be shut down.

Thanks a lot for this work, by the way - I’m sure it will save a lot of people a lot of trouble! I look forward to incorporating PandAI into my game.


@ GarrickW

I would suggest the best way to test it out is to create a simple 5x5 plane in Blender in the x-z axis. (By 5x5 I mean use subdivisions)

This will be your full_mesh.egg.

Now remove a couple of faces from the plane and export another egg as the coll_mesh.egg.

See if you can use the mesh generator on this to get a navmesh.csv.

Use this nevmesh.csv in PandAI pathfinding and see if you can get an AI character to pathfind to another.

  • Note :
    If A and B are AI characters and A is to pathfind to B, make sure the starting positions of A and B should be on the faces which can be traversed.


Thanks for the quick reply! I’ve gone ahead and done as you suggested, and made a very simply mesh; the mesh generation, at least, was successful and without error, which is more than can be said for my custom map (which is now consistently crashing at Stage 3). I’m setting it up to test for pathfinding now, but something has occured to me. All the videos on the PandAI website that I watched showed totally flat 2D spaces being navigated. My custom mesh, however, has some inclinations that are meant to be navigable by the units using pathfinding, so the floor mesh - and thus presumably the navigation mesh - have to be three dimensional.

Might this be an issue? I know someone asked this about 7 months, but I figure things may have changed since then. It’s one of the few seemingly relevant differences that I can think of between a simple plane and my mesh (otherwise the mesh is larger, has materials, and uses a “Polyset keep descend” collision tag).

Thanks for taking the time to reply!

EDIT: Ah, I’ve solved the problem. After writing this post, I figured it would be best to check everything, just in case, so I went and deleted the collision tags and the materials in Blender, and tried again. This time, it worked, 3D inclinations and all! Between the materials and the collision tags, I imagine it was the tags that were messing the meshgen up, though I can’t be sure. Now to give PandAI a spin. :wink:

EDIT 4: So I now have the “couldnt find source” “couldnt find destination” error, and I can’t seem to get past it. I’ve done what another user earlier in this thread did, and checked to make sure all values were on the proper axis, but this didn’t help. I’ve made the meshes on the X-Y axis and the X-Z axis, as well as manually flipping the values in the .CSV file, but the AI can’t find its source or its destination.

I’ve also flattened the meshes, to deal with the fact that PandAI is 2D, but the flattened meshes won’t generate a navmesh anymore, though I did nothing to them besides set their Z-scale to 0. I’ve also left them their height - and I’ve manually set height, PosZ, or both to 0 in the .CSV file. The only meshes that have successfully been made into a navmesh are the 3D ones I tried, though, and that one continues to return “couldnt find destination” and “couldnt find source”.

EDIT 5: I am starting to wonder, after looking at the .CSV file, whether the problem isn’t something else. One major problem I can see is that my model has setScale(10). For some reason, I am unable to replicate functionning full and collisionmeshes anymore, so I am stuck with the ones that are 10x smaller than the map.

I have tried sizing the environment and actors down to scale(1), but this makes my game go wonky, with units jittery against the floor, falling through, or not falling at all and floating around in space, not to mention somehow disabling my selection methods.

Another issue is that, in the CSV file, all values, X and Y, are positive. This is strange, since I when exported the meshes, they were centered on 0, 0, 0, and there were vertices in every quadtrant. In any case, this is probably also a problem, given that my environment is centered on the origin.

I must see if I can correct all these issues; hopefully I’ll manage something soon! If I do, I’ll be sure to post whatever the solution is, in case others ever have difficulty.

EDIT 6: I’m not sure what I did; I created a second version of the terrain, and in that deleted absolutely everything (including light, camera, materials and vertex groups) except the full terrain, enlarged it 10 times, flattened it, and exported it. I forgot to remove the collision tags, but meshGen thought the eggs tasted good, so it seems those aren’t important.

However, I’m not out of the water yet. I find the game no longer gives me the “couldnt find” error if I leave the CSV be, but then I discover that the CSV contains a posZ value of -0,0478745 for all existing nodes, even though I’ve made absolutely certain that the meshes are all at exactly Z:0.

In addition, the CSV file is not easily readable in Excel, so I divide the data into columns, such that I can more easily set all the posZ values to 0 - and when I save with columns, the errors return, even if I leave the data otherwise untouched. I am unsure as to how to put everything back into a single column once I’ve changed the data, all while preserving the commas.

At least this is progress; the meshes, it would appear, work!


Before I get into your problem, I would like you to try this out:

  1. Did you get path finding working on a simple 2d mesh ?

If not thats the first thing you need to do to understand the process and only then proceed to complex meshes.

  1. Have a look at the roaming ralph tutorial on the PandAI download.

This tutorial shows how you can use the path finding to navigate your player on uneven terrain.

Once you do this, please post back and we can proceed.

  • Note: Modifying the navmesh.csv is not recommended unless you understand exactly what each field means. I would say it is better to get the egg format right so that the mesh gen creates the correct navmesh than to manually change it.

Try to think of the navigation mesh as seperate from the terrain. The navigation mesh should be thought of as the underlying logic for where a character can move. The terrain can be thought of as the graphics over it such that it doesn’t look like a simple plane with subdivisions :slight_smile:


So I did as you said, and tried a simpler grid with full pathfinding, shaving all the useless code away so that only the grid, the actor and the move controls remained.

Until then I had only got the grid to generate a proper mesh, and thought that was enough, but apparently it wasn’t. I continue to have the same problem (no console errors, but no pathfinding either), which I imagine means I’ve not yet understood some of the basics. I’m really sorry to bother you with my inexperience, and I’m very grateful you’re taking the time to help! I’ve tried to isolate the problem, and here’s what I know about the situation:

  • The grid, and full mesh used to generate the navmesh, is regular, 6x6 square-shaped quads; the collision mesh is the same, but with four quads removed from the center

  • Movement using means other than pathfinding work well on the simple grid; switching to the pathfinding system requires only commenting one line and uncommenting another.

  • Collision with the floor appears to be functionning well.

  • I have it set up such that the game displays the coordinates being passed to .pathFindTo(), and I have checked these coordinates in the navmesh.csv; the coordinates passed are within the range covered by the navmesh (in a square of roughly -50 to 50 in both the X and the Y).

  • Just to be certain, I tried to code the actor into pathfinding to one of the exact locations in the navmesh, (-25.15, -41.9166, 0), in case my commands were falling through the cracks, but the actor was still unresponsive.

  • Neither the grid nor the navmesh.csv contain height (all Z:0), and I am passing coordinates with a Z of 0 to .pathFindTo().

  • I have tried using the .seek() function instead of pathFindTo(), and this was equally unresponsive (which leads me to believe I made a rather fundamental error)

  • I have created an AI world, and am updating the AI world with a continuous task (I’ve done this within the main class, the actor class, and both).

  • The visible grid and the collision grid are identical to the one used as full mesh (the col mesh has 4 quad faces removed from the center).

  • I have set up the actor’s AI using this code (admittedly, I am not sure what values of mass, force and maximum force are appropriate, but I have tried reducing one or the other, to no effect). Note that ‘world’ is the main class, also the one that creates, and is an Actor() with animations:

        self.actorAI = AICharacter("PacManAI",, 20, 20, 60)
        self.actorBehaviors = self.actorAI.getAiBehaviors()

Again, thank you for taking the time to help me out!


When you say no pathfinding, could you elaborate please.

Is there no movement at all ?

Where in your code is the ai world update task set ? Try to start the task after initPathfind and see if it solves anything.

Was there no error in the console at all ?

Try to use pathFindTo(some position vector) and see if that works.