AI Libraries for Panda3D

Has any thought been given to integration of the PandAI library into Blender?

I know some Panda3D users create their meshes, animations, etc in Blender, then export them to Panda3D. I suspect with Blender 2.5 coming out this summer that the numbers will increase substantially.

Being able to design the AI within Blender and then export the AI behaviour with the created characters and levels would probably be a large benefit to the Panda3D community.

My thoughts are that the following libraries would be desireable in addition to PandAI

code.google.com/p/libbehavior/

code.google.com/p/recastnavigation/

There is currently work on making Blenders logic tools node based

wiki.blender.org/index.php/Dev:S … NodalLogic

which will make design even easier for users.

Perhaps it could be done as a Google Summer of Code project?

Thanks for your time,

Tom M

It would be good to change
from libpandaai import *
to
from panda3d.ai import *
mentioned in tutorial at download page.
First one doesn’t work in windows 1.7.0 package.

Since I had lots of problems trying to implement my own AI, I was excited about PandAI, but it appears it is currently a bit too limited for my use. Do the devs of the lib have the resources to continue developing it and if so, it would be interesting to see some kind of priority list on what might be expected to come?

Hello Mindblighter,

What kind of AI functionality are you looking to use? Currently the developers of PandAI are a little held up with other projects and internships, however we are hoping to add some minor tweaks and fixes to the library as soon as we get some time. Meanwhile, if you could describe the AI you want to use we might be able to help you.

Thanks!

Thanks for the reply JohnKol.
My idea revolves around dynamically building random levels from blocks (originally tiles but squares are so limiting) for a Diablo style game. For example, a room or a piece of a corridor would make up a single block. Since you currently can’t create autogenerate a navmesh or, as far as I can tell, input your runtime generated navmesh node data except through saving them on a file first, this is a bit of a hassle.

My next concern is the actual AI chars. I would need to have lots of models (a few dozen at least) running around after the player. If I’m not entirely mistaken, you currently can’t have the models effectively pathfinding towards a target (player) and dodge collisions with each other.

This is one of the problems I ran into when I tried to create my own A* based system with tiles. I came up with using a feeler object like you do, but updating the A* path map turned out to be very difficult :wink:

I think the scenario I described is not very unusual, but it seems to be tricky to solve for amateurs like myself. Now that I’m writing this, I also thought of line of sight. Some kind of method for checking LOS based on the navmesh node data might be useful and fast for making certain decisions like whether the AI char should try to shoot at something or not.

I would wish me some more examples how to use the code. Yeah, i know on download section is explained how to use it. But when i do this i total fail.

For example evade:
aichar does nothing until i reach his destination and then he runs away and never stops or changes direction even i move in his way. and my relax_distance is twice the panic_distance.

i tried to make a swarm. after adding them all to swarm, swarm behavior was disabled. i checked c+±code and found a function to start this behavior. but nothing changed.

examples on download section are really good, iff they would do what i expect. so some graphical examples that shows behavior would be great. only small examples not that big like rralph. just a plane and then some chars which are using the behavior.

and it would be great if you can release your examples that you used for your videos. there is this swarm example with these moving trees and those chickens.

would be really nice!

btw our advancement:

  1. we edited code so every aichar uses the same navmesh in the world for pathfinding. disadvantage is that you can only do one A* at the same time. We don’t know how big this disadvantage is for bigger worlds but it is still possible that every aichar uses his own navmesh if coder wants to.

  2. Another thing we did is what darek mentioned. It is possible to do a A*-search on the navmesh and a Python list with waypoints will be returned. Then you can do stuff like using physics or assure a consistent world in a p2p game (thats what we do :laughing:).

i know, not much progress but team has much to do for university in the last weeks. Next week we focus on PandAI again and hopefully fix some issues.

@ Mindblighter

We did try dynamic pathfinding which you talk about. Could you check out the demo on our downloads page:

etc.cmu.edu/projects/pandai/Download.html

called Dynamic Obstacle Avoidance Demo.

We did not test this extensively for the maximum number of characters it could support but it did dynamically avoid other pathfinding characters.

Also, the LOS is a neat feature, I will add it to the to do list.


@ derek

Thanks for the info. Will be updated.

@ peerpanda

Will put up the video examples. Thanks for adding to Pandai (yay for opensource!).

Thanks a lot guys for doing this! This is what open source is all about. We really hope the libraries will grow this way by adding new features and fixes. Also since you are editing the code, a few things to keep in mind,

  1. Please make sure you are following all the Panda3D conventions. This is a must if it has to get into CVS. You can get the details here,

http://panda3d.cvs.sourceforge.net/viewvc/checkout/panda3d/panda/src/doc/coding-style.txt

  1. Comment the code clearly so that people can easily understand and make modifications in future.
  2. It would be great to have a maintenance log at the top of each file that you are editing. This would record the new features you have added and on what date.
  3. We want to start updating the Panda3D manual soon so that it is easier to understand and implement the AI. If you guys can maintain a document of how to use the new features you have added that will be very helpful while we update the manual.

Could you provide a code snippet of how you are using the evade function? That would really help us to find out why it is not working.

Same goes for this one too. A code snippent of how you are doing it will be really helpful. Did you add the flock object to the AI World? That is very important.

Once again thanks for all your help and suggestions. We really want to push some fixes and features into the library. We shall come up with a priority list and share it with everyone soon.[/url]

am i missing something or is the update mechanism bound to the system clock? (i’d like to be able to accelerate and delay gameplay/movement speed).

i am currently trying to recompile with a added timeDelta in update of AiWorld and AiCharacter and a modified acceleration calculation ( LVecBase3f acceleration = steering_force / _mass * timeDelta; )

It is a threaded process and there isn’t any control to do that for now.

It looks like you are on the right path. Let me know if you run into problems or if you get it working.

So is there any plans to do this dynamically ingame or by adding a way to generate from a heightmap for geomipterrain users?

If i understood the csv better i probable could hand build the csv info so i could use this. any chance we could find out more about the csv and what each line is in relation to the others?

(heck if i understood this part better i could probable build a python script that takes your ingame geomipterrain and builds the csv if this would work for the code)

Currently we do not have any plans to do this because of the amount of time commitment required.

If you look at page 2 in this post, towards the end there are details about what the csv data is. If you need further information let us know.

Hope this helps. Thank you!

ok so i found this:

Grid Size - size of the mesh.

NULL - specifies if a node exists or not.
0 - exists
1 - does not exist.

Node Type - specifies if it is the main node or the neighbor node.
0 - main node.
1 - neighbor node.

GridX - row index
GridY - col index

Length - length of each cell.
Width - width of each cell.
Height - currently overwritten as 0 since height info is not used.

PosX, PosY, PosZ - position of the node in the cell.

and it tells me a little about the Navmesh.csv in the fact theatim assuming it gives all info but things i dont understand are:

  1. ordering (does it care what order the information is in?)
  2. what does the position of the node do?
  3. shouldnt most of the length/widths of the cells be the same as squares are generally used?
    4.does the info start at the bottom left or does it matter?
  4. if a node does not exist does this mean not at all? if so why did we record it??
  5. I see in the static ob demo we can make things marked as not traverable is there an easy way to setup a csv to use my terrain as completely traverable then I can mark the stuff off i need? (I use a 1024X1024 terrain for now and i would like the map to use the same size if possible)

this is just some basic info that is nice to know course some of it really dosnt matter but i think it will help since i will probable have to build my mesh by hand. (Bascally im trying to come up with a way to use your system to hand write a csv but this will be time consuming and i need to know alot of what the system does without being able to read c++ so maybe a simple tutorial on writing the csv would suffice instead of answering all this)(the plan is to use this to write a python code to write a csv it may take time but its a tool so it dosnt need to be fast)

I hope that i didnt bother you too much and thank you in advance for any help you can provide!

Edit: Course I could just need to understand NavMeshes better myself I will be researching this subject to see if I can get a better understanding and with that hopefully be able to work with navmeshes with heightmaps.

Edit 2: I think i have found a round about way to make a navmesh. I use a heightmap in blender to make the terrain export it to egg this allows me to have my terrain info so that i can use it with PandaAI. If you wish to know how to do this go to: en.wikibooks.org/wiki/Blender_3D … heightmaps
the only downside is that the ratio in blender and Panda are not exactly the same so you may have to work with Panda or blender a bit to get it working properly for you.

this should probably be changed:

Pursue::Pursue(AICharacter *ai_ch, NodePath target_object, float pursue_wt) {
	_ai_char = ai_ch;

	_pursue_target = target_object;
	_pursue_weight = pursue_wt;
// i think this should be added
	_pursue_direction = LVecBase3f(0.0, 0.0, 0.0);

	_pursue_done = false;
}

another thing, the completion of the seek and pursue is determined by “int(target_distance) == 0”. meaning a distance to the target < 1 will make it finish, but depending on the scale of the models used in a game this isnt very practical.

  1. Yes you need to maintain the order as the data will be read in the same order into a vector which is then used for pathfinding.
  2. The AI characters will be using these node positions to traverse the mesh. These are the world space coordinates of the nodes. It will be the center of each grid cell.
  3. The constraint for the mesh is that it should have the same number of rows and columns. So if you have a rectangular mesh, then all the grid cells will not be squares and cells will have some minute dimension variance.
  4. The info starts at bottom left if I am not mistaken. I will confirm this anyhow.
  5. If a node does not exist (which means it is an obstacle) it will be specified as null when the data gets written into the vector during runtime. During pathfinding the A* checks if a node is traversable by doing a null check.
  6. So you can pretty much divide your entire 1024 X 1024 map into a grid. Make sure your grid has same number of rows and columns and then find the center position of each of the grid cells and assign it as the node positions in your csv. At this point all the nodes in your grid exist and are traversable. Now in the code you can toggle whether these nodes are traversable or not. As long as the data in the csv that you generate is in the same format I don’t see why you should have any issue using our pathfinding.

Just so that we are on the same page, we use waypoint meshes in PandAI as compared to Navmesh. And we know the confusion is due to the naming convention we used to explain the mesh generation process and pathfinding. Our apologies.

Hope you find this useful.

Thanks!

That was a great responce and it really helped I managed to get it working but there are a few issues: as i already posted this info see thread below for question. There seems to be something wrong with the egg file it looks right though…

discourse.panda3d.org/viewtopic.php?t=8786

I think you guys are probable the only ones that can tell me what im doing wrong.

Unfortunately PandaAI currently does not support blender models. We are still working on it. The way triangles are ordered in Blender eggs are very different from how Maya and Max does it. Hopefully we can get it working soon. Meanwhile if you have access to Maya or Max you shouldn’t have any problems.

Noted. I think rather than post bugs here on this post, we should do it on a common front. Any suggestions on a bug repository.