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

0

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

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

Изображение 174551

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

  • x 0,000000000 поплавок
  • y 0.788205445 float
  • z 0.615412235 float

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

  • x 0.0543831661 float
  • y 0.788205445 float
  • z -0.613004684 float

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

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

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

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

Теги:
3d
geometry
glm-math
rotational-matrices

1 ответ

2

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

  • 0
    Проблема здесь в том, что A & B не имеют никакого отношения и не могут быть использованы таким образом. При генерации треугольника в точке A или B известны только положение и направление. Я уточню свой вопрос в верхней части, чтобы включить это.
  • 1
    @ Йонатан, мой друг, это абсолютно бессмысленно. Вы должны объяснить, какая точка и вектор должны быть переведены и / или повернуты в какую-либо другую точку и вектор (или эквивалентное описание преобразования).
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню