void nearCallback(IntPtr data, dGeomID o1, dGeomID o2) { dBodyID b1 = ode.dGeomGetBody(o1); dBodyID b2 = ode.dGeomGetBody(o2); const int MAX_CONTACTS = 5; ode.dContact[] contact = new ode.dContact[MAX_CONTACTS]; for (int i = 0; i < MAX_CONTACTS; i++) { contact[i].surface.mode = (int)(ode.dContactType.Bounce | ode.dContactType.SoftCFM); contact[i].surface.mu = Mathf.Infinity; contact[i].surface.mu2 = 0; contact[i].surface.bounce = 0.01f; contact[i].surface.bounce_vel = 0.1f; contact[i].surface.soft_cfm = 0.01f; } int numc = ode.dCollide(o1, o2, MAX_CONTACTS, ref contact[0].geom, System.Runtime.InteropServices.Marshal.SizeOf(typeof(ode.dContact))); if (numc > 0) { for (int i = 0; i < numc; i++) { dJointID c = ode.dJointCreateContact(world, contactgroup, ref contact[i]); ode.dJointAttach(c, b1, b2); } } }
void OnNewContact(ref ode.dContact contact, dBodyID body1, dBodyID body2) { dJointID c = ode.dJointCreateContact(world.ptr, world.contactgroup, ref contact); ode.dJointAttach(c, body1, body2); }