В настоящее время я пытаюсь отображать данные 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 выглядит следующим образом:
аватар смотреть в направлении -y и порядок поворота углов Эйлера г, х, у.
А вот система координат в Unity:
Олицетворение смотрит в направлении г. Ось 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?
Право, я изменил значения z и y. Без этого я не получил бы никаких результатов, которые были бы почти usabel. Тем не менее, я думаю, что это нужно сделать только потому, что ось подъема sdks является осью z, а в единстве ось y является верхней. Может быть, мне нужно сделать что-то еще, чтобы преобразовать из правого в левую систему? – Averius
Ну, если вы точно отражаетесь, вы можете просто повернуть его с минусом для всех новых значений. Так что вместо того, чтобы добавить 20 к вращению, требуется 20 поворот. – ILiveForVR
Я решился на это и пришел к тому, что мне действительно нужно отрицать значение y. Но я думаю, что есть еще одна проблема. Пожалуйста, взгляните на редактирование моего вопроса. – Averius