[ODE] Trouble balancing "hover" rays over very short distances

Jon Watte hplus-ode at mindcontrol.org
Fri Feb 4 12:00:28 MST 2005


  // Grab out the data for the sensor
  vector3 sensorPos, pushDir;
  sensorList->Get(sensorPos, pushDir);

Is pushDir normalized at this point?

  // Grab the relevant portion of the current velocity
  vector3 curVelocity = nOpende::BodyGetLinearVel(this->tempBodyID);
  vector3 velDir = curVelocity;
  velDir.norm();
  float relevantVel = curVelocity.len() * (velDir.dot(pushDir));

If not, then the dot won't give you a normalized result.
Also, because velDir is not normalized, you don't need to 
multiply by velocity length again -- that will give you a 
vector of magnitude squared.


  Any suggestions are welcome.  The best idea I've got at the moment is
  to decide that repulsors at that distance are pretty useless anyways
  (they don't provide enough distance between the ground and character
  to allow significantly more mobility than if the character's geom were
  just dragging on the ground), and just not use them at distances below
  0.5.

You clearly want to limit the amount of force you can apply 
in a single step. For me, 0.5 units is about a foot and a half, 
though, so that would be a pretty normal distance -- it would 
help if you told us what your units are! (inches?)


I would formulate the repulsor spring using the same predictive 
feedback control system that I recommend for most things :-) 
Figure out where you want to be; where you are; where you're 
going, and apply a force that makes you be where you want to be 
some time in the future (like, at least 3-4 steps in the future).

After all, character leg strength is not such that they can jump 
from kneeling to standing in one time step, unless your time step 
is really large.

You can do most of what you want with pure scalars, too. Something 
like this:

  d = distanceAboveGround();
  g = desiredDistanceAboveGround();
  v = currentVelocity() dot up();
  t = d + v * PREDICTION_TIME;
  f = (g - t) / PREDICTION_TIME * bodyMass();
  clampMagnitude( f, 0, MAX_LEG_STRENGTH );
  addScaledForce( f, up() );

Cheers,

			/ h+




More information about the ODE mailing list