OpenGL, отображение координат мира в объект? (обратная матрица) - PullRequest
4 голосов
/ 07 декабря 2010

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

Как видно на картинке,

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

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

Ответы [ 2 ]

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

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

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

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

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

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

M = O ^ -1 * H

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

...