Какой самый простой способ выровнять ось Z с вектором? - PullRequest
4 голосов
/ 11 октября 2008

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

Ответы [ 5 ]

14 голосов
/ 11 октября 2008

Существует множество различных способов поворота системы координат, чтобы она указывала в заданном направлении; все они оставят ось 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 );
}
1 голос
/ 06 июля 2009

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

1 голос
/ 11 октября 2008

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

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

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

0 голосов
/ 05 ноября 2008

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

0 голосов
/ 11 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...