Class | ODE::Contact |
In: |
ext/body.c
(CVS)
lib/ode/contact.rb (CVS) |
Parent: | Object |
The contact class.
allocate() — Create a contact (collision) object.
/* * allocate() * -- * Create a contact (collision) object. */ static VALUE ode_contact_s_alloc( klass ) VALUE klass; { debugMsg(( "Wrapping an uninitialized ODE::Contact pointer." )); return Data_Wrap_Struct( klass, ode_contact_gc_mark, ode_contact_gc_free, 0 ); }
initialize( pos=nil, normal=nil, depth=nil, geom1=nil, geom2=nil ) — Instantiate and return a new ODE::Contact object, optionally filling in the specified parts of the contact geometry.
/* * initialize( pos=nil, normal=nil, depth=nil, geom1=nil, geom2=nil ) * -- * Instantiate and return a new ODE::Contact object, optionally filling in the * specified parts of the contact geometry. */ static VALUE ode_contact_init( argc, argv, self ) int argc; VALUE *argv, self; { int argCount; VALUE pos, normal, depth, g1, g2; debugMsg(( "ODE::Contact init." )); if ( !check_contact(self) ) { ode_CONTACT *ptr; DATA_PTR(self) = ptr = ode_contact_alloc(); ptr->object = self; /* Create a new surface object and add that to the new object's surface member. */ ptr->surface = rb_class_new_instance( 0, 0, ode_cOdeSurface ); /* Allocate and fill the mid-level struct */ ptr->contact = ALLOC( dContact ); ptr->contact->surface = *(ode_get_surface( ptr->surface )); ptr->contact->fdir1[0] = 0.f; ptr->contact->fdir1[1] = 0.f; ptr->contact->fdir1[2] = 0.f; /* Set the pointer to the bottom struct to NULL, as it should be filled in by a geometry later. */ MEMZERO( &ptr->contact->geom, dContactGeom, 1 ); return self; } /* If there are initializer arguments, call the accessors to set the ones provided. */ if (( argCount = rb_scan_args(argc, argv, "05", &pos, &normal, &depth, &g1, &g2) )) { if ( pos ) rb_funcall( self, rb_intern("pos="), 1, &pos ); if ( normal ) rb_funcall( self, rb_intern("normal="), 1, &normal ); if ( depth ) rb_funcall( self, rb_intern("depth="), 1, &depth ); if ( g1 ) rb_funcall( self, rb_intern("geom1="), 1, &g1 ); if ( g2 ) rb_funcall( self, rb_intern("geom2="), 1, &g2 ); } debugMsg(( "Calling super()" )); rb_call_super( 0, 0 ); debugMsg(( "Back from super()" )); return self; }
depth — Return the depth to which the two bodies inter-penetrate each other. If the depth is zero then the two bodies have a grazing contact, i.e. they "only just" touch. However, this is rare - the simulation is not perfectly accurate and will often step the bodies too far so that the depth is nonzero.
/* * depth * -- * Return the depth to which the two bodies inter-penetrate each other. If the * depth is zero then the two bodies have a grazing contact, i.e. they "only * just" touch. However, this is rare - the simulation is not perfectly accurate * and will often step the bodies too far so that the depth is nonzero. */ static VALUE ode_contact_depth( self ) VALUE self; { ode_CONTACT *ptr = get_contact( self ); return rb_float_new( ptr->contact->geom.depth ); }
depth=( depth ) — Set the penetration depth of the contact.
/* * depth=( depth ) * -- * Set the penetration depth of the contact. */ static VALUE ode_contact_depth_eq( self, depth ) VALUE self, depth; { ode_CONTACT *ptr = get_contact( self ); ptr->contact->geom.depth = (dReal)NUM2DBL( depth ); return rb_float_new( ptr->contact->geom.depth ); }
fdir1 — Returns the "first friction direction" vector that defines a direction along which frictional force is applied if the contact’s surfaceuseFrictionDirection? flag is true. If useFrictionDirection? is false, this setting is unused, though it can still be set.
/* * fdir1 * -- * Returns the "first friction direction" vector that defines a direction along * which frictional force is applied if the contact's * surface#useFrictionDirection? flag is true. If useFrictionDirection? is * false, this setting is unused, though it can still be set. */ static VALUE ode_contact_fdir1( self ) VALUE self; { ode_CONTACT *ptr = get_contact( self ); VALUE fdir1; check_contact_geom( ptr ); Vec3ToOdeVector( ptr->contact->fdir1, fdir1 ); return fdir1; }
fdir1=( vector ) — Sets the "first friction direction" vector that defines a direction along which frictional force is applied if the contact’s surfaceuseFrictionDirection? flag is true. If useFrictionDirection? is false, this setting is unused, though it can still be set.
/* * fdir1=( vector ) * -- * Sets the "first friction direction" vector that defines a direction along * which frictional force is applied if the contact's * surface#useFrictionDirection? flag is true. If useFrictionDirection? is * false, this setting is unused, though it can still be set. */ static VALUE ode_contact_fdir1_eq( self, direction ) VALUE self, direction; { ode_CONTACT *ptr = get_contact( self ); VALUE fdirAry = ode_obj_to_ary3( direction, "direction" ); SetVec3FromArray( ptr->contact->fdir1, fdirAry ); return fdirAry; }
geom1 — Returns one of the pair of geometry objects (a deriviative of ODE::Geometry)involved in the collision.
/* * geom1 * -- * Returns one of the pair of geometry objects (a deriviative of * ODE::Geometry)involved in the collision. */ static VALUE ode_contact_geom1( self ) VALUE self; { ode_CONTACT *ptr = get_contact( self ); ode_GEOMETRY *geom; geom = (ode_GEOMETRY *)dGeomGetData( ptr->contact->geom.g1 ); return geom->object; }
geom1=( geometry ) — Sets one of the pair of geometry objects involved in the collision to the specified geometry (a deriviative of ODE::Geometry).
/* * geom1=( geometry ) * -- * Sets one of the pair of geometry objects involved in the collision to the * specified <tt>geometry</tt> (a deriviative of ODE::Geometry). */ static VALUE ode_contact_geom1_eq( self, geometry ) VALUE self, geometry; { ode_CONTACT *ptr = get_contact( self ); ode_GEOMETRY *geom = ode_get_geom( geometry ); ptr->contact->geom.g1 = geom->id; return geom->object; }
geom2 — Returns one of the pair of geometry objects (a deriviative of ODE::Geometry)involved in the collision.
/* * geom2 * -- * Returns one of the pair of geometry objects (a deriviative of * ODE::Geometry)involved in the collision. */ static VALUE ode_contact_geom2( self ) VALUE self; { ode_CONTACT *ptr = get_contact( self ); ode_GEOMETRY *geom; geom = (ode_GEOMETRY *)dGeomGetData( ptr->contact->geom.g2 ); return geom->object; }
geom2=( geometry ) — Sets one of the pair of geometry objects involved in the collision to the specified geometry (a deriviative of ODE::Geometry).
/* * geom2=( geometry ) * -- * Sets one of the pair of geometry objects involved in the collision to the * specified <tt>geometry</tt> (a deriviative of ODE::Geometry). */ static VALUE ode_contact_geom2_eq( self, geometry ) VALUE self, geometry; { ode_CONTACT *ptr = get_contact( self ); ode_GEOMETRY *geom = ode_get_geom( geometry ); ptr->contact->geom.g2 = geom->id; return geom->object; }
geometries — Returns both geometry objects (ODE::Geometry deriviatives) involved in the collision as an Array.
/* * geometries * -- * Returns both geometry objects (ODE::Geometry deriviatives) involved in the * collision as an Array. */ static VALUE ode_contact_geom_ary( self ) VALUE self; { ode_CONTACT *ptr = get_contact( self ); ode_GEOMETRY *geom1, *geom2; geom1 = (ode_GEOMETRY *)dGeomGetData( ptr->contact->geom.g1 ); geom2 = (ode_GEOMETRY *)dGeomGetData( ptr->contact->geom.g2 ); return rb_ary_new3( 2, geom1->object, geom2->object ); }
geometries=( g1, g2 ) — Sets both geometry objects (ODE::Geometry deriviatives) involved in the collision.
/* * geometries=( g1, g2 ) * -- * Sets both geometry objects (ODE::Geometry deriviatives) involved in the * collision. */ static VALUE ode_contact_geom_ary_eq( self, args ) VALUE self, args; { ode_CONTACT *ptr = get_contact( self ); VALUE geom1, geom2; ode_GEOMETRY *g1, *g2; /* Check to be sure 2 args were given */ if ( RARRAY(args)->len != 2 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for 2)", RARRAY(args)->len ); /* Fetch what is needed from the arguments */ geom1 = *(RARRAY(args)->ptr); g1 = ode_get_geom( geom1 ); geom2 = *(RARRAY(args)->ptr+1); g2 = ode_get_geom( geom2 ); /* Set the geometries in the inner structs */ ptr->contact->geom.g1 = g1->id; ptr->contact->geom.g2 = g2->id; return rb_ary_new3( 2, geom1, geom2 ); }
Returns a string containing a human-readable representation of the contact, oriented towards debugging or tracing.
# File lib/ode/contact.rb, line 44 def inspect "<%s 0x%x: surface=%s, geom1=%s, geom2=%s>" % [ self.class.name, self.object_id * 2, self.surface.inspect, self.geom1.inspect, self.geom2.inspect ] end
normal — Get the normal vector (as an ODE::Vector), which is a unit length vector that is, generally speaking, perpendicular to the contact surface.
/* * normal * -- * Get the normal vector (as an ODE::Vector), which is a unit length vector that * is, generally speaking, perpendicular to the contact surface. */ static VALUE ode_contact_normal( self ) VALUE self; { ode_CONTACT *ptr = get_contact( self ); VALUE normal; check_contact_geom( ptr ); Vec3ToOdeVector( ptr->contact->geom.normal, normal ); return normal; }
normal=( normal ) — Set the contact’s normal vector to normal which can be any object which returns three numbers when to_ary is called on it (eg., an ODE::Vector, an Array of three numbers, etc.).
/* * normal=( normal ) * -- * Set the contact's normal vector to <tt>normal</tt> which can be any object * which returns three numbers when #to_ary is called on it (eg., an * ODE::Vector, an Array of three numbers, etc.). */ static VALUE ode_contact_normal_eq( self, normal ) VALUE self, normal; { ode_CONTACT *ptr = get_contact( self ); VALUE normalAry = ode_obj_to_ary3( normal, "contact normal" ); SetVec3FromArray( ptr->contact->geom.normal, normalAry ); return normalAry; }
pos — Returns the position of the contact in global coordinates as an ODE::Position object.
/* * pos * -- * Returns the position of the contact in global coordinates as an ODE::Position * object. */ static VALUE ode_contact_pos( self ) VALUE self; { ode_CONTACT *ptr = get_contact( self ); VALUE pos; check_contact_geom( ptr ); Vec3ToOdePosition( ptr->contact->geom.pos, pos ); return pos; }
pos=( position ) — Set the position of the contact in global coordinates to the specified position, which can be any object which returns an Array of three numbers when to_ary is called on it (eg., Array, ODE::Vector, ODE::Position, etc.).
/* * pos=( position ) * -- * Set the position of the contact in global coordinates to the specified * <tt>position</tt>, which can be any object which returns an Array of three * numbers when #to_ary is called on it (eg., Array, ODE::Vector, ODE::Position, * etc.). */ static VALUE ode_contact_pos_eq( self, newPos ) VALUE self, newPos; { ode_CONTACT *ptr = get_contact( self ); VALUE posAry = ode_obj_to_ary3( newPos, "position" ); SetVec3FromArray( ptr->contact->geom.pos, posAry ); return posAry; }
surface — Fetch the object that describes the properties of the colliding surfaces (an ODE::Surface object).
/* * surface * -- * Fetch the object that describes the properties of the colliding surfaces (an * ODE::Surface object). */ static VALUE ode_contact_surface( self ) VALUE self; { ode_CONTACT *ptr = get_contact( self ); return ptr->surface; }
surface=( newSurface ) — Set the surface parameters of the collision to the specified newSurface (an ODE::Surface object).
/* * surface=( newSurface ) * -- * Set the surface parameters of the collision to the specified * <tt>newSurface</tt> (an ODE::Surface object). */ static VALUE ode_contact_surface_eq( self, surface ) VALUE self, surface; { ode_CONTACT *ptr = get_contact( self ); dSurfaceParameters *surfacePtr = ode_get_surface( surface ); ptr->surface = surface; ptr->contact->surface = *surfacePtr; return surface; }