X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fcreature%2Fcreature.cpp;h=085d70f000554bec57537f0b419b62f474ccb3eb;hb=3989da924c4e33c52f500aead5ae62bb40294781;hp=72d0b3f348e3c548ba55f6dcc00c52c6694408af;hpb=00f55d5b55ff993d2516f00f8d635887562983c7;p=blobs.git diff --git a/src/creature/creature.cpp b/src/creature/creature.cpp index 72d0b3f..085d70f 100644 --- a/src/creature/creature.cpp +++ b/src/creature/creature.cpp @@ -472,14 +472,13 @@ Situation::Derivative Creature::Step(const Situation::Derivative &ds, double dt) s.vel += ds.acc * dt; glm::dvec3 force(steering.Force(s)); // gravity = antinormal * mass * Gm / r² - double elevation = situation.GetPlanet().DistanceAt(s.pos); glm::dvec3 normal(situation.GetPlanet().NormalAt(s.pos)); force += glm::dvec3( -normal * Mass() * situation.GetPlanet().GravitationalParameter() - / (elevation * elevation)); + / glm::length2(s.pos)); // if net force is applied and in contact with surface - if (!allzero(force) && std::abs(std::abs(elevation) - situation.GetPlanet().Radius()) < 0.001) { + if (!allzero(force) && glm::length2(s.pos) < (situation.GetPlanet().Radius() + 0.01) * (situation.GetPlanet().Radius() + 0.01)) { // apply friction = -|normal force| * tangential force * coefficient glm::dvec3 fn(normal * glm::dot(force, normal)); glm::dvec3 ft(force - fn); @@ -550,7 +549,7 @@ void Creature::TickBrain(double dt) { } } -math::AABB Creature::CollisionBox() const noexcept { +math::AABB Creature::CollisionBounds() const noexcept { return { glm::dvec3(size * -0.5), glm::dvec3(size * 0.5) }; } @@ -927,6 +926,10 @@ bool Situation::OnSurface() const noexcept { return type == PLANET_SURFACE; } +bool Situation::OnGround() const noexcept { + return OnSurface() && glm::length2(state.pos) < (planet->Radius() + 0.05) * (planet->Radius() + 0.05); +} + glm::dvec3 Situation::SurfaceNormal() const noexcept { return planet->NormalAt(state.pos); } @@ -1059,6 +1062,10 @@ glm::dvec3 Steering::Force(const Situation::State &s) const noexcept { result += TargetVelocity(s, diff * std::min(dist * force, speed) / dist, force); } } + // remove vertical component, if any + const glm::dvec3 normal(c.GetSituation().GetPlanet().NormalAt(s.pos)); + result += normal * glm::dot(normal, result); + // clamp to max if (glm::length2(result) > max_force * max_force) { result = glm::normalize(result) * max_force; }