2

Я работаю над проектом оценки головы, используя 2 камеры. Для одной камеры система работает и возвращает матрицу вращения и вектор трансляции головки относительно каждой системы координат камеры. Я отобразил объект в сцене OpenGL, который повернут и переведен для представления движений головы. Для отображения вычисленной матрицы поворота и вектора перевода я просто использую следующие команды OpenGL.Оценка состояния головы с помощью 2-х камер

glMatrixMode(GL_MODELVIEW); 
glLoadMatrixd(pose_matrix); 

где матрица позы - это модель OpenGL ModelView, построенная из матрицы поворота и вектора переноса головы.

Теперь я пытаюсь сделать это для 2 откалиброванных камер. Когда первая камера потеряла дорожку лица, а вторая оценивает позу головы, я показываю поворот и перевод по отношению ко второму и наоборот. Я хочу отобразить один объект OpenGl и переместить его для обоих случаев. Для этого мне нужно перенести матрицы позы в общую систему координат.

Я знаю относительную геометрию двух камер относительно друг друга. Я предполагаю, что одна из камер является мировой координатной рамкой, и я переношу матрицу представления головы второй камеры в кадр первой камеры, умножая матрицу позы и матрицу калибровки второй камеры относительно первой камеры. Когда я загружаю эту умноженную матрицу в матрицу OpenGL ModelView, я получаю неправильные результаты. Когда первая камера захватывает лицо, объект движется вправо, но для второго объекта камеры передается и поворачивается и не находится в том же месте, что и в случае первой камеры.

В чем может быть проблема? Может быть, часть отображения OpenGL неверна или?

ответ

0

Безопасное предположение по умолчанию: OpenGL прав, ваш код неверен.

Не видя своего кода, я могу предложить распечатать ваши матрицы и дважды проверить математику с ними в Matlab или Octave.

Общей ошибкой является то, что по умолчанию OpenGL PRE-умножает ROW-векторы на матрицу modelvie (действительно, все матрицы). То есть, он умножается как v_row * M с матрицей, хранящейся в col-major порядке, тогда как вы можете думать в общем математическом соглашении об обработке векторов как COLUMN, а POST-умножать их как M * v_col (при сохранении M строка-мажор).

Если вы предпочитаете работать с последним соглашением (рекомендуется), посмотрите вверх по расширению GL_ARB_transpose_matrix.