Конвертировать декартовы мировые координаты в сферические локальные координаты в OpenGL - PullRequest
0 голосов
/ 31 января 2020

Моя проблема заключается в следующем: я хочу получить сферические координаты точки B в кадре точки A . У меня есть доступ к координатам декартового мира точки A , координатам декартового мира точки B и кватерниону, описывающему вращение точки A * 1010. * относительно мировой системы отсчета (так называемый «кватернион ориентации» или «кватернион ориентации»).

Пока что я использую этот код (в математической библиотеке OpenGL, glm) :

#define U glm::dvec3(1.0, 0.0, 0.0)
#define V glm::dvec3(0.0, 1.0, 0.0)
#define W glm::dvec3(0.0, 0.0, 1.0)

glm::dvec3 cart_to_local(glm::dvec3 B_position) {
    glm::dvec3 e1 = A_rotation_quaternion * U;
    glm::dvec3 e2 = A_rotation_quaternion * V;
    glm::dvec3 e3 = A_rotation_quaternion * W;

    glm::mat3 transition_matrix(e1.x, e1.y, e1.z, e2.x, e2.y, e2.z, e3.x, e3.y, e3.z);

    glm::mat3 reverse_transition_matrix = glm::inverse(transition_matrix);

    glm::dvec3 v = B_position - A_position;
    return reverse_transition_matrix * v;
}

Затем я преобразовываю декартовы координаты в сферические координаты, используя хорошо известные формулы (включая acos, atan2 и т. Д.).

Это работает, но для меня это выглядит как будто здесь слишком много шагов. Есть ли способ сделать этот код «меньшим», используя больше стандартных функций, о которых я не знаю?

1 Ответ

0 голосов
/ 31 января 2020

Я не проверял это, но вы должны быть в состоянии сделать:

glm::dvec3 cart_to_local(glm::dvec3 B_position) {
    glm::dvec3 v = B_position - A_position;
    return glm::inverse(A_rotation_quaternion) * v;
}
...