Статьи / О мировой матрице

О мировой матрице


Отправить ссылку:

О мировой матрице.

В этой статье я попробую описать, что такое мировая матрица и как она работает.

Разберемся, зачем она нужна.

Как известно любой трехмерный объект в компьютерной игре состоит из набора точек. Точки в свою очередь объединены в треугольники. В качестве примера возьмём куб:

Куб в 3х мерном пространстве Unick-soft

У него 8 вершин и 12 треугольников (по два на каждую грань).
Каждая вершина имеет координаты: позиция по оси Х, позицияпо оси Y и позиция по оси Z. Теперь давайте попробуем переместить наш куб, например, на 3 деления по оси Х.
Что нужно для этого сделать? Для этого нужно взять каждую вершину куба и к координате Х каждой вершины прибавить число 3.
Вот что получится:

Куб в 3х мерном пространстве со сдвигом Unick-soft

Это работает, но у данного подхода есть много недостатков:
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
Где PosX, PosY, PosZ - позицию объекта, а Rotx1, Roty1, Rotz1 - вектор-направление оси X объекта, Rotx2, Roty2, Rotz2 - вектор-направление оси Y объекта, Rotx3, Roty3, Rotz3 - вектор-направление оси Z объекта.

Для лучшего закрепления материала, изучите несколько следующих примеров. Ось Z в них не учитывается (направлена перпендикулярно монитору).
Unick-soft График для матрицы
Матрица:

1 0 0 0
0 1 0 0
0 0 1 0
2 1 0 1

Unick-soft График 2 для матрицы
Матрица:
1 0 0 0
0 1 0 0
0 0 1 0
-2 3 0 1

Unick-soft График 3 для матрицы
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