cpp
复制代码
#include <glm/glm.hpp>
#define _USE_MATH_DEFINES
#include <cmath>
namespace FastBVH
{
float RADIANS_PER_DEGREE = M_PI / 180.0;
// 定义地球半径的平方(可以用你自己的椭球模型)
const glm::dvec3 defaultRadiiSquared = glm::dvec3(6378137.0f * 6378137.0f, 6378137.0f * 6378137.0f, 6356752.3f * 6356752.3f);
class Cartesian3
{
public:
static glm::dvec3 fromRadians(double longitude, double latitude, double height)
{
const glm::dvec3 &radiiSquared = defaultRadiiSquared;
double cosLatitude = std::cos(latitude);
glm::dvec3 scratchN(cosLatitude * std::cos(longitude), cosLatitude * std::sin(longitude), std::sin(latitude));
scratchN = glm::normalize(scratchN);
glm::dvec3 scratchK = radiiSquared * scratchN;
double gamma = std::sqrt(dot(scratchN, scratchK));
scratchK = scratchK / gamma;
scratchN = scratchN * height;
return scratchK + scratchN;
}
static glm::dvec3 fromDegrees(double longitude, double latitude, double height)
{
longitude = longitude * RADIANS_PER_DEGREE;
latitude = latitude * RADIANS_PER_DEGREE;
return fromRadians(longitude, latitude, height);
}
};
}