Я пытаюсь привести свою сгенерированную геометрию в соответствие с вектором направления. Чтобы проиллюстрировать мою текущую проблему:
Мое текущее решение в коде для этого примера треугольника (этот код запускается для всех узлов, которые вы видите на экране, начиная с разделения, я использую математическую библиотеку GLM):
glm::vec3 v1, v2, v3;
v1.x = -0.25f;
v1.z = -0.25f;
v2.x = 0.25f;
v2.z = -0.25f;
v3.x = 0.0f;
v3.z = 0.25f;
v1.y = 0.0f;
v2.y = 0.0f;
v3.y = 0.0f;
glm::mat4x4 translate = glm::translate(glm::mat4x4(1.0f), sp.position);
glm::mat4x4 rotate = glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), sp.direction, glm::vec3(0.0f, 1.0f, 0.0f));
v1 = glm::vec4(translate * rotate * glm::vec4(v1, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z);
v2 = glm::vec4(translate * rotate * glm::vec4(v2, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z);
v3 = glm::vec4(translate * rotate * glm::vec4(v3, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z);
Значения вектора направления для точки A:
Значения вектора направления для точки B:
Редактировать 1 (24/11/2013 @20:36): A и B не имеют никакого отношения, оба генерируются отдельно. При создании А или В известно только положение и направление.
Я рассматривал решения, размещенные здесь:
Но мне не удалось успешно повернуть мою геометрию, чтобы выровнять ее с моим вектором направления. Я чувствую, что делаю что-то довольно простое.
Любая помощь будет принята с благодарностью!
Если A
и B
являются единичными векторами и вам нужна матрица вращения R
которая преобразует B
так, что она выравнивается с A
, тогда начните с вычисления C = B x A
(перекрестное произведение B
и A
). C
- ось вращения, а arcsin(|C|)
- необходимый угол поворота.
Из этого вы можете построить необходимую матрицу вращения. Похоже, у glm
есть поддержка для этого, поэтому я не буду объяснять дальше.
NB, если вы делаете много, многие из них в критическом для производительности коде, вы можете получить немного скорости, отметив |C| = sin(theta), sqrt(1 - |C|^2) = cos(theta)
|C| = sin(theta), sqrt(1 - |C|^2) = cos(theta)
и вычисляя матрицу самостоятельно с этими известными значениями sin(theta)
и cos(theta)
. Для этого см., Например, это обсуждение. Процедура glm
примет ваш угол arcsin(|C|)
и немедленно начнет вычислять его sin
и cos
, небольшие отходы, так как вы уже знали об этом, и операции относительно дороги.
Если поворот около некоторой точки p
отличной от начала координат, то пусть T
- это перевод, переводящий p
в начало координат, и найдем X = T^-1 RT
. Этот X
будет преобразованием, которое вы хотите.