Ode : number of object [Solved]

Hello,

I wish to know if there is a limit of number of object managed by ODE.
For example, I have loaded 500 asteroids (sphere), and I got a python exception (without error in the console).

Thank you

It seems that my code crashes on autoCollide, when I got more than 30 elements…

But I don’t know why

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
import random
stepSize = 1.0 / 60.0
ang_step=0.3
stepTorque=150
class odeTest(DirectObject):
	def __init__(self):
		self.aster=[]
		self.world = OdeWorld()
		self.world.setGravity(0, 0, 0)
		self.world.initSurfaceTable(1)
		self.world.setSurfaceEntry(0, 0, 0.8, 0.1, 10, 0.8, 0.00005, 0, 1)
		self.space = OdeSimpleSpace()

		self.space.setAutoCollideWorld(self.world)
		self.contactgroup = OdeJointGroup() 
		self.space.setAutoCollideJointGroup(self.contactgroup)
		self.space.setCollisionEvent("yourCollision")
		
		self.shipModel= loader.loadModel("fighter")
		self.shipModel.reparentTo(render)
		self.odeBody,self.odeGeom=self.createOdeBody(self.shipModel,10)
		self.odeBody.setPosition(-500,-500,-500)
		self.odeBody.setQuaternion(Quat(self.shipModel.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)
		self.angVelX=0
		self.angVelY=0
		self.loadAsteroid()
		
	def loadAsteroid(self):
		x=500
		y=500
		z=500
		for i in range(46):
			ast=loader.loadModel("tumbleweed")
			ast.setScale(30)
			ast.reparentTo(render)
			ast.setPos(x,y,z)
			astBody,astGeom=self.createOdeBody(ast,100)
			self.space.setSurfaceType(astGeom, 0)
			self.aster.append(ast)
			#~ if x<100000:
				#~ x+=500
			#~ else:
				#~ x=500
				#~ if y<100000:
					#~ y+=500
				#~ else:
					#~ y=500
					#~ z+=500
			x=500*i
			print str(x) + " / " + str(y) + "/" + str(z)
	
	def onCollision(self,entry):
		self.speed=0
	
	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() 
		print str(xDim) + "#" + str(yDim) + "#"  + str(zDim)
		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
		
		self.shipModel.setPos( self.odeBody.getPosition() ) 
		self.shipModel.setQuat( Quat(self.odeBody.getQuaternion()) ) 
		
		if dt > stepSize:
			cc=self.space.autoCollide()
			self.world.quickStep(dt)	
			self.contactgroup.empty()
			
			if self.keysDown.has_key('a'):
				if (self.keysDown['a']!=0):
					if self.speed<100:
						self.speed+=10
						
			if self.keysDown.has_key('w'):
				if (self.keysDown['w']!=0):
					if self.speed>0:
						self.speed-=10

					
			if self.keysDown.has_key('q'):
				if self.keysDown['q']!=0:
					if self.odeBody.getAngularVel().getZ()<1:
						self.odeBody.addRelTorque(0,0,1000)
			if self.keysDown.has_key('d'):
				if self.keysDown['d']!=0:
					if self.odeBody.getAngularVel().getZ()>-1:
						self.odeBody.addRelTorque(0,0,-1000)
			
			if self.keysDown.has_key('s'):
				if self.keysDown['s']!=0:
					if self.odeBody.getAngularVel().getX()<1:
						self.odeBody.addRelTorque(1000,0,0)
			
			if self.keysDown.has_key('z'):
				if self.keysDown['z']!=0:
					if self.odeBody.getAngularVel().getX()>-1:
						self.odeBody.addRelTorque(-1000,0,0)
			

			if self.odeBody.getAngularVel().getX()<-0.01:
				self.odeBody.addTorque(300,0,0)
			elif self.odeBody.getAngularVel().getX()>0.01:
				self.odeBody.addRelTorque(-300,0,0)
				
			if self.odeBody.getAngularVel().getZ()<-0.01:
				self.odeBody.addRelTorque(0,0,300)
			elif self.odeBody.getAngularVel().getZ()>0.01:
				self.odeBody.addRelTorque(0,0,-300)
				
			#~ print self.odeBody.getAngularVel()
			
			
			forwardVec=Quat(self.odeBody.getQuaternion()).getForward()
			self.odeBody.addForce(forwardVec.getX()*10*self.speed,forwardVec.getY()*10*self.speed,forwardVec.getZ()*10*self.speed)

			self.odeBody.setLinearVel(self.odeBody.getLinearVel().getX()*0.98,self.odeBody.getLinearVel().getY()*0.98,self.odeBody.getLinearVel().getZ()*0.98)
				

			forwardVec.normalize
			ccou = (((forwardVec*(-200.0)) + self.odeBody.getPosition()) * 0.20) + (base.camera.getPos() * 0.80)
			pogi = Quat(self.odeBody.getQuaternion()).getHpr()*0.1 + base.camera.getHpr()*0.9
			base.camera.setPos(ccou)
			base.camera.setHpr(pogi)

			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()))


		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()

I just forgot to setPos my odeBody so they were all the same coordinate, and were inside each other.