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

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

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

alt text

У меня есть объект с именем 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 ')

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

4 голоса | спросил Ashika Umanga Umagiliya 7 TueEurope/Moscow2010-12-07T07:22:07+03:00Europe/Moscow12bEurope/MoscowTue, 07 Dec 2010 07:22:07 +0300 2010, 07:22:07

2 ответа


0

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

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);

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

ответил walkytalky 7 TueEurope/Moscow2010-12-07T12:52:02+03:00Europe/Moscow12bEurope/MoscowTue, 07 Dec 2010 12:52:02 +0300 2010, 12:52:02
0

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

M = O ^ -1 * H

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

ответил datenwolf 7 TueEurope/Moscow2010-12-07T12:34:30+03:00Europe/Moscow12bEurope/MoscowTue, 07 Dec 2010 12:34:30 +0300 2010, 12:34:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132