Какой самый простой способ выровнять ось Z с вектором?
Вопрос
Дана точка, такая как (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 " тот кажется, что вы хотите, или, возможно, обратное.