- if (glm::length2(state.vel) > 0.000001) {
- glm::dvec3 nvel(glm::normalize(state.vel));
- double ang = glm::angle(nvel, state.dir);
- double turn_rate = PI * 0.75 * dt;
- if (ang < turn_rate) {
- state.dir = glm::normalize(state.vel);
- } else if (std::abs(ang - PI) < 0.001) {
- state.dir = glm::rotate(state.dir, turn_rate, situation.GetPlanet().NormalAt(state.pos));
- } else {
- state.dir = glm::rotate(state.dir, turn_rate, glm::normalize(glm::cross(state.dir, nvel)));
+
+ if (!heading_manual && glm::length2(state.vel) > 0.000001) {
+ const glm::dvec3 normal(situation.GetPlanet().NormalAt(state.pos));
+ const glm::dvec3 tangent(state.vel - (normal * glm::dot(state.vel, normal)));
+ if (glm::length2(tangent) > 0.000001) {
+ heading_target = glm::normalize(tangent);