private void manage(Entity e, float elapsedTime) {
    Model model = e.get(Model.class);
    if (!model.isCreated()) return;

    PlanarStance stance = e.get(PlanarStance.class);
    Spatial s = SpatialPool.models.get(e.getId());

    // translation
    s.setLocalTranslation(TranslateUtil.toVector3f(stance.getCoord().get3D(stance.getElevation())));

    // rotation
    Quaternion r = new Quaternion();
    Point3D pu = stance.getUpVector();
    Point3D pv = stance.getPlanarVector();
    Vector3f u = TranslateUtil.toVector3f(pu).normalize();
    Vector3f v = TranslateUtil.toVector3f(pv).normalize();
    r.lookAt(v, u);

    // we correct the pitch of the unit because the direction is always flatten
    // this is only to follow the terrain relief
    double angle = Math.acos(pu.getDotProduct(pv) / (pu.getNorm() * pv.getNorm()));
    r =
        r.mult(
            new Quaternion()
                .fromAngles(
                    (float) (-angle + AngleUtil.RIGHT + model.getPitchFix()),
                    (float) (model.getRollFix()),
                    (float) (model.getYawFix())));

    s.setLocalRotation(r);
  }
  private void manage(Entity e, float elapsedTime) {
    Physic ph = e.get(Physic.class);
    PlanarStance stance = e.get(PlanarStance.class);
    MotionCapacity capacity = e.get(MotionCapacity.class);

    Point2D velocityToApply = e.get(PlanarVelocityToApply.class).getVector();
    velocityToApply = velocityToApply.getMult(1 / ph.stat.mass);

    Point2D newVelocity = ph.velocity.getAddition(velocityToApply);
    newVelocity = newVelocity.getTruncation(capacity.maxSpeed);
    Point2D newCoord = stance.getCoord().getAddition(newVelocity.getMult(elapsedTime));

    setComp(e, new Physic(newVelocity, ph.stat, ph.spawnerException));
    setComp(
        e,
        new PlanarStance(
            newCoord, stance.getOrientation(), stance.getElevation(), stance.getUpVector()));
    setComp(e, new PlanarVelocityToApply(Point2D.ORIGIN));
  }