О мировой матрице
О мировой матрице.
В этой статье я попробую описать, что такое мировая матрица и как она работает.
Разберемся, зачем она нужна.
Как известно любой трехмерный объект в компьютерной игре состоит из набора точек. Точки в свою очередь объединены в треугольники. В качестве примера возьмём куб:
У него 8 вершин и 12 треугольников (по два на каждую грань).
Каждая вершина имеет координаты: позиция по оси Х, позицияпо оси Y и позиция по оси Z. Теперь давайте попробуем переместить наш куб, например, на 3 деления по оси Х.
Что нужно для этого сделать? Для этого нужно взять каждую вершину куба и к координате Х каждой вершины прибавить число 3.
Вот что получится:
Это работает, но у данного подхода есть много недостатков:
1) Что если нам нужно выполнить цепочку преобразований, например: передвинуть вперед на 3, повернуть вокруг X на 5, передвинуть вправо на 4, повернуть по Y на 3, передвинуть вправо на 7.
И если при этом объект состоит не из 8-ми, а из ста вершин? Представьте, что каждое преобразование нужно совершить со всеми вершинами. Системе достаточно дорого обойдется эта операция.
2) Представьте, что у нас на сцене 4, 5: да чего мелочиться : 10 совершенно одинаковых объектов! На каждый придется создать копию всех вершин, так как вершины у этих объектов будут иметь разные координаты относительно центра сцены, хотя объекты будут абсолютно одинаковые. Это не экономично.
3) Современному компьютеру довольно накладно постоянно изменять данные вершин у рисуемых объектов.
Все трёхмерные объекты сцены обычно находятся в видеопамяти (от туда их быстрее рисовать), то есть в памяти видеокарты. И все данные туда попадают из оперативной памяти.
То есть если мы захотим изменить положение объекта, то система выполнит следующие действия:
Перешлет данные из видеопамяти в оперативную память, изменит их, затем перешлет обратно из оперативной памяти в видеопамять (на самом деле всё немного сложнее, но суть именно такая).
Такая пересылка памяти - это довольно дорогостоящая операция. И делать это много раз в секунду (особенно для больших объектов) не хорошо.
"Что же делать?" - спросите вы? "Я решу все ваши проблемы!" - ответит Мировая матрица.
Что же такое мировая матрица? Мировая матрица это матрица размерностью 4 на 4, хранящая в себе положение объекта в пространстве.
Смысл её использования заключается в том, что положение вершин объекта всегда остаётся неизменным. То есть объект как бы всегда находится в центре координат.
Но когда возникает необходимость отрисовать его - он на ходу преобразуется с помощью мировой матрицы. Каждая его вершина умножается на матрицу, и таким образом мы получаем нужное положение вершин.
То есть все наши преобразования (перемещения, повороты, масштабирование) вносят изменения только в мировую матрицу.
Теперь подробнее о том, как матрица хранит положение объекта.
Как уже было сказано, матрица состоит из 4 * 4 = 16 переменных. Из них 9 задают ориентацию объекта в пространстве (представляют собой 3 единичных вектора), а ещё 3 - его позицию. Оставшиеся четыре всегда неизменны и нужны для корректного выполнения операции умножения.
Внешне это выглядит так:
Rotx1 | Roty1 | Rotz1 | 0 |
Rotx2 | Roty2 | Rotz2 | 0 |
Rotx3 | Roty3 | Rotz3 | 0 |
PosX | PosY | PosZ | 1 |
Для лучшего закрепления материала, изучите несколько следующих примеров. Ось Z в них не учитывается (направлена перпендикулярно монитору).
Матрица:
1 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
2 | 1 | 0 | 1 |
Матрица:
1 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
-2 | 3 | 0 | 1 |
0 | -1 | 0 | 0 |
1 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
1 | 3 | 0 | 1 |
На будущее, учтите так же, что всё сказанное здесь о мировой матрице верно для DirectX, но некорректно для OpenGL. В OpenGL мировая матрица несколько отличается (это не тема данной статьи).
Если статья хоть немного помогла вам или вы хотите что-то исправить/дополнить - пожалуйста, напишите отзыв.
При полном или частичном копировании необходимо указывать ссылку на данную статью.
Юрий (Дата )
Все вопросы и предложения высылайте на адрес soft_support@list.ru. Необходимо в заголовке указать название статьи.
Оставь свой отзыв
Дата: 25.03.11 |
e-mail: kadirbekuly_sayat@mail.ru Дата: 25.03.11 |
Дата: 15.03.10 |
Дата: 08.06.09 |
4el Дата: 08.06.09 |
4el Дата: 08.06.09 |
Дата: 16.04.09 |