2015-05-29 5 views
2

В настоящее время я пытаюсь отображать данные MoCap из Mocap-Suit в Unity 3D в реальном времени. Suit SDK возвращает углы эйлеров для каждого захваченного сустава. Я надеялся, что могу просто взять эти углы Эйлера и передать их соответствующим суставам в Unity, установив атрибуты transform.localEulerAngles с захваченными углами Эйлера. Это работает довольно хорошо, но у меня есть некоторый Issus, когда я двигаю ногой вправо, аватар в Unity перемещает ногу влево.Euler Angle Conformation Transformation

Сначала я проверил, если захват SDK использует тот же эйлеров угол конвенции как единства:

Захват SDKs док говорит:

«Повороты все CCW глядя вниз ось вращения (в минус направление). Порядок углов Эйлера в каждом узле равен z, затем x, затем y , поэтому полная матрица вращения YXZ. "

Unitys док говорит:

«х, у, и углы Z представляют собой вращение Z градусов вокруг оси Z, X градусов вокруг оси х, и у градусов вокруг оси у (в указанном порядке) «.

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

Я также проверил, если SDK использует такое же определение для своей системы координат в качестве единицы:

Захват SDKs док говорит:

«Актер будет помещен стоя вдоль положительной оси Z с нижняя нога при Z = 0, обращенная вниз по оси минус Y, с положительной осью X, указывающей на право актера. Это правая система координат ».

Поскольку система координат Unitys по оси обращена к оси Y и X обращена вправо, я просто переключил координаты y и z при настройке атрибутов transform.localEulerAngles. Я знаю, что система координат Unitys левая. Должен ли я также учитывать это? Может ли это быть частью моей проблемы?

EDIT:

Я теперь провел Литт немного больше времени думать о том, что проблемы и сделал некоторые графики, чтобы получить лучшее понимание. Система координат, которая использует SDK выглядит следующим образом:

SDK coordinate system

аватар смотреть в направлении -y и порядок поворота углов Эйлера г, х, у.

А вот система координат в Unity:

Unity coordinate system

Олицетворение смотрит в направлении г. Ось z в единице эквивалентна оси -y sdk. То же самое относится к y, z и x, x. В результате этого я должен использовать значения z sdk для значений y в единице, отрицательные значения y из sdk для значений z в единице и значения x из sdk для моих значений x в единице.

После этого я думаю, что у меня есть еще одна проблема.Unity теперь применит поворот, сначала повернув вокруг оси z (которая была первоначально my -y осью в sdk), чем вокруг оси x (которая первоначально была моей осью x) и, наконец, вокруг оси y (первоначально ось z). Это означает, что в единстве исходная ось sdk вращается в следующем порядке: -y, x, z. На самом деле это не то, что я хочу сделать, так как я хочу повернуть в порядке z, x, y.

Я бы очень хотел знать, если мои мысли об этом правильны и если да, то каково было бы решение вернуться к правильному порядку вращения в Unity?

ответ

1

Ну, если я правильно его читаю, кажется, что они не то же самое, а одно - a righthanded matrix and the other a lefthanded matrix. Не можете ли вы просто построить их по-другому? Переключить значения z и y? Смотрите, помогает ли это?

+0

Право, я изменил значения z и y. Без этого я не получил бы никаких результатов, которые были бы почти usabel. Тем не менее, я думаю, что это нужно сделать только потому, что ось подъема sdks является осью z, а в единстве ось y является верхней. Может быть, мне нужно сделать что-то еще, чтобы преобразовать из правого в левую систему? – Averius

+0

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

+0

Я решился на это и пришел к тому, что мне действительно нужно отрицать значение y. Но я думаю, что есть еще одна проблема. Пожалуйста, взгляните на редактирование моего вопроса. – Averius