Листинг 4.9. Определение и умножение двух матриц.

// общая структура матрицы

typedef sruct matrix_typ

{

float elem[3][3]; // место для хранения матрицы

} matrix, *matrix_ptr;

void Mat_Mult3X3 (matrix_ptr matrix_1, matrix_ptr matrix_2, matrix_ptr result)

{

index i,j,k;

for(i=0; i<3; i++)

{

for (j=0; j<3; j++)

{

result[i][j] = 0; // Инициализация элемента

for(k=0; k<3; k++)

{

result->elem[i][j]+=matrix_1->elem[i][k] * matrix_2->elem[k][j];

} // конец цикла по k

} // конец цикла по j

} // конец цикла по i

} // конец функции

Перед выходом из этой функции мы имеем результат, сохраненный в переменной result.

Единичная матрица

Прежде чем закончить говорить о матрицах, скажем еще об одной вещи: о единичной матрице- Не углубляясь в математические термины, я хочу сказать, что нам Листинг 4.9. Определение и умножение двух матриц. нужна такая матрица, умножая на которую мы получали бы исходную матрицу.

Говоря попросту, нам нужно иметь матрицу размерностью mхn, которую назовем матрицей I. Умножая на нее любую другую матрицу, мы должны получить исходную. Этой матрицей будет квадратная матрица, по главной диагонали которой записаны единицы, а все остальные элементы равны нулю:

Если мы умножим матрицу А на матрицу I,

то результатом будет исходная матрица А;

А x I = A

Использование матриц в играх

Мы уже достаточно поговорили о матрицах. Теперь посмотрим, зачем они нам нужны и как их использовать в играх. В программе из Листинга 4.8 мы создали поле астероидов, которые Листинг 4.9. Определение и умножение двух матриц. перемещались, изменяли свой размер и вращались. Если мы представим наши объекты как набор матриц, то сможем использовать умножение матриц для их трансформации.

Прелесть матриц состоит в том, что вы можете объединить все операции в одну матрицу, описывающую перемещение, масштабирование и вращение.

Помните, когда пишутся видеоигры, мы должны искать наиболее быстрый и эффективный алгоритм. Чем больше хитростей и трюков у нас в запасе, тем лучше. Теперь посмотрим на матрицы для перемещения, масштабирования и вращения.

Главная матрица перемещений

Главной матрицей перемещений будем называть такую матрицу, в которой x_translation и y_translation - это коэффициенты перемещения объекта по осям Х и Y. Вот как она Листинг 4.9. Определение и умножение двух матриц. выглядит:

Главная матрица масштабирования

Главная матрица масштабирования - это такая матрица, в которой scale_x и scale_y - это коэффициенты масштабирования объекта по координатам х и у.

Такая матрица позволяет выполнять неоднородное масштабирование — мы можем задать один масштаб по оси Х и другой — по Y. Таким образом, если мы хотим масштабировать объект однородно, то должны задать scale_x = scale_y.

Главная матрица поворотов

В главной матрице поворотов angle - это угол, на который вы хотите повернуть, объект:

Общая матрица масштабирования, поворотов и перемещений

Наступает торжественный момент. Теперь мы возьмем матрицы перемещения, масштабирования и поворота и перемножим их (получим их конкатенацию), чтобы получить общую матрицу Листинг 4.9. Определение и умножение двух матриц., реализующую все три функции сразу. Окончательно матрица будет выглядеть так:

Если вы теперь умножите вершины объекта на эту матрицу, то получите перемещенный, повернутый и масштабированный объект. Не слабо, а?

Компонент нормализации вершины

Я совсем упустил одну маленькую деталь, которую вы уже, наверное, заметили. «Как мы можем умножить вершину на матрицу размером 3х3?» Неплохой вопрос. Рад, что вы спросили. Чтобы выполнить это, мы должны изменить представление структуры вершин, добавив компонент нормализации. Компонент нормализации - это просто единица, добавленная в конец структуры, описывающей каждую вершину. Для этого нам надо чуть-чуть изменить исходные тексты в Листинге 4,4, в котором описаны вершины. Все Листинг 4.9. Определение и умножение двух матриц. это отражено в структуре данных в Листинге 4.10.




documentacnbhjt.html
documentacnboub.html
documentacnbwej.html
documentacncdor.html
documentacnckyz.html
Документ Листинг 4.9. Определение и умножение двух матриц.