Как я могу определить, является ли матрица вида левой или правой рукой? - PullRequest
4 голосов
/ 16 декабря 2010

У меня есть матрица вида камеры, которую я получил из программы GL. Я знаю , что эта матрица предназначена для правой руки, поскольку именно так работает GL, но как я могу проверить, является ли эта матрица правой или левой рукой программно?

Для матрицы проекции я проверяю, положительна ли матрица [3] [4] (главная строка), чтобы увидеть, если она левша. Это правильно?

Спасибо.

EDIT

Я пробовал решение для детерминанта, но, к сожалению, это не так (по крайней мере, согласно моим экспериментам):

Я использовал математические функции DX9 для проверки (чтобы избежать возможных ошибок в моем коде). Я запустил следующий код:

 D3DXVECTOR3 vEye(0,0,0);
 D3DXVECTOR3 vTarget(6,3,0);
 D3DXVECTOR3 vUp(0,0,1);

 D3DXMATRIX matViewLH;
 D3DXMATRIX matViewRH;

 D3DXMatrixLookAtLH(&matViewLH, &vEye, &vTarget, &vUp);
 D3DXMatrixLookAtRH(&matViewRH, &vEye, &vTarget, &vUp);

 float fLHDet = D3DXMatrixDeterminant(&matViewLH);
 float fRHDet = D3DXMatrixDeterminant(&matViewRH);

И два детерминанта были равны (оба равны 0,999999994) и, очевидно, имели один и тот же знак.

Что касается моей проблемы - поскольку я получаю и матрицу вида, и матрицу проекции, и мне относительно легко проверить, является ли матрица проекции LH или RH - я использую эту информацию для идентификации системы координат.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

Вы должны взять определитель матрицы.При прочих равных условиях матрицы для левшей и правшей должны иметь детерминанты с противоположными знаками.

Это немного странно, потому что «левша» и «правша» в значительной степени произвольные соглашения.Но матрицы, которые отражают мир как зеркало, имеют отрицательные детерминанты, поэтому умножение на такую ​​матрицу изменит знак определителя.


Редактировать (см. Обновленный OQ): Я подозреваю разницу междуФункции D3DX*LH() и D3DX*RH() состоят в том, что они поддерживают 2 различных соглашения.

Если это так, вы должны знать, что «левша» и «правша» не является атрибутом каждой отдельной матрицы, но о том, как матрицы, порожденные этими наборами функций, сочетаются друг с другом.Если вы придерживаетесь функций *LH(), все должно работать правильно;аналогично с функциями *RH() - но если вы их смешаете, вы, скорее всего, получите неожиданные результаты.

В любом случае ни одно из этих соглашений не имеет отношения к GL, который имеет свой собственный набор соглашений, а неполностью совместим с любым из D3D.Например, соглашение GL для ограничения Z отличается от D3D;это означает, что матрица проекции для создания одного и того же вида обязательно будет отличаться в разных системах.

Итак, краткий ответ на ваш вопрос «вероятно, ни один».

0 голосов
/ 13 января 2016

Просто связал эту же задачу (только для обнаружения зеркально преобразованных объектов), нашел простое решение, поделился им.Если матрица имеет деталь 3х3, содержащую 3 перпендикулярные оси, то вы можете просто сделать перекрестное произведение осей 1 и 2, а затем сделать скалярное произведение этого результата и оставшейся 3-й оси.Проверьте, является ли он отрицательным или положительным - вы можете решить, правая / левая / зеркальный объект или нет.Если я правильно понял вопрос ...

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