[ODE] bouncy car

Luke Kenneth Casson Leighton lkcl at lkcl.net
Sun Nov 7 14:24:56 MST 2004

hi, just for fun i figured i'd try doing a car with that funny
race-style suspension, you know, like a sand buggy.

well, it kinda works.

having been playing about, therefore, i have a couple of questions and a
couple of suggestions:

1) the design of the ode library critically depends on OpenGL.

   good library design dictates that you pass in a set of pointers to
   functions that _your_ library calls in order to do what it wants to

   in the case of libode, that would mean making setCamera, setColor,
   setTransform, drawBox etc. all part of an "external" OpenGL-specific
   library which libode would use.

2) i was surprised to find that hinges do not have a means for
   developers to apply forces or torques "via" the hinge.

   what i mean by that is that in order to implement a spring,
   the developer must MANUALLY calculate the direction of the forces
   on the objects.

   i would have expected to be able to say "on this joint, apply a force
   in both directions along the axis, onto the two bodies it connects,
   at the connecting points".

   in this way, the calculations are all performed "behind the scenes".
   surely, you know where the axis joins the two bodies, and if that
   isn't known then i would imagine it to be a relatively
   straightforward task to add "contact" points on the two bodies at
   which the forces could be applied.

i found that i had to "fudge" the sand buggy suspension by applying
forces to the middle of the wheel and to the middle of one of the
suspension struts (between the crosses):

----x----  body
| /
----x----  body


1) does anyone know of any good open source "landscape" creating code?
   blank space is really boring and deceptive.

   i really liked the look of that landscape that i saw someone created
   who was modelling an automated rover before building it.

   [btw i hope your rover's suspension can lift up and down to avoid

   i've also played with bzflag, but don't really fancy merging two sets
   of disparate code together (yet).

2) can someone advise me what functions i should call to work out a
vector pointing up at right angles to a surface on the "car"?

 i realise this is probably a very simple question - one that i won't
 need to ask more than once.

 i need to apply a speed-related downforce onto the car of course but
 i am presently applying it in the z-direction only.

 what i want to do is apply wind-related forces on every surface.

 as follows:

 foreach surface sf of area sz:

	 dReal *velocity = dBodyGetLinearVel(car);
	 dReal *pos = dBodyGetPosition(car);

	// gives me a vector pointing in the absolute direction of
	// each vehicle's surface.  so if the vehicle is pointing
	// (1, 0, 0) then the "rear" surface points (-1, 0, 0)
	// and the "left" surface points (0, -1, 0).
	 dReal *surfvector = somehowmultiply(pos, sf);

	dReal velocitysqd[3];
	velocitysqd[0] = velocity[0]*velocity[0];
	... 1 1 1;
	... 2 2 2;

    // gives me a scalar telling me how much wind-force to apply
	 dotproduct = dotproductfunction(velocitysqd, surfvector);

	 dBodyApplyForce(sz * dotproduct * resistance, surfvector[0], [1], [2]);

 of course, if i put "spoilers" on the car, the surfaces will point
 (0.707, 0, -0.707) or thereabouts.

 which will result in downforce _and_ drag being applied as the vehicle

 it also means that if the vehicle gets airborne and starts to tumble,
 the vehicle will present belly to the "wind" and go off in some wild
 but scarily realistic direction like you see in F1 or indycar
 spectacular crashes.

 some assistance in filling in the blanks "somehowmultiply" and
 "dotproductfunction" above greatly appreciated.


you don't have to BE MAD   | this space    | my brother wanted to join mensa,
  to work, but   IT HELPS  |   for rent    | for an ego trip - and get kicked 
 you feel better!  I AM    | can pay cash  | out for a even bigger one.

More information about the ODE mailing list