No Collision : ODE

Hello,

I just try to test the benefits of ODE, and once initialized, now I try to manage collision, and see the effects of ODE.
I declare my geom, my space, autocollide… But nothing happens. It seems to be close as I can see on tutorials, and other post, and I think I need someone else to look at my code, and see the error I can’t see.

from pandac.PandaModules import loadPrcFileData 
loadPrcFileData("model-cache-dir",".\cache")
loadPrcFileData("model-cache-textures", "1" )
import sys,os
import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from pandac.PandaModules import * 
from direct.distributed.PyDatagram import PyDatagram 
from direct.distributed.PyDatagramIterator import PyDatagramIterator 
from direct.gui.DirectFrame import DirectFrame
from direct.gui.OnscreenText import OnscreenText 
from direct.gui.DirectGui import *
from direct.task.Task import Task
from pandac.PandaModules import Point3,Vec3,Vec4
stepSize = 1.0 / 90.0
stepTorque=50
class odeTest(DirectObject):
	def __init__(self):
		self.world = OdeWorld()
		self.world.setGravity(0, 0, 0)
		self.world.initSurfaceTable(1)
		self.space = OdeSimpleSpace()
		self.space.setAutoCollideWorld(self.world)

		self.space.setCollisionEvent("yourCollision")
		self.shipModel= loader.loadModel("fighter")
		self.shipModel.reparentTo(render)
		self.asteroid=loader.loadModel("tumbleweed")
		self.asteroid.setScale(30)
		self.asteroid.reparentTo(render)
		self.astBody,self.astGeom=self.createOdeBody(self.asteroid,5)
		self.odeBody,self.odeGeom=self.createOdeBody(self.shipModel,1)
		self.odeBody.setPosition(0,0,0)
		self.astBody.setPosition(0,100,0)
		self.odeBody.setQuaternion(Quat(self.shipModel.getQuat()))
		self.astBody.setQuaternion(Quat(self.asteroid.getQuat()))
		self.box = loader.loadModel("skybox/earth")
		self.box.setScale(600) #was 300
		self.box.reparentTo(render)
		self.box.setLightOff()
		self.box.clearFog()
		self.keysDown={'toto':'titi'}
		self.keysDown.clear()
		self.accept("z",self.keyDown,['z',1])
		self.accept("z-up",self.keyDown,['z',0])
		self.accept("q",self.keyDown,['q',1])
		self.accept("q-up",self.keyDown,['q',0])
		self.accept("s",self.keyDown,['s',1])
		self.accept("s-up",self.keyDown,['s',0])
		self.accept("d",self.keyDown,['d',1])
		self.accept("d-up",self.keyDown,['d',0])
		self.accept("a",self.keyDown,['a',1])
		self.accept("a-up",self.keyDown,['a',0])
		self.accept("w",self.keyDown,['w',1])
		self.accept("w-up",self.keyDown,['w',0])
		self.accept("w",self.keyDown,['x',1])
		self.accept("w-up",self.keyDown,['x',0])
		self.accept('yourCollision',self.onCollision)
		self.last=0
		self.currentTorqueX=0
		self.currentTorqueZ=0
		self.speed=0
		base.disableMouse()
		base.setFrameRateMeter(True)
		taskMgr.add(self.controlCamera, "camera-task")
		base.camera.setPos(0,-300,50)
	
	def onCollision(self,entry):
		print "collide"
	
	def createOdeBody(self,obj,mass,radius=1.01):
		pt1, pt2 = obj.getTightBounds() 
		xDim = pt2.getX() - pt1.getX() 
		yDim = pt2.getY() - pt1.getY() 
		zDim = pt2.getZ() - pt1.getZ() 
		odeBody = OdeBody(self.world) 
		odeMass = OdeMass()
		odeMass.setBoxTotal(mass, xDim, yDim, zDim)
		
		odeBody.setMass( odeMass ) 
		boxGeom = OdeBoxGeom(self.space, xDim, yDim, zDim)
		boxGeom.setCollideBits(BitMask32(0x00000001))
		boxGeom.setCategoryBits(BitMask32(0x00000001))
		boxGeom.setBody(odeBody)
		
		return odeBody,boxGeom
		
	def controlCamera(self, task):
		
		dt = task.time - self.last  #obtains the time since that last frame.
		self.last = task.time
		cc=self.space.autoCollide()
		
		self.world.quickStep(globalClock.getDt())	
		
		if self.keysDown.has_key('q'):
			if self.keysDown['q']!=0:
				self.odeBody.addTorque((0,0,stepTorque))
		if self.keysDown.has_key('d'):
			if (self.keysDown['d']!=0):
				self.odeBody.addTorque((0,0,-stepTorque))
		if self.keysDown.has_key('z'):
			if (self.keysDown['z']!=0):
				self.odeBody.addTorque((stepTorque,0,0))
		if self.keysDown.has_key('s'):
			if (self.keysDown['s']!=0):
				self.odeBody.addTorque((-stepTorque,0,0))
		if self.keysDown.has_key('a'):
			if (self.keysDown['a']!=0):
				self.speed+=10
		if self.keysDown.has_key('w'):
			if (self.keysDown['w']!=0):
				self.speed-=10
	
		if self.speed>0:
			self.speed-=5
		elif self.speed<0:
			self.speed+=5
			
		forwardVec=Quat(self.odeBody.getQuaternion()).getForward()
		self.odeBody.setLinearVel(forwardVec.getX()*self.speed,forwardVec.getY()*self.speed,forwardVec.getZ()*self.speed)

		av=self.odeBody.getAngularVel()
		av2=av*0.99
		self.odeBody.setAngularVel(av2)

		self.shipModel.setPos( self.odeBody.getPosition() ) 
		self.shipModel.setQuat( Quat(self.odeBody.getQuaternion()) ) 

		self.asteroid.setPos(self.astBody.getPosition())
		self.asteroid.setQuat(Quat(self.astBody.getQuaternion()))
		base.camera.lookAt(self.shipModel)
		
		return Task.cont
		
	def keyDown(self,key,value):
		if value==0:
			if self.keysDown.has_key(key)==1:
				del self.keysDown[key]
		else:
			self.keysDown[key]=value
		
		
app=odeTest()
run()

Thank you
[/code]

You appear to be missing the OdeJointGroup for collecting contact joints, as seen here: Collision Detection with ODE

so in the init you need something like…

self.contactgroup = OdeJointGroup()
self.space.setAutoCollideJointGroup(self.contactgroup)

and then in the task after quickStep empty it…

self.contactgroup.empty()

Nice, it works.

But now, I got an ode internal error:
assertion bNormalizationResult failed in …/include\ode/odemath.h:304.

Can you help?

Hi,

My problem was I defined no surface entry

self.world.setSurfaceEntry(0, 0, 0.8, 0.1, 10, 0.8, 0.00005, 0, 1)