- const glm::dmat3 srf(world::Planet::SurfaceOrientation(situation.Surface()));
- return glm::translate(glm::dvec3(pos.x, pos.y, pos.z + half_size))
- * glm::rotate(glm::orientedAngle(-srf[2], situation.Heading(), srf[1]), srf[1])
- * glm::dmat4(srf);
+ glm::dmat3 orient;
+ orient[1] = situation.GetPlanet().NormalAt(pos);
+ orient[2] = situation.Heading();
+ if (std::abs(dot(orient[1], orient[2])) > 0.999) {
+ orient[2] = glm::dvec3(orient[1].z, orient[1].x, orient[1].y);
+ }
+ orient[0] = normalize(cross(orient[1], orient[2]));
+ orient[2] = normalize(cross(orient[0], orient[1]));
+ return glm::translate(glm::dvec3(pos.x, pos.y, pos.z))
+ * glm::dmat4(orient)
+ * glm::translate(glm::dvec3(0.0, half_size, 0.0));