From: Hart's A. <bha...@ya...> - 2006-11-24 17:07:27
|
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 |