Какой самый простой способ выровнять ось Z с вектором?

StackOverflow https://stackoverflow.com/questions/193918

Вопрос

Дана точка, такая как (0, 0, 0), и вектор, подобный (x, y, z). Как проще всего выровнять отрицательную ось Z с центром в (0, 0, 0) так, чтобы она указывала в направлении этого вектора? Примеры использования OpenGL приветствуются, но не обязательно.

Это было полезно?

Решение

Есть много разных способов поворота координатной рамки, чтобы указать в заданном направлении; все они оставят ось z направленной в нужном вам направлении, но с различными вариантами ориентации осей x и y.

Следующее дает вам кратчайшее вращение, которое может или не может быть тем, что вы хотите.

vec3 target_dir = normalise( vector );
float rot_angle = acos( dot_product(target_dir,z_axis) );
if( fabs(rot_angle) > a_very_small_number )
{
    vec3 rot_axis = normalise( cross_product(target_dir,z_axis) );
    glRotatef( rot_angle, rot_axis.x, rot_axis.y, rot_axis.z );
}

Другие советы

Возможно, вы захотите взглянуть на статью Дианы Грубер

Чтобы ответить на мой собственный вопрос, лучший ответ, который я придумал, это:

Разделите вектор на «компоненты». Компонент х - это смещение вдоль оси х. Если мы обратимся к тригонометрии, то получим, что cos (alpha) = x / vector_magnitude. Если мы вычислим RHS, то получим альфа, то есть величину, на которую нам нужно будет вращаться вокруг оси y.

Тогда систему координат можно выровнять по вектору с помощью серии вызовов glRotatef ()

Существует множество ресурсов о вращении ваших координат (или вращении объектов, что составляет одно и то же). Я многому научился на этом сайте , и о том, как программировать на несколько измерений и особенно как манипулировать векторами

На странице здесь есть раздел " Преобразования для перемещения вектор к оси z " тот кажется, что вы хотите, или, возможно, обратное.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top