Remap оси вращения? - PullRequest
       26

Remap оси вращения?

1 голос
/ 11 октября 2011

Я использую устройство ввода (только отслеживаемое вращение, а не положение) для ввода и отправляю его матрицу вращения в приложение OpenGL.Трекер отправляет идентификационную матрицу, когда он выровнен с его системой осей, т.е. когда трекер направлен к своей оси Y, а направление вверх трекера направлено к его оси Z.Как видно на правой стороне иллюстрации.

Axis Systems Diagram

Однако, если я поворачиваю трекер, соответствующее вращение в моей программе opengl неверно.Чтобы попытаться исправить то, что я пытался умножить матрицу, предоставленную трекером, на:

  1  0  0  0
  0  0  1  0
  0 -1  0  0
  0  0  0  1 

Чтобы переназначить, но, что бы я ни пытался, кажется, что всегда одно из трех вращений неверно.

Есть ли какая-нибудь матрица, на которую я мог бы умножить матрицу моего трекера, чтобы получить правильные вращения?

===== РЕДАКТИРОВАТЬ =====

remapCoordinateSystem Android, кажется, достигает того, чтохочу, но я не могу понять код там: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/hardware/SensorManager.java#L1459

Ответы [ 3 ]

1 голос
/ 17 октября 2011

Следующее работало, чтобы перевести матрицу для правильной работы с OpenGL.

//orientation is the tracker's rotation matrix
orientation = glm::rotate(orientation, glm::degrees((float)M_PI/2),vec3(1,0,0));
orientation = glm::inverse(orientation);
orientation = glm::rotate(orientation, glm::degrees((float)M_PI/2),vec3(1,0,0));

Я не знаю, почему она работала, но она работала.

0 голосов
/ 12 октября 2011

Из комментариев я понял, что вы правильно понимаете матрицу вращения, но хотите, чтобы вращение происходило на другой оси.Например, ваша матрица вращается вокруг z, но вы хотите, чтобы она была около x.

Чтобы сделать это, у вас есть много способов.

Один из них заключается в том, чтобы сделать вращения прямо во-первых,Например, если с вашего устройства вы получаете, что вращение должно быть вокруг z, но в вашей программе вы хотите отобразить его на x, ну вместо того, чтобы вращать вокруг z, вращайте его вокруг x !!Что-то вроде

glRotatef(rot_z, 1, 0, 0);

Так что, если данные, которые вы получаете, будут такими:

data[] = {data_about_x, data_about_y, data_about_z}

, у вас будет такая карта:

data_map[] = {2, 0, 1}

При вращениинапишите:

glRotatef(data[data_map[0]], 1, 0, 0)

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

axis_map[][3] = {{0, 1, 0}, {0, 0, 1}, {1, 0, 0}}

Затем напишите:

glRotatef(data[2], axis_map[2][0], axis_map[2][1], axis_map[2][2]);
0 голосов
/ 11 октября 2011

Я думаю, вам следует попробовать использовать вычисления Quaternion, поскольку трекер может вращаться вдоль его текущих («мгновенных», скажем так) осей.Итак, окончательное вращение будет суммой всех вращений, выполненных трекером, я думаю.

Или я просто не понял значение вашего "трекера" terminus =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...