Геометрия Direct3D: матрица вращения из двух векторов - PullRequest
1 голос
/ 13 ноября 2008

Учитывая два трехмерных вектора A и B, мне нужно получить матрицу вращения, которая вращается от A до B.

Вот что я придумал:

  1. Получите косинус от acos (A. B)
  2. Получите синус от asin (| A x B | / (| A | * | B |))
  3. Используйте A x B в качестве оси вращения
  4. Использовать матрицу, указанную в нижней части этой страницы (угол оси)

Это прекрасно работает, за исключением поворотов на 0 & deg; (что я игнорирую) и 180 °; (который я рассматриваю как особый случай). Есть ли более изящный способ сделать это с помощью библиотеки Direct3D? Я ищу конкретный ответ для Direct3D.

Редактировать: Удалены acos и asin (см. Пост Хью Аллена )

Ответы [ 4 ]

2 голосов
/ 13 ноября 2008

Нет, вы делаете это наилучшим образом. Я не думаю, что есть встроенная функция DirectX, которая делает то, что вы хотите. Для шага 4 вы можете использовать D3DXMatrixRotationAxis(). Просто будьте осторожны с крайними случаями, например, когда | A | или | B | равен нулю или когда угол равен 0 ° или 180 °.

1 голос
/ 13 ноября 2008

Вы можете посмотреть следующую статью из siggraph текст ссылки

1 голос
/ 13 ноября 2008

Вероятно, это скорее опечатка, чем Thinko, но acos (A.B) - это угол, а не его косинус. Аналогично для пункта 2.

Вы можете вычислить грех по cos, используя sin ^ 2 + cos ^ 2 = 1. То есть sin = sqrt (1-cos * cos). Это будет дешевле, чем векторное выражение, которое вы используете, а также исключит специальные случаи для 0/180 градусов.

0 голосов
/ 17 ноября 2009

Может быть, вы можете использовать D3DXMatrixLookAtLH?

...