From: chris <dra...@gm...> - 2006-11-26 12:24:07
|
On 11/25/06, Hart's Antler <bha...@ya...> wrote: > setting your worlds ERP and CFM to zero seems to fix this, not sure why tho.. > -brett > > ok, I looked into this and those settings only have the effect of resucing the error. If you use these settings but set the displacement to 1000,1000,1000 instead of (10,10,10) of my original example and a small difference is apparent in the rest position compared to the one at (0,0,0) using (10000, 10000, 10000) give a more obvious difference. So my little experiment is still valid, whether you use the default ERP and CFM or not: pyode is very sensitive to position dependent error in its physics simulations. regards, chris > --- 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 > > ------------------------------------------------------------------------- > 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 > |