public void Start() { // create world ode.dInitODE2(0); world = ode.dWorldCreate(); ode.dWorldSetGravity(world, 0, -10, 0); space = ode.dHashSpaceCreate(); contactgroup = ode.dJointGroupCreate(0); ground = ode.dCreatePlane(space, 0, 1, 0, 0); ode.dMass m1 = new ode.dMass(); ball = new OdeObject(); ball.body = ode.dBodyCreate(world); // Crate a rigid body ode.dMassSetZero(ref m1); // Initialize mass parameters ode.dMassSetSphereTotal(ref m1, mass, radius); // Calculate a mass parameter ode.dBodySetMass(ball.body, ref m1); ode.dBodySetPosition(ball.body, 0, 2, 0); ode.dBodySetQuaternion(ball.body, Quaternion.AngleAxis(45, Vector3.left)); ode.dBodyGetRotation(ball.body); ball.geoms.Add(ode.dCreateSphere(space, radius)); ball.target = target; ode.dGeomSetBody(ball.geoms[0], ball.body); ode.dBodyAddTorque(ball.body, 5, 0, 0); int a = 0; }
public void Create() { MaxIterationCount = ODEPhysicsWorld.Instance.defaultMaxIterationCount; worldID = Ode.dWorldCreate(); //Ode.dVector3 center = new Ode.dVector3( 0, 0, 0 ); //Ode.dVector3 extents = new Ode.dVector3( 1000, 1000, 1000 ); //rootSpaceID = Ode.dQuadTreeSpaceCreate( dSpaceID.Zero, ref center, ref extents, 10 ); rootSpaceID = Ode.dHashSpaceCreate( dSpaceID.Zero ); Ode.dHashSpaceSetLevels( rootSpaceID, ODEPhysicsWorld.Instance.hashSpaceMinLevel, ODEPhysicsWorld.Instance.hashSpaceMaxLevel ); // Create the ODE contact joint group. contactJointGroupID = Ode.dJointGroupCreate( 0 ); // Set the ODE global CFM value that will be used by all Joints // (including contacts). This affects normal Joint constraint // operation and Joint limits. The user cannot adjust CFM, but // they can adjust ERP (a.k.a. bounciness/restitution) for materials // (i.e. contact settings) and Joint limits. Ode.dWorldSetCFM( worldID, Defines.globalCFM ); // Set the ODE global ERP value. This will only be used for Joints // under normal conditions, not at their limits. Also, it will not // affect contacts at all since they use material properties to // calculate ERP. Ode.dWorldSetERP( worldID, 0.5f * ( Defines.maxERP + Defines.minERP ) ); Ode.dWorldSetContactSurfaceLayer( worldID, Defines.surfaceLayer ); //MaxIterationCount = maxIterationCount; //ray for RayCast rayCastGeomID = Ode.dCreateRay( rootSpaceID, 1 ); Ode.dGeomSetData( rayCastGeomID, IntPtr.Zero ); rayCastResultDistanceComparer = new Comparison<RayCastResult>( SortRayCastResultsMethod ); unsafe { Ode.CheckEnumAndStructuresSizes( sizeof( Ode.CollisionEventData ), sizeof( Ode.RayCastResult ) ); } neoAxisAdditionsID = Ode.NeoAxisAdditions_Init( Defines.maxContacts, Defines.minERP, Defines.maxERP, Defines.maxFriction, Defines.bounceThreshold, worldID, rootSpaceID, rayCastGeomID, contactJointGroupID ); UpdateMaxIterationCount(); UpdateGravity(); UpdateMaxAngularSpeed(); for( int group0 = 0; group0 < 32; group0++ ) for( int group1 = 0; group1 < 32; group1++ ) OnUpdateContactGroups( group0, group1, IsContactGroupsContactable( group0, group1 ) ); }
public void Destroy() { if (shapesDictionary.Count != 0) { Log.Warning("ODEPhysicsWorld: OnShutdownLibrary: shapesDictionary.Count != 0."); } if (neoAxisAdditionsID != IntPtr.Zero) { Ode.NeoAxisAdditions_Shutdown(neoAxisAdditionsID); neoAxisAdditionsID = IntPtr.Zero; } if (rayCastGeomID != dGeomID.Zero) { Ode.dGeomDestroy(rayCastGeomID); rayCastGeomID = dGeomID.Zero; } if (rootSpaceID != dSpaceID.Zero) { Ode.dSpaceDestroy(rootSpaceID); rootSpaceID = dSpaceID.Zero; } if (worldID != dWorldID.Zero) { Ode.dWorldDestroy(worldID); worldID = dWorldID.Zero; } if (contactJointGroupID != dJointGroupID.Zero) { Ode.dJointGroupDestroy(contactJointGroupID); contactJointGroupID = dJointGroupID.Zero; } }
public extern static dJointID dJointCreateContact( dWorldID world, dJointGroupID group, ref dContact contact );
public extern static int dWorldGetAutoDisableFlag( dWorldID world );
public extern static dReal dWorldGetAutoDisableTime( dWorldID world );
public extern static int dWorldGetAutoDisableSteps( dWorldID world );
public extern static void dWorldSetMaxAngularSpeed( dWorldID w, dReal max_speed );
public extern static void dWorldSetAutoDisableAngularThreshold( dWorldID world, dReal angular_threshold );
/// <summary> /// Initializes a new instance of the <see cref="World"/> class. /// </summary> public World() { id = NativeMethods.dWorldCreate(); }
public extern static void dWorldImpulseToForce( dWorldID world, dReal stepsize, dReal ix, dReal iy, dReal iz, ref dVector3 force );
public extern static dReal dWorldGetCFM( dWorldID world );
public void Create() { MaxIterationCount = ODEPhysicsWorld.Instance.defaultMaxIterationCount; worldID = Ode.dWorldCreate(); //Ode.dVector3 center = new Ode.dVector3( 0, 0, 0 ); //Ode.dVector3 extents = new Ode.dVector3( 1000, 1000, 1000 ); //rootSpaceID = Ode.dQuadTreeSpaceCreate( dSpaceID.Zero, ref center, ref extents, 10 ); rootSpaceID = Ode.dHashSpaceCreate(dSpaceID.Zero); Ode.dHashSpaceSetLevels(rootSpaceID, ODEPhysicsWorld.Instance.hashSpaceMinLevel, ODEPhysicsWorld.Instance.hashSpaceMaxLevel); // Create the ODE contact joint group. contactJointGroupID = Ode.dJointGroupCreate(0); // Set the ODE global CFM value that will be used by all Joints // (including contacts). This affects normal Joint constraint // operation and Joint limits. The user cannot adjust CFM, but // they can adjust ERP (a.k.a. bounciness/restitution) for materials // (i.e. contact settings) and Joint limits. Ode.dWorldSetCFM(worldID, Defines.globalCFM); // Set the ODE global ERP value. This will only be used for Joints // under normal conditions, not at their limits. Also, it will not // affect contacts at all since they use material properties to // calculate ERP. Ode.dWorldSetERP(worldID, 0.5f * (Defines.maxERP + Defines.minERP)); Ode.dWorldSetContactSurfaceLayer(worldID, Defines.surfaceLayer); //MaxIterationCount = maxIterationCount; //ray for RayCast rayCastGeomID = Ode.dCreateRay(rootSpaceID, 1); Ode.dGeomSetData(rayCastGeomID, IntPtr.Zero); rayCastResultDistanceComparer = new Comparison <RayCastResult>(SortRayCastResultsMethod); unsafe { Ode.CheckEnumAndStructuresSizes(sizeof(Ode.CollisionEventData), sizeof(Ode.RayCastResult)); } neoAxisAdditionsID = Ode.NeoAxisAdditions_Init(Defines.maxContacts, Defines.minERP, Defines.maxERP, Defines.maxFriction, Defines.bounceThreshold, worldID, rootSpaceID, rayCastGeomID, contactJointGroupID); UpdateMaxIterationCount(); UpdateGravity(); UpdateMaxAngularSpeed(); for (int group0 = 0; group0 < 32; group0++) { for (int group1 = 0; group1 < 32; group1++) { OnUpdateContactGroups(group0, group1, IsContactGroupsContactable(group0, group1)); } } }
public World() { ptr = ode.dWorldCreate(); contactgroup = ode.dJointGroupCreate(0); jointgroup = ode.dJointGroupCreate(0); }
public extern static dJointID dJointCreateUniversal( dWorldID world, dJointGroupID group );
public extern static dJointID dJointCreateLMotor( dWorldID world, dJointGroupID group );
public extern static void dWorldQuickStep( dWorldID world, dReal stepsize );
public extern static void dWorldSetAutoDisableLinearThreshold( dWorldID world, dReal linear_threshold );
public extern static void dWorldSetQuickStepNumIterations( dWorldID world, int num );
public extern static dReal dWorldGetAutoDisableAngularThreshold( dWorldID world );
public extern static int dWorldGetQuickStepNumIterations( dWorldID world );
public extern static void dWorldSetAutoDisableSteps( dWorldID world, int steps );
public extern static void dWorldSetQuickStepW( dWorldID world, dReal over_relaxation );
public extern static void dWorldSetAutoDisableTime( dWorldID world, dReal time );
public extern static dReal dWorldGetQuickStepW( dWorldID world );
public extern static void dWorldSetAutoDisableFlag( dWorldID world, int do_auto_disable );
public extern static void dWorldSetContactMaxCorrectingVel( dWorldID world, dReal vel );
public extern static dBodyID dBodyCreate( dWorldID world );
public extern static dReal dWorldGetContactMaxCorrectingVel( dWorldID world );
public extern static dJointID dJointCreateHinge2( dWorldID world, dJointGroupID group );
public extern static void dWorldSetContactSurfaceLayer( dWorldID world, dReal depth );
public extern static dJointID dJointCreateFixed( dWorldID world, dJointGroupID group );
public extern static dReal dWorldGetContactSurfaceLayer( dWorldID world );
public extern static dNeoAxisAdditionsID NeoAxisAdditions_Init( int maxContacts, float minERP, float maxERP, float maxFriction, float bounceThreshold, dWorldID worldID, dSpaceID rootSpaceID, dGeomID rayCastGeomID, dJointGroupID contactJointGroupID );
public extern static void dWorldStepFast1( dWorldID world, dReal stepsize, int maxiterations );