Повернуть геометрию, чтобы выровнять вектор направления

Я пытался привести свою сгенерированную геометрию в соответствие с вектором направления. Чтобы проиллюстрировать мою текущую проблему:

  • A = правильно выровненная геометрия (просто треугольник для тестирования)
  • B = неправильно выровненная геометрия

Пример проблемы

Мое текущее решение в коде для этого примера треугольника (этот код запускается для всех узлов, которые вы видите на экране, начиная с разделения, я использую математическую библиотеку 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:

  • х 0,000000000 плавать
  • y 0.788205445 float
  • z 0.615412235 float

Значения вектора направления для точки B:

  • х 0.0543831661 плавать
  • y 0.788205445 float
  • z-0,613004684 float

Изменить 1 (24/11/2013 @ 20:36):
A и B не имеют никакого отношения, оба генерируются отдельно. При генерации A или B известны только положение и направление.

Я искал решения, размещенные здесь:

Но мне не удалось успешно повернуть мою геометрию, чтобы выровнять ее вектор направления. Я чувствую, что делаю что-то довольно простое неправильно.

Любая помощь будет принята с благодарностью!

0

Решение

Если 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 будет преобразование, которое вы хотите.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]