Panda3D Manual: Static Obstacles

STATIC OBSTACLES :





In PandAI, use it via :

addStaticObstacle(NodePath obstacle);




The code for this tutorial :

# This tutorial provides an example of creating a character
# and having it walk around using PandAI
# pathfinding with static obstacle avoidance
 
#for directx window and functions
import direct.directbase.DirectStart
#for most bus3d stuff
from pandac.PandaModules import *
#for directx object support
from direct.showbase.DirectObject import DirectObject
#for intervals
from direct.interval.IntervalGlobal import *
#for FSM
from direct.fsm import FSM
from direct.fsm import State
#for tasks
from direct.task import Task
#for Actors
from direct.actor.Actor import Actor
#for math
import math
#for system commands
import random, sys, os, math
#for directGUI
from direct.gui.DirectGui import *
from direct.gui.OnscreenText import OnscreenText
 
#for Pandai
from panda3d.ai import *
 
#************************GLOBAL**********************************************
speed = 0.75
 
# Figure out what directory this program is in.
MYDIR=os.path.abspath(sys.path[0])
MYDIR=Filename.fromOsSpecific(MYDIR).getFullpath()
 
font = loader.loadFont("cmss12")
 
# Function to put instructions on the screen.
def addInstructions(pos, msg):
return OnscreenText(text=msg, style=1, fg=(1,1,1,1), font = font,
pos=(-1.3, pos), align=TextNode.ALeft, scale = .05)
 
# Function to put title on the screen.
def addTitle(text):
return OnscreenText(text=text, style=1, fg=(1,1,1,1), font = font,
pos=(1.3,-0.95), align=TextNode.ARight, scale = .07)
 
class World(DirectObject):
 
def __init__(self):
 
self.keyMap = {"left":0, "right":0, "up":0, "down":0}
 
self.title = addTitle("Pandai Tutorial: Adding Dynamic Obstacles")
self.inst1 = addInstructions(0.95, "[ESC]: Quit")
self.inst2 = addInstructions(0.90, "[Enter]: Start Pathfinding")
self.inst21 = addInstructions(0.85, "[Arrow Keys]: Move Arrow")
self.inst3 = addInstructions(0.80, "[1]: Small box")
self.inst4 = addInstructions(0.75, "[2]: Big box")
self.inst5 = addInstructions(0.70, "[Space]: Place box")
 
#base.disableMouse()
base.cam.setPosHpr(0,-210,135,0,327,0)
self.box = 0
self.pointer_move = False
 
self.loadModels()
self.setAI()
 
def loadModels(self):
 
self.environ1 = loader.loadModel("models/skydome")
self.environ1.reparentTo(render)
self.environ1.setPos(0,0,0)
self.environ1.setScale(1)
 
self.environ2 = loader.loadModel("models/skydome")
self.environ2.reparentTo(render)
self.environ2.setP(180)
self.environ2.setH(270)
self.environ2.setScale(1)
 
self.environ = loader.loadModel("models/groundPlane")
self.environ.reparentTo(render)
self.environ.setPos(0,0,0)
 
# Create the main character, Ralph
 
#ralphStartPos = self.environ.find("**/start_point").getPos()
ralphStartPos = Vec3(-51,-64,0)
self.ralph = Actor("models/ralph",
{"run":"models/ralph-run",
"walk":"models/ralph-walk"})
self.ralph.reparentTo(render)
self.ralph.setScale(2)
self.ralph.setPos(ralphStartPos)
 
self.pointer = loader.loadModel("models/arrow")
self.pointer.setColor(1,0,0)
self.pointer.setPos(60,-60,0)
self.pointer.setScale(3)
self.pointer.reparentTo(render)
 
def setAI(self):
#Creating AI World
self.AIworld = AIWorld(render)
 
self.accept("enter", self.setMove)
self.accept("1", self.addBlock)
self.accept("2", self.addBigBlock)
self.accept("space", self.addStaticObstacle)
 
#movement
self.accept("arrow_left", self.setKey, ["left",1])
self.accept("arrow_right", self.setKey, ["right",1])
self.accept("arrow_up", self.setKey, ["up",1])
self.accept("arrow_down", self.setKey, ["down",1])
self.accept("arrow_left-up", self.setKey, ["left",0])
self.accept("arrow_right-up", self.setKey, ["right",0])
self.accept("arrow_up-up", self.setKey, ["up",0])
self.accept("arrow_down-up", self.setKey, ["down",0])
 
self.AIchar = AICharacter("ralph",self.ralph, 60, 0.05, 15)
self.AIworld.addAiChar(self.AIchar)
self.AIbehaviors = self.AIchar.getAiBehaviors()
 
self.AIbehaviors.initPathFind("models/navmesh.csv")
 
#AI World update
taskMgr.add(self.AIUpdate,"AIUpdate")
 
#movement task
taskMgr.add(self.Mover,"Mover")
 
self.dirnlight1 = DirectionalLight("dirn_light1")
self.dirnlight1.setColor(Vec4(1.0,1.0,1.0,1.0))
self.dirnlightnode1 = render.attachNewNode(self.dirnlight1)
self.dirnlightnode1.setHpr(0,317,0)
render.setLight(self.dirnlightnode1)
 
def setMove(self):
self.AIbehaviors.pathFindTo(self.pointer)
self.ralph.loop("run")
 
def addBlock(self):
self.pointer_move = True
self.box = loader.loadModel("models/box")
self.box.setPos(0,-60,0)
self.box.setScale(1)
self.box.reparentTo(render)
 
def addBigBlock(self):
self.pointer_move = True
self.box = loader.loadModel("models/box")
self.box.setPos(0,-60,0)
self.box.setScale(2)
self.box.setColor(1,1,0)
self.box.reparentTo(render)
 
def addStaticObstacle(self):
if(self.box!=0):
self.AIbehaviors.addStaticObstacle(self.box)
self.box = 0
self.pointer_move = False
 
#to update the AIWorld
def AIUpdate(self,task):
self.AIworld.update()
#if(self.AIbehaviors.behaviorStatus("pathfollow") == "done"):
#self.ralph.stop("run")
#self.ralph.pose("walk", 0)
 
return Task.cont
 
def setKey(self, key, value):
self.keyMap[key] = value
 
def Mover(self,task):
startPos = self.pointer.getPos()
if (self.keyMap["left"]!=0):
self.pointer.setPos(startPos + Point3(-speed,0,0))
if (self.keyMap["right"]!=0):
self.pointer.setPos(startPos + Point3(speed,0,0))
if (self.keyMap["up"]!=0):
self.pointer.setPos(startPos + Point3(0,speed,0))
if (self.keyMap["down"]!=0):
self.pointer.setPos(startPos + Point3(0,-speed,0))
 
if(self.pointer_move == True and self.box != 0):
self.box.setPos(self.pointer.getPos())
 
return Task.cont
 
 
w = World()
run()




The full working demo can be downloaded at :

https://sites.google.com/site/etcpandai/documentation/pathfinding/StaticObstacleDemo.zip?attredirects=0&d=1