Я пытался привести свою сгенерированную геометрию в соответствие с вектором направления. Чтобы проиллюстрировать мою текущую проблему:
Мое текущее решение в коде для этого примера треугольника (этот код запускается для всех узлов, которые вы видите на экране, начиная с разделения, я использую математическую библиотеку 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 известны только положение и направление.
Я искал решения, размещенные здесь:
Но мне не удалось успешно повернуть мою геометрию, чтобы выровнять ее вектор направления. Я чувствую, что делаю что-то довольно простое неправильно.
Любая помощь будет принята с благодарностью!
Если A
а также B
являются единичными векторами, и вы хотите матрицу вращения R
это превращает B
так что он совпадает с A
, а затем начать с вычисления C = B x A
(перекрестный продукт B
а также A
). C
ось вращения, а arcsin(|C|)
необходимый угол поворота
Из них вы можете построить необходимую матрицу вращения. Это выглядит как glm
имеет поддержку для этого, поэтому я не буду объяснять дальше.
Примечание: если вы делаете много, много из этого в критически важном для кода коде, вы можете набрать немного скорости, отметив |C| = sin(theta), sqrt(1 - |C|^2) = cos(theta)
и вычисляя матрицу самостоятельно с этими известными значениями sin(theta)
а также cos(theta)
, Для этого см. Например это обсуждение. glm
рутина будет принимать ваш угол arcsin(|C|)
и сразу приступить к вычислению его sin
а также cos
, небольшой отход, так как вы уже знали это, и операции относительно дороги.
Если вращение около какой-то точки p
кроме происхождения, то пусть T
быть переводом, который требует p
к происхождению, и найти X = T^-1 R T
, это X
будет преобразование, которое вы хотите.
Других решений пока нет …