Panda3D Manual: Bitmask Example
  <<prev top next>>     

Here is a short example of using bitmasks

import direct.directbase.DirectStart
from direct.showbase import DirectObject
from pandac.PandaModules import *


class World( DirectObject.DirectObject ):
	def __init__( self ):
		#initialize traverser
		base.cTrav = CollisionTraverser()
	
		#initialize handler
		self.collHandEvent=CollisionHandlerEvent()
		self.collHandEvent.addInPattern('into-%in')
		self.collHandEvent.addOutPattern('outof-%in')
	
		#initialize collision count (for unique collision strings)
		self.collCount=0


		self.loadObj1()
		self.loadObj2()


	def loadObj1(self):
		#load a model. reparent it to the camera so we can move it.
		s = loader.loadModel('smiley') 
		s.reparentTo(camera)
		s.setPos(0, 25,0)
	
		#setup a collision solid for this model
		sColl=self.initCollisionSphere(s, True)
	
		#set up bitmasks
		#this object can only collide into things
		sColl[0].setIntoCollideMask( BitMask32.allOff() )
		#this object will only collide with objects with this bitmask
		sColl[0].setFromCollideMask( BitMask32.bit( 1 ) )

		#add this object to the traverser
		base.cTrav .addCollider(sColl[0] , self.collHandEvent)


	def loadObj2(self):
		#load a model. 
		t = loader.loadModel('smiley') 
		t.reparentTo(render)
		t.setPos(5, 25,0)
	
		#setup a collision solid for this model
		tColl=self.initCollisionSphere(t, True)
	
		#set up bitmasks
		#this object can only be collided into and will collide with the other object
		tColl[0].setIntoCollideMask( BitMask32.bit( 1 ))
		tColl[0].setFromCollideMask( BitMask32.allOff())

		#add this object to the traverser
		base.cTrav .addCollider(tColl[0], self.collHandEvent)

		#accept the events sent by the collisions
		self.accept( 'into-' + tColl[1], self.collide)
		self.accept( 'outof-' + tColl[1], self.collide2)
		

	def collide(self, collEntry):
		print "WERT: object has collided into another object"
	
	def collide2(self, collEntry):
		print "WERT: object is no longer colliding with another object"

	def initCollisionSphere( self, obj, show=False):
		#get the size of the object for the collision sphere
		bounds = obj.getChild(0).getBounds()
		center = bounds.getCenter()
		radius = bounds.getRadius()*1.1

		#create a collision sphere and name it something understandable
		collSphereStr = 'CollisionHull' +obj.getName()
		cNode=CollisionNode(collSphereStr)
		cNode.addSolid(CollisionSphere(center, radius ) )
		cNodepath=obj.attachNewNode(cNode)
		if show:
			cNodepath.show()
	
		# return a tuple with the collision node and its corrsponding string
		# return the collison node so that the bitmask can be set
		return (cNode,collSphereStr )



#run the world. move around with the mouse to create collisions
w= World()
run()
  <<prev top next>>