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]