Path Follow
‘Path Follow’ is a behavior where an AICharacter moves from one path to the other without stopping at any path. It can be used for a patrolling type of behavior.
https://www.youtube.com/watch?v=hIDyzUJgu2w
In PandAI, path follow is defined as :
aiBehaviors.pathFollow(float priority)
aiBehaviors.addToPath(Vec3 position)
aiBehaviors.startFollow() // Required to start the follow
Position is a point in 3D space which falls on the path which the AI Character needs to traverse.
(Note: that you need to add multiple positions to create a path say for example Vec3(-10,10,0) Vec3(0,0,0) Vec3(10,10,0) Vec3(-10,10,0) will generate a rectangular path in the XY plane)
Note: the addToPath works backwards. So, your last call to addToPath will be your first position your AICharacter will go to.
The full working code in Panda3D is :
import direct.directbase.DirectStart
from panda3d.core import *
from direct.task import Task
from direct.actor.Actor import Actor
from panda3d.ai import *
class World(object):
def __init__(self):
base.disableMouse()
base.cam.setPosHpr(0, 0, 55, 0, -90, 0)
self.loadModels()
self.setAI()
def loadModels(self):
# Seeker
ralphStartPos = Vec3(-10, 0, 0)
self.seeker = Actor("models/ralph",
{"run":"models/ralph-run"})
self.seeker.reparentTo(render)
self.seeker.setScale(0.5)
self.seeker.setPos(ralphStartPos)
# Target1
self.target1 = loader.loadModel("models/arrow")
self.target1.setColor(1,0,0)
self.target1.setPos(10,-10,0)
self.target1.setScale(1)
self.target1.reparentTo(render)
# Target2
self.target2 = loader.loadModel("models/arrow")
self.target2.setColor(0,1,0)
self.target2.setPos(10,10,0)
self.target2.setScale(1)
self.target2.reparentTo(render)
# Target3
self.target3 = loader.loadModel("models/arrow")
self.target3.setColor(0,0,1)
self.target3.setPos(-10,10,0)
self.target3.setScale(1)
self.target3.reparentTo(render)
# Target4
self.target4 = loader.loadModel("models/arrow")
self.target4.setColor(1,0,1)
self.target4.setPos(-10,-10,0)
self.target4.setScale(1)
self.target4.reparentTo(render)
self.seeker.loop("run")
def setAI(self):
# Creating AI World
self.AIworld = AIWorld(render)
self.AIchar = AICharacter("seeker", self.seeker, 60, 0.05, 5)
self.AIworld.addAiChar(self.AIchar)
self.AIbehaviors = self.AIchar.getAiBehaviors()
# Path follow (note the order is reveresed)
self.AIbehaviors.pathFollow(1.0)
self.AIbehaviors.addToPath(self.target4.getPos())
self.AIbehaviors.addToPath(self.target3.getPos())
self.AIbehaviors.addToPath(self.target2.getPos())
self.AIbehaviors.addToPath(self.target1.getPos())
self.AIbehaviors.startFollow()
#AI World update
taskMgr.add(self.AIUpdate, "AIUpdate")
def AIUpdate(self,task):
self.AIworld.update()
return Task.cont
w = World()
base.run()
To get the full working demo, please visit: