Преобразование углов Эйлера в координаты XYZ для VR

Фон

Я использую источник VTK KiwiViewer на своем мобильном устройстве, и я Я использую его для создания сцен VR с использованием облаков точек, где телефон пользователя действует как очки VR.

Я получаю attitude от CMDeviceMotion, который предоставляет мне Углы Эйлера для осей x, y и z (соответственно тангаж, крен и рыскание).

Я пытаюсь получить опыт работы с Google Cardboard, не используя Cardboard SDK. Причина в том, что Kiwi уже импортирует все модели, которые мне нужны для тестирования.

Сценарий

Kiwi использует систему координат на основе XYZ для положения камеры и точки фокусировки. Вот три объекта, с которыми вам нужно работать, чтобы позиционировать вид VR:

  • Фокус: xyz точки, на которую смотрит камера.
  • Положение камеры: xyz, где камера находится в трехмерном пространстве.
  • Камера вверх: относительный xyz для управления поворотом камеры.

На данный момент я всегда устанавливаю положение камеры на 0,0,0. Я использую _3 _ / _ 4_ с углами Эйлера * 10, чтобы разместить точку фокусировки на расстоянии 10 единиц от камеры. При установке положения камеры и точки фокусировки автоматически устанавливается подходящее правильное значение для параметра Поднятие камеры.

Установка точки фокусировки

x = -(sin(roll) * cos(pitch)) * 10;
y = cos(roll) * sin(pitch) * 10;
z = sin(yaw);

setCameraFocalPoint(x, y, z);

Вопрос

Моя текущая установка работает нормально, но имеет некоторые неприятные особенности. Как я могу настроить преобразование, чтобы получить более надежный опыт работы с виртуальной реальностью?


person Jacksonkr    schedule 06.06.2016    source источник


Ответы (1)


Вам нужно выяснить, для какого соглашения сделаны углы Эйлера (X * Y * Z является обычным явлением, но ваш SDK может использовать другое). Затем найдите соответствующую матрицу вращения. Направление вашего взгляда будет последним столбцом этой матрицы (или его обратным, если вы используете правосторонние системы координат). Направление вверх будет вторым столбцом.

Если ваш SDK позволяет вам установить матрицу вида напрямую, вы можете использовать транспонированную матрицу вращения (и добавить четвертую строку и столбец нулей и m44=1).

person Nico Schertler    schedule 07.06.2016
comment
Я воспользовался этим ответом, чтобы выполнить то, что вы здесь упомянули. Я пробовал все 6 упомянутых стилей матриц и все еще сталкиваюсь с аналогичными проблемами, когда они работают, но есть глюки. Любые идеи? - person Jacksonkr; 07.06.2016
comment
Вы уверены, что это не датчик? Вы тоже обновляете up-вектор? - person Nico Schertler; 07.06.2016
comment
Значения датчиков проверьте. Я не обновляю вектор камера вверх, так как это больше связано с ориентацией обзора. Я заметил, что некоторые значения варьируются от -PI до PI, дважды пересекая 0 за поворот на 360 градусов. На 180 VR камера поворачивается назад так же, как и пришла, что заставляет меня думать, что я получаю своего рода абсолютную ценность (не совсем, но, надеюсь, вы уловили мои мысли). - person Jacksonkr; 07.06.2016
comment
Вся эта процедура касается ориентации взгляда. Вам обязательно стоит настроить вектор вверх. Если вы сохраните вектор равным (0, 1, 0) или что-то в этом роде, вы получите числовую нестабильность, если направление взгляда приблизится к этому вектору. - person Nico Schertler; 07.06.2016
comment
Мне придется разобраться с этим достаточно скоро, так что я могу сделать это сейчас, следуя вашему совету. Чтобы создать вектор для cameraUp, я планирую взять перпендикулярную ориентацию экрана телефона. Мне любопытно, у вас есть рекомендация получше? - person Jacksonkr; 07.06.2016
comment
Да, возьмем второй столбец матрицы вращения. - person Nico Schertler; 07.06.2016
comment
Я пробовал XYZ, XZY, YXZ, YZX, ZXY, ZYX, взяв второй столбец из матрицы соответствующего порядка и применив его к камере вверх. Я могу сказать, что движение правильное, но каждый раз как минимум одна ось отключается. Есть идеи, что мне может не хватать? - person Jacksonkr; 08.06.2016
comment
Я попытался инвертировать z для своих 6 приказов как для положения камеры, так и для положения вверх, затем изолировал положение, затем вверх. Я знаю, что близок к этому, и был таким уже некоторое время, что меня все больше расстраивает. Возможно, мне придется отклеить кожу и начать все сначала. Тем не менее, спасибо за ваши многочисленные заметки и за ваше терпение, которое вы мне помогали; Не могу передать, насколько я это ценю. - person Jacksonkr; 09.06.2016