Нахождение спина сферы по векторам X, Y и Z относительно сферы - PullRequest
3 голосов
/ 14 ноября 2009

Я использую Electro в Lua для некоторых 3D-симуляций и сталкиваюсь с чем-то вроде математической / алгоритмической / физической проблемы.

Я пытаюсь выяснить, как я могу найти «вращение» сферы сферы, которая вращается на некоторой оси. Под «вращением» я подразумеваю вектор вдоль оси, на которой вращается сфера с величиной относительно скорости, с которой она вращается. Причина, по которой мне нужна эта информация, заключается в возможности замедлить вращение сферы, применяя обратный крутящий момент к сфере, пока она не перестанет вращаться.

Единственная информация, к которой у меня есть доступ, - это единичные векторы X, Y и Z относительно сферы. То есть в каждом кадре я могу вызывать три разные функции, каждая из которых возвращает единичный вектор, указывающий в направлении локальных осей X, Y и Z модели сферы соответственно. Я могу отслеживать, как каждый из них изменяется, по сути сохраняя «предыдущее» значение каждого вектора и сравнивая его с «новым» значением в каждом кадре. Тогда возникает вопрос: как бы я использовал эту информацию для определения вращения сферы? Я в тупике.

Любая помощь будет великолепна. Спасибо!

Ответы [ 2 ]

8 голосов
/ 14 ноября 2009

Мой первый ответ был неверным. Это мой отредактированный ответ.

Ваши единичные векторы X, Y, Z можно объединить в матрицу 3x3:

A = [[x1 y1 z1],
     [x2 y2 z2],
     [x3 y3 z3]]

Поскольку X, Y, Z изменяются со временем, A также изменяется со временем.

A - это матрица вращения! В конце концов, если вы позволите i = (1,0,0) быть единичным вектором вдоль оси x, то A i = X, так что А поворачивает i в X. Аналогично, он поворачивает ось Y в Y и Ось Z в Z.

A называется матрицей направляющих косинусов (DCM).

Таким образом, используя формулу оси DCM к Эйлеру

Вычислить

theta = arccos((A_11 + A_22 + A_33 - 1)/2)

тета - угол поворота Эйлера.

Величина угловой скорости, | w |, равна

w = d(theta)/dt ~= (theta(t+dt)-theta(t)) / dt

Ось вращения задается как e = (e1, e2, e3), где

e1 = (A_32 - A_23)/(2 sin(theta))
e2 = (A_13 - A_31)/(2 sin(theta))
e3 = (A_21 - A_12)/(2 sin(theta))
0 голосов
/ 15 ноября 2009

Я аплодирую ~ unutbu's, ответ, но я думаю, что есть более простой подход, который будет достаточен для этой проблемы.

Возьмите вектор единиц X в трех последовательных кадрах и сравните их, чтобы получить две дельты:

deltaX1 = X2 - X1
deltaX2 = X3 - X2

(Это векторные уравнения. X1 - это вектор, вектор X в момент времени 1, а не число.)

Теперь возьмите перекрестное произведение дельт, и вы получите вектор в направлении вектора вращения.

Теперь для величины. Угол между двумя дельтами - это угол, выделенный за один промежуток времени, поэтому используйте скалярное произведение:

dx1 = deltaX1/|deltaX1|
dx2 = deltax2/|deltaX2|
costheta = dx1.dx2
theta = acos(costheta)
w = theta/dt

Ради точности вы должны выбрать единичный вектор (X, Y или Z), который больше всего меняется.

...