Hello,

I'm learning Pyode now. I'm blocked by the usage of 'geomtransform' and the
mass property.

I intended to make a dumbell in the ode world, composed of two geoms
connecting to one ode body.
When I touch or something hits one of the two balls, the dumbbell should
rotate. (as the center of mass is in the middle)

I made the following program to test if a force acting on a point other than
the center of mass
can make body1 rotate about its center of mass?

I first move the center of mass of body1 to
M1.translate((0.0, 5.0, 0.0))

Then I add a force in x direction at a relative position (0,1,0)
ode_body1.addForceAtRelPos((-100.0,0.0,0.0),(0.0,1.0,0.0))

I expect the sphere1 should move in an arc. But I cannot see the change in
y-axis.
what's wrong here? BTW, can anyone give an example of a dumbbell I described
above
using geomtransform?  Thanks in advance!

#################################################################

import ode


def near_callback(args,geom1,geom2):
   '''callback function for ODE collision detect'''
   #check if two geoms do collide
   contacts = ode.collide(geom1, geom2)

   #get args
   world,contactgroup = args
   for c in contacts:
       c.setBounce(1.0)    #bounceness 0-1
       c.setMu(0)          #friction
       #create contact joint and add it to two bodies
       j = ode.ContactJoint(world,contactgroup,c)
       j.attach(geom1.getBody(),geom2.getBody())
   pass


# Create a ODE world object
ode_world = ode.World()
ode_world.setERP(0.8)
ode_world.setCFM(1E-5)

# Create a space object
ode_space = ode.Space()
# A joint group for the contact joints that are generated whenever
# two bodies collide
ode_contactgroup = ode.JointGroup()



#add ode bodies
ode_body1 = ode.Body(ode_world)
M1 = ode.Mass()
M1.setSphere(1000.0, 1.0)
M1.mass = 1.0
#move the center of gravity
M1.translate((0.0, 5.0, 0.0))
print M1
ode_body1.setMass(M1)

#add geom for body1
geom1 = ode.GeomSphere(ode_space, radius = 1.0)
geom1.setBody(ode_body1)


#add ode bodies
ode_body2 = ode.Body(ode_world)
M2 = ode.Mass()
M2.setSphere(1000.0, 1.0)
M2.mass = 1.0
print M2
ode_body2.setMass(M2)
#add geom for body2
geom2 = ode.GeomSphere(ode_space, radius = 1.0)
geom2.setBody(ode_body2)


#place two bodies along x axis
geom1.setPosition((-1.5, 0.0, 0.0))
geom2.setPosition((1.5, 0.0, 0.0))

#add some force
##ode_body1.addForceAtPos((-100.0,0.0,0.0),(0.0,0.0,0.0))
ode_body1.addForceAtRelPos((-100.0,0.0,0.0),(0.0,1.0,0.0))

#assign a negative velcocity in x-axis to collide with body1
##ode_body2.setLinearVel((-0.5,0,0))
dt=0.0001
while 1:
   print ode_body1.getPosition(),ode_body2.getPosition()

   ode_space.collide((ode_world,ode_contactgroup),near_callback)
   ode_world.step(dt)
   ode_contactgroup.empty()
############################################################################
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Pyode-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pyode-user

Reply via email to