OpenGL, отображение координат мира в объект? (обратная матрица)

Приветствую всех,

Как видно на изображении,

альтернативный текст

У меня есть объект с именем O (набор полос). Его система координат объекта (x', y', z'). Я перевожу, поворачиваю этот объект в своей сцене OpenGL, используя следующий фрагмент кода:

glPushMatrix();
 glTranslatef(Oz, Oy,Oz);
 glRotatef(rotationX , 1.0, 0.0, 0.0);  
 glRotatef(rotationY, 0.0, 1.0, 0.0);
 glRotatef(rotationZ, 0.0, 0.0, 1.0); 
contour->render();
glPopMatrix()

;

У меня есть точка с именем H , которая переводится в мировые координаты (hx,hy,hz) с использованием

glPushMatrix();
 glTranslatef(hx,hy,hz);
glPopMatrix();

Если я прав, (Oz,Oy,Oz) и (hx,hy,hz) — мировые координаты.

Теперь я хочу вычислить положение H (hx, hy, hz) относительно системы координат объекта O. (x', y', z'); Как я понял, это можно сделать, вычислив обратные преобразования объекта O и применив их к точке H.

Любые советы по этому поводу? Предоставляет ли OpenGL какие-либо функции для вычисления обратной матрицы? Если бы я каким-то образом нашел обратные матрицы, в каком порядке их умножать?

Примечание. Я хочу реализовать инструмент, похожий на «молоток», где в точке H я рисую сферу с радиусом R. Пользователь может использовать эту сферу для измельчения объекта O, как молоток. Я реализовал это в 2D, поэтому я могу использовать тот же алгоритм, если я могу вычислить положение молотка относительно (x', y', z')

Заранее спасибо.


person Ashika Umanga Umagiliya    schedule 07.12.2010    source источник
comment
Если я правильно понял ваш вопрос, не будет ли это просто {Ox - hx, Oy - hy, Oz - hz} (т.е. glTranslatef(Ox - hx, Oy - hy, Oz - hz);)? Если у вас уже есть глобальные векторы O и h, достаточно простого вычитания векторов, полностью исключая манипуляции с матрицами. Кстати, ваше исходное решение звучит правильно.   -  person MrGomez    schedule 07.12.2010
comment
привет, я должен изменить исходные координаты объекта объекта O. Это означает, что я должен сравнить координаты объекта, а не мировые координаты.   -  person Ashika Umanga Umagiliya    schedule 07.12.2010
comment
Не беспокойся. Быстрое обновление напомнило мне, что OpenGL не предоставляет библиотеки матриц общего назначения. Для этого вам потребуется использовать отдельную библиотеку или выполнить вычисления (mathworld.wolfram.com/MatrixInverse .html) самостоятельно.   -  person MrGomez    schedule 07.12.2010


Ответы (2)


Обращение матрицы было бы общим решением, но, насколько я понимаю, на самом деле это не «общая» проблема. Вместо отмены произвольного преобразования вы пытаетесь выполнить обратную известную последовательность преобразований, каждое из которых можно очень просто обратить. Если ваше преобразование объекта в мир:

glTranslatef(Ox, Oy, Oz);
glRotatef(rotationX , 1.0, 0.0, 0.0);
glRotatef(rotationY, 0.0, 1.0, 0.0);
glRotatef(rotationZ, 0.0, 0.0, 1.0);

Тогда обратное отношение мира к объекту просто:

glRotatef(-rotationZ, 0.0, 0.0, 1.0);
glRotatef(-rotationY, 0.0, 1.0, 0.0);
glRotatef(-rotationX , 1.0, 0.0, 0.0);
glTranslatef(-Ox, -Oy, -Oz);

По сути, просто отменяйте каждое примененное преобразование в порядке, обратном первоначальному.

person walkytalky    schedule 07.12.2010

Да, в основном вы правы, что вы можете выполнить эту операцию по матрице перевода

M = O^-1 * H

любой, как вы уже догадались, вам нужна инверсия O для этого. Однако OpenGL не является математической библиотекой, она занимается только рендерингом. Поэтому вам придется реализовать инверсию самостоятельно. Google для «Gauss Jordan», чтобы найти один возможный алгоритм. Если вы можете быть абсолютно уверены, что O состоит только из поворота и переноса, то есть без сдвига или масштабирования, то вы можете сократить путь, транспонируя верхнюю левую подматрицу 3x3 и отрицая самые верхние 3 элемента самого правого столбца (это использует природу ортогонального матрицы, такие как матрицы вращения, что транспонирование также является обратным, верхний левый 3x3 является вращательной частью, инверсия перевода отрицает элементы своего вектора, который является крайним правым верхним 3 элементом).

person datenwolf    schedule 07.12.2010