3D вращение без тригонометрии? - PullRequest
1 голос
/ 29 октября 2011

Я разрабатываю алгоритм вращения вокруг оси в 3-х измерениях.Мои входные данные

  • ось, вокруг которой я вращаюсь, как вектор от моей центральной точки
  • центральная точка (очевидно)
  • угол, который я хочу повернутьоколо
  • моя текущая позиция

Мне интересно, есть ли способ сделать это без тригонометрии, только с помощью векторных операций.У кого-нибудь есть потенциальное решение?

РЕДАКТИРОВАТЬ: Есть ли способ, которым я мог бы поворачиваться на pi / 4 радиана (45 градусов) каждый раз, вместо введенного угла тета?Это может немного упростить вещи, я не знаю.

Ответы [ 4 ]

7 голосов
/ 29 октября 2011

Повороты по своей природе хорошо описаны \sin и \cos.

Это удобный трюк, когда единицы кватернион s представляют 3-D вращения точно так же, как (ив некотором смысле лучше, чем) матрицы вращения.Преобразование вращения на угол \theta вокруг нормальной оси image">, где x^2+y^2+z^2=1, требует немного тригонометрии: \left(\cos\left(\frac12\theta\right)\right)+\left(x\sin\left(\frac12\theta\right)\right)i+\left(y\sin\left(\frac12\theta\right)\right)j+\left(z\sin\left(\frac12\theta\right)\right)k.

Но с этого момента это простая арифметика.Кватернион q=a+bi+cj+dk может быть непосредственно применен для поворота вектора с помощью q(xi+yj+zk)q^{-1} или преобразован в матрицу вращения \left(\begin{matrix}a^2+b^2-c^2-d^2&2bc-2ad&2bd+2ac\2bc+2ad&a^2-b^2+c^2-d^2&2cd-2ab\2bd-2ac&2cd+2ab&a^2-b^2-c^2+d^2\end{matrix}\right).

Конечно, это вращение вокруг начала координат.Чтобы повернуть вокруг произвольной точки o в пространстве, просто переведите на -o в начало координат, поверните, а затем переведите на o для возврата.

2 голосов
/ 29 октября 2011

Если это какая-то глупая домашняя задача, вы можете использовать приближение Тейлора функций синуса / консины. Является ли это "считается" тригонометрией, я думаю, для обсуждения. Затем вы можете использовать эти значения в матрице вращения или четвертичной шкале, если хотите использовать векторные операции.

Но опять же, для этого нет практической причины.

2 голосов
/ 29 октября 2011
1 голос
/ 31 октября 2011

Существуют ли другие методы, которые не используют функции триггера?Возможно, но нет известных эффективных, общих (то есть для произвольных углов) способов выполнения поворотов без использования функций триггера.

Однако, основываясь на вашем редактировании, вы можете предварительно вычислить sin и cosдля коллекции интересующих вас углов и сохраните их в справочной таблице.Вам не нужно ограничиваться в таких обстоятельствах π/4 приращениями, но вы можете делать π/256 или π/1024 приращения, если хотите.Кроме того, вам не нужны две таблицы, так как cos(θ) = sin(θ+π/2).

Оттуда вы можете использовать любой из нескольких методов интерполяции, чтобы включить простое округление, линейную интерполяцию или некоторую полиномиальную интерполяцию на основе вашегоneeds.

Затем вы будете использовать преобразование на основе матрицы или кватерниона для вычисления повернутого вектора.

Это будет быстрее, чем вычисление sin и cos для общих углов, хотяпотребует некоторого дополнительного пространства, а также будет штраф за точность.Но если это удовлетворяет ваши потребности ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...