2009-11-14 6 views
3

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

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

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

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

+0

Является ли это только мной, или он может вращаться на более чем одной оси одновременно? То есть «спиновый вектор» может быть не таким простым? – jtbandes

+1

Достаточно одного вектора спина. даже если он, кажется, вращается вокруг нескольких осей, результирующим из них будет вектор спина. И наоборот, один вектор спина может быть разделен на спиновые компоненты вдоль независимых осей. – sykora

+0

«Спины» объединятся. Попробуйте захватить ближайший сферический объект и поверните его вдоль оси X (то есть горизонтальной оси). Затем поверните его вдоль оси z (то есть ось, идущая прямо от вас). Тогда сделайте все возможное, чтобы сделать оба одновременно. Теперь вы заметите, что он вращается вдоль оси 45 градусов между осями x и z. –

ответ

8

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

ФАКСЕ векторы Х, Y, Z могут быть объединены, чтобы сформировать матрицу 3х3:

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

Так как X, Y, Z изменение со временем, А также изменяется со временем.

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

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

Так используя DCM to Euler axis formula

Вычислительный

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

тета является углом Эйлера вращения.

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

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

Ось вращения задается е = (е1, е2, е3), где

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

Точно верно. +1 –

+0

Ты спас меня от печатного ужасного ответа. +1. – sykora

+0

Отлично! Благодаря! –

0

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

Возьмите вектор 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), который изменяет большинство.

+0

Исправьте меня, если я ошибаюсь, но я думаю, что это решение может пострадать от той же проблемы, с которой страдает предыдущее решение ~ unutbu, т. е. это предполагает, что X (или любая другая ось выбрана) находится на экваторе единичной сферы. Это означает, что ось вращения будет рассчитываться как перпендикулярная выбранной оси, что может и не обязательно иметь место. Проблема может быть частично устранена путем выбора оси, которая больше всего изменяется (т. Е. Оси, ближайшей к экватору), но это не будет точным решением. –

+0

Теперь, когда я думаю об этом больше, вы, возможно, в конце концов. 7:30 утра никогда не бывает подходящим для меня временем.: -/ –

+0

Вычисленная ось вращения не будет (обязательно) перпендикулярна X, она будет перпендикулярна к * изменению * в X, что является правильным. Если вы не можете ждать двух временных интервалов, вы можете сделать это в одном, используя тот факт, что он должен быть перпендикулярен к изменению X и изменению Y ... Подумайте об этом, это довольно хороший метод. – Beta

 Смежные вопросы

  • Нет связанных вопросов^_^