From: <mi...@mi...> - 2006-11-24 21:33:02
|
Thank you. I'll look into that. - Miriam > setting your worlds ERP and CFM to zero seems to fix this, not sure why tho.. > -brett > > > --- mi...@mi... wrote: > > > Hi folks, > > > > A friend (he's probably joining pyode-user as I send this) sent me the two small python scripts > > (attached). They both drop a block near another. They are the same except for one being at > > (0,0,0) the other at (10,10,10), but their behavior is markedly different. Why? > > > > Is there any way to ensure that behavior has positional independence? ...at least in fairly > > ordinary ranges. I know things will get crazy near the limits of numerical precision, but this > > is just a little over 10 units from the center of the universe. > > > > Is there some other parameter that needs to be handled to take account of the position? > > > > Best wishes, > > > > - Miriam > > -- > > ---------=---------=---------=---------=---------=---------=------ > > A life! Cool! Where can I download one of those from? > > ---------=---------=---------=---------=---------=---------=------ > > Website: http://miriam-english.org > > Blog: http://www.livejournal.com/users/miriam_e/ > > > # pyODE example 3: Collision detection > > # origin > > > > # Originally by Matthias Baas. > > # Updated by Pierre Gay to work without pygame or cgkit. > > > > import sys, os, random, time > > from math import * > > from OpenGL.GL import * > > from OpenGL.GLU import * > > from OpenGL.GLUT import * > > > > import ode > > > > # geometric utility functions > > def scalp (vec, scal): > > vec[0] *= scal > > vec[1] *= scal > > vec[2] *= scal > > > > def length (vec): > > return sqrt (vec[0]**2 + vec[1]**2 + vec[2]**2) > > > > # prepare_GL > > def prepare_GL(): > > """Prepare drawing. > > """ > > > > # Viewport > > glViewport(0,0,640,480) > > > > # Initialize > > glClearColor(0.8,0.8,0.9,0) > > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); > > glEnable(GL_DEPTH_TEST) > > glDisable(GL_LIGHTING) > > glEnable(GL_LIGHTING) > > glEnable(GL_NORMALIZE) > > glShadeModel(GL_FLAT) > > > > # Projection > > glMatrixMode(GL_PROJECTION) > > glLoadIdentity() > > gluPerspective (45,1.3333,0.2,20) > > > > # Initialize ModelView matrix > > glMatrixMode(GL_MODELVIEW) > > glLoadIdentity() > > > > # Light source > > glLightfv(GL_LIGHT0,GL_POSITION,[0,0,1,0]) > > glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1]) > > glLightfv(GL_LIGHT0,GL_SPECULAR,[1,1,1,1]) > > glEnable(GL_LIGHT0) > > > > # View transformation > > gluLookAt (2.4, 3.6, 4.8, 0.5, 0.5, 0, 0, 1, 0) > > > > # draw_body > > def draw_body(body): > > """Draw an ODE body. > > """ > > > > x,y,z = body.getPosition() > > R = body.getRotation() > > #rot = [R[0], R[3], R[6], 0., > > # R[1], R[4], R[7], 0., > > # R[2], R[5], R[8], 0., > > # x, y, z, 1.0] > > rot = [1, 0.0, 0.0, 0.0, > > 0.0, 1, 0.0, 0.0, > > 0.0, 0.0, 1.0, 0.0, > > x, y, z, 1.0] > > glPushMatrix() > > glMultMatrixd(rot) > > if body.shape=="box": > > sx,sy,sz = body.boxsize > > glScale(sx, sy, sz) > > glutSolidCube(1) > > glPopMatrix() > > > > > > # create_box > > def create_box(world, space, density, lx, ly, lz): > > """Create a box body and its corresponding geom.""" > > > > # Create body > > body = ode.Body(world) > > M = ode.Mass() > > M.setBox(density, lx, ly, lz) > > body.setMass(M) > > > > # Set parameters for drawing the body > > body.shape = "box" > > body.boxsize = (lx, ly, lz) > > > > # Create a box geom for collision detection > > geom = ode.GeomBox(space, lengths=body.boxsize) > > geom.setBody(body) > > > > return body > > > > # create box object > > def create_object(posx, posy, posz): > > """create one box at a given position.""" > > > > global bodies, counter, objcount > > > > body = create_box(world, space, 1000, 1.0,1.0,1.0) > > body.setPosition((posx, posy, posz)) > > bodies.append(body) > > #counter=0 > > objcount+=1 > > > > > > # drop_object > > def drop_object(posx, posy, posz): > > """Drop an object into the scene.""" > > > > global bodies, counter, objcount > > > > body = create_box(world, space, 1000, 1.0,1.0,1.0) > > body.setPosition((posx, posy, posz)) > > bodies.append(body) > > #counter=0 > > objcount+=1 > > > > # Collision callback > > def near_callback(args, geom1, geom2): > > """Callback function for the collide() method. > > > > This function checks if the given geoms do collide and > > creates contact joints if they do. > > """ > > > > # Check if the objects do collide > > contacts = ode.collide(geom1, geom2) > > > > # Create contact joints > > world,contactgroup = args > > for c in contacts: > > c.setBounce(0.2) > > c.setMu(5000) > > j = ode.ContactJoint(world, contactgroup, c) > > j.attach(geom1.getBody(), geom2.getBody()) > > > > > > > > ###################################################################### > > > > # Initialize Glut > > glutInit ([]) > > > > # Open a window > > glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE) > > > > x = 0 > > y = 0 > > width = 640 > > height = 480 > > glutInitWindowPosition (x, y); > > glutInitWindowSize (width, height); > > glutCreateWindow ("(0,0,0)") > > > > # Create a world object > > world = ode.World() > > world.setGravity( (0,-9.81,0) ) > > world.setERP(0.8) > > world.setCFM(1E-5) > > > > # Create a space object > > space = ode.Space() > > > > # Create a plane geom which prevent the objects from falling forever > > floor = ode.GeomPlane(space, (0,1,0), 0) > > > > # A list with ODE bodies > > bodies = [] > > > > # A joint group for the contact joints that are generated whenever > > # two bodies collide > > contactgroup = ode.JointGroup() > > > > # Some variables used inside the simulation loop > > fps = 50 > > dt = 1.0/fps > > running = True > > state = 0 > > counter = 0 > > objcount = 0 > > lasttime = time.time() > > > > > > # keyboard callback > > def _keyfunc (c, x, y): > > sys.exit (0) > > > > glutKeyboardFunc (_keyfunc) > > > > # draw callback > > def _drawfunc (): > > > === message truncated ===> # pyODE example 3: Collision detection > > # 1000 > > > > # Originally by Matthias Baas. > > # Updated by Pierre Gay to work without pygame or cgkit. > > > > import sys, os, random, time > > from math import * > > from OpenGL.GL import * > > from OpenGL.GLU import * > > from OpenGL.GLUT import * > > > > import ode > > > > # geometric utility functions > > def scalp (vec, scal): > > vec[0] *= scal > > vec[1] *= scal > > vec[2] *= scal > > > > def length (vec): > > return sqrt (vec[0]**2 + vec[1]**2 + vec[2]**2) > > > > # prepare_GL > > def prepare_GL(): > > """Prepare drawing. > > """ > > > > # Viewport > > glViewport(0,0,640,480) > > > > # Initialize > > glClearColor(0.8,0.8,0.9,0) > > glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); > > glEnable(GL_DEPTH_TEST) > > glDisable(GL_LIGHTING) > > glEnable(GL_LIGHTING) > > glEnable(GL_NORMALIZE) > > glShadeModel(GL_FLAT) > > > > # Projection > > glMatrixMode(GL_PROJECTION) > > glLoadIdentity() > > gluPerspective (45,1.3333,0.2,20) > > > > # Initialize ModelView matrix > > glMatrixMode(GL_MODELVIEW) > > glLoadIdentity() > > > > # Light source > > glLightfv(GL_LIGHT0,GL_POSITION,[0,0,1,0]) > > glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1]) > > glLightfv(GL_LIGHT0,GL_SPECULAR,[1,1,1,1]) > > glEnable(GL_LIGHT0) > > > > # View transformation > > gluLookAt (12.4, 13.6, 14.8, 10.5, 10.5, 10, 0, 1, 0) > > > > # draw_body > > def draw_body(body): > > """Draw an ODE body. > > """ > > > > x,y,z = body.getPosition() > > R = body.getRotation() > > #rot = [R[0], R[3], R[6], 0., > > # R[1], R[4], R[7], 0., > > # R[2], R[5], R[8], 0., > > # x, y, z, 1.0] > > rot = [1, 0.0, 0.0, 0.0, > > 0.0, 1, 0.0, 0.0, > > 0.0, 0.0, 1.0, 0.0, > > x, y, z, 1.0] > > glPushMatrix() > > glMultMatrixd(rot) > > if body.shape=="box": > > sx,sy,sz = body.boxsize > > glScale(sx, sy, sz) > > glutSolidCube(1) > > glPopMatrix() > > > > > > # create_box > > def create_box(world, space, density, lx, ly, lz): > > """Create a box body and its corresponding geom.""" > > > > # Create body > > body = ode.Body(world) > > M = ode.Mass() > > M.setBox(density, lx, ly, lz) > > body.setMass(M) > > > > # Set parameters for drawing the body > > body.shape = "box" > > body.boxsize = (lx, ly, lz) > > > > # Create a box geom for collision detection > > geom = ode.GeomBox(space, lengths=body.boxsize) > > geom.setBody(body) > > > > return body > > > > # create box object > > def create_object(posx, posy, posz): > > """create one box at a given position.""" > > > > global bodies, counter, objcount > > > > body = create_box(world, space, 1000, 1.0,1.0,1.0) > > body.setPosition((posx, posy, posz)) > > bodies.append(body) > > #counter=0 > > objcount+=1 > > > > > > # drop_object > > def drop_object(posx, posy, posz): > > """Drop an object into the scene.""" > > > > global bodies, counter, objcount > > > > body = create_box(world, space, 1000, 1.0,1.0,1.0) > > body.setPosition((posx, posy, posz)) > > bodies.append(body) > > #counter=0 > > objcount+=1 > > > > # Collision callback > > def near_callback(args, geom1, geom2): > > """Callback function for the collide() method. > > > > This function checks if the given geoms do collide and > > creates contact joints if they do. > > """ > > > > # Check if the objects do collide > > contacts = ode.collide(geom1, geom2) > > > > # Create contact joints > > world,contactgroup = args > > for c in contacts: > > c.setBounce(0.2) > > c.setMu(5000) > > j = ode.ContactJoint(world, contactgroup, c) > > j.attach(geom1.getBody(), geom2.getBody()) > > > > > > > > ###################################################################### > > > > # Initialize Glut > > glutInit ([]) > > > > # Open a window > > glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE) > > > > x = 0 > > y = 0 > > width = 640 > > height = 480 > > glutInitWindowPosition (x, y); > > glutInitWindowSize (width, height); > > glutCreateWindow ("(10,10,10)") > > > > # Create a world object > > world = ode.World() > > world.setGravity( (0,-9.81,0) ) > > world.setERP(0.8) > > world.setCFM(1E-5) > > > > # Create a space object > > space = ode.Space() > > > > # Create a plane geom which prevent the objects from falling forever > > floor = ode.GeomPlane(space, (0,1,0), 10) > > > > # A list with ODE bodies > > bodies = [] > > > > # A joint group for the contact joints that are generated whenever > > # two bodies collide > > contactgroup = ode.JointGroup() > > > > # Some variables used inside the simulation loop > > fps = 50 > > dt = 1.0/fps > > running = True > > state = 0 > > counter = 0 > > objcount = 0 > > lasttime = time.time() > > > > > > # keyboard callback > > def _keyfunc (c, x, y): > > sys.exit (0) > > > > glutKeyboardFunc (_keyfunc) > > > > # draw callback > > def _drawfunc (): > > > === message truncated ===> > ------------------------------------------------------------------------- > > Take Surveys. Earn Cash. Influence the Future of IT > > Join SourceForge.net's Techsay panel and you'll get the chance to share your > > opinions on IT & business topics through brief surveys - and earn cash > > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV> > _______________________________________________ > > Pyode-user mailing list > > Pyo...@li... > > https://lists.sourceforge.net/lists/listinfo/pyode-user > > > > > > > ____________________________________________________________________________________ > Do you Yahoo!? > Everyone is raving about the all-new Yahoo! Mail beta. > http://new.mail.yahoo.com |