Есть задача рисовать объекты на земной поверности с помощью Qt5 и OpenGL. При этом систему координат, в которой находятся эти объекты можно описать так:
Направление линии визирования объекта задаётся углом азимута θ∈(0,360°) и углом места ψ∈(0,90°). Угол азимута отсчитывается от оси OY против часовой стрелки, если смотреть вдоль положительного направления оси OZ. Угол места отсчитывается от плоскости OXY. Логика самой программы работает в углах Эйлера и кватернионах, однако пользователю надо всё показывать в углах как описано выше. Таким образом, углы Эйлера перевожу в полярные координаты:
QVector2D CoordinateSystemGround::toPolar(const QVector3D& euler) const {
float z = euler.z();
if(z < 0.0f)
z += 360.0f;
return QVector2D(z, 90.0f - euler.x());
}
С этим кодом вроде проблем нет. А вот с переводом из полярных координат в углы Эйлера ничего не получается:
QVector3D CoordinateSystemGround::fromPolar(const QVector2D& polar) const {
float x = qDegreesToRadians(90.0f - polar.y());
float z = qDegreesToRadians(polar.x());
float y = qAtan(qTan(x) * qSin(z));
y = qRadiansToDegrees(y);
return QVector3D(90.0f - polar.y(), y, polar.x());
}
Вроде вращение начинается вокруг оси Z, но потом куда-то уходит в бок. Подскажите, куда копать?