Данный материал взят с сайта old.shatalov.su и является его зеркалом

Создаём компьютерную игру. Создание игр на C++/DirectX

Есть вопросы?
Ошибка на сайте?
рус eng esp
Внимание! Данный сайт не обновляется. Новая версия: shatalov.su

Векторы в компьютерных играх

Дата создания: 2009-04-11 15:25:51
Последний раз редактировалось: 2012-02-08 09:19:45

Долго я не хотел писать данную статью - думал как подавать материал. Ещё и картинки нужно рисовать. Но, видать сегодня удачно сложились звёзды и статье про векторы быть. Хотя, это всего лишь черновой вариант. В будущем данную статью разобью на несколько отдельных - материала достаточно. Также, постепенно статья будет улучшаться: буду вносить в неё изменения - т.к. за один присест не получится раскрыть все аспекты.

Векторы были введены в математику в девятнадцатом века, для описания величин, которые трудно было описывать с помощью скалярных значений.

Векторы интенсивно применяются при разработке компьютерных игр. Применяются они не только традиционно - для описания таких величин как сила или скорость, но и в областях, которые казалось бы никак не связаны с векторами: хранение цвета, создание теней.

Скаляры и векторы

Для начала напомню, что такое скаляр, и чем он отличается от вектора.

Скалярные значения хранят какую-то величину: масса, объём. То есть это сущность, которая характеризуется только одним числом (например, количество чего-либо).

Вектор в отличии от скаляра описывается с помощью двух значений: величина и направление.

Важное отличие векторов от координат: векторы не привязаны к конкретному местоположению! Ещё раз повторюсь, главное в векторе - длина и направление.

Вектор обозначается жирной буквой латинского алфавита. Например: a, b, v.

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

Вектор на координатной плоскости

Векторы в пространстве

В пространстве векторы можно выражать с помощью координат. Но прежде нужно ввести одно понятие:

Радиус-вектор точки

Возьмём в пространстве какую-нибудь точку M(2,1). Радиус-вектор точки - это вектор начинающийся в начале координат и заканчивающийся в точке.

У нас здесь ни что иное как вектор OM. Координаты начала вектора (0,0), координаты конца (2,1). Обозначима этот вектор как a.

В данном случае вектор можно записать следующим образом a = <2, 1>. Это координатная форма вектора a.

Координаты вектора называются его компонентами относительно осей. Напрмер, 2 - компонета вектора a относительно оси x.

Давайте ещё раз остановимся на том, что такое координаты точки. Координата точки (например x) - это проекция точки на ось, т.е. основание перпендикуляра, опущенного из точки на ось. В нашем примере 2.

Но вернёмся к первому рисунку. У нас здесь две точки A и B. Пусть координатами точек будут (1,1) и (3,3). Вектор v в данном случае можно обозначить так v = <3-1, 3-1>. Вектор лежащий в двух точках трёхмерного пространстве будет выглядеть так:

v = <x2-x1, y2-y1, z2-z1>

Думаю никаких сложностей тут нет.

Умножение вектора на скаляр

Вектор можно умножать на скалярные значения:

kv = <k*vx, k*vy> = <k*2, k*1>

Здесь и далее, * - знак умножения.

При этом скалярное значение перемножается с каждой компонентой вектора.

Если k > 1, то вектор увеличится, если k меньше единицы, но больше нуля - вектор уменьшится в длину. Если же k меньше нуля, то вектор поменяет направление.

Единичные векторы

Единичные векторы - это векторы длина которых равна единице. Заметьте, вектор с координатами <1,1,1> не будет равным единице! Нахождение длины вектора описано ниже по тексту.

Существуют так называемые орты - это единичные векторы, которые по направлению совпадают с осями координат. i - орт оси x, j - орт оси y, k - орт оси z.

При этом i = <1,0,0>, j = <0,1,0>, k = <0,0,1>.

Теперь мы знаем что такое умножение вектора на скаляр и что такое единичные векторы. Теперь мы можем записать v в векторной форме.

v = vxi + vyj + vzk, где vx, vy, vz - соответствующие компоненты вектора

Сложение векторов

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

Тут всё просто. Возьмём два вектора v1 = <x1,y1,z1> и v2 = <x2,y2,z2>

v1 + v2 = <x1+x2, y1+y2, z1+z2>

Мы всего лишь складываем соответствующие компоненты двух векторов.

Разность вычисляется так же.

Это, что касается математической формы. Для полноты, стоит рассмотреть как будет выглядеть сложение и вычитание векторов графически.

Сумма и разность векторов

Для того, чтобы сложить два вектора a+b. Нужно совместить начало вектора b и конец вектора a. Затем, между началом вектора a и концом вектора b провести новый вектор. Для наглядности смотрите второй рисунок (буква "а").

Для вычитания векторов нужно совместить начала двух векторов и провести новый вектор из конца второго вектора к концу первого. На втором рисунке (буква "б") показано как оно выглядит.

Длина и направление вектора

Сначала рассмотрим длину.

Длина - это числовое значение вектора, без учёта направления.

Длина определяется по формуле (для трёхмерного вектора):

Длина вектора в трёхмерном пространстве

корень квадратный из суммы квадратов компонент вектора.

Знакомая формула, не правда ли? В общем-то - это формула длины отрезка

Направление вектора определяется по направляющим косинусам углов образованных между вектором и осями координат. Для нахождения направляющих косинусов используются соответствующие компоненты и длина (картинка будет позже).

Представление векторов в программах

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

float vector3[3] = {1,2,3}; // массив для хранения вектора

struct vector3 // структура для хранения векторов
{
  float x,y,z;
};

Самые большие возможности при хранении векторов нам предоставляют классы. В классах мы можем описать не только сам вектор (переменные), но и векторные операции (функции).

Скалярное произведение векторов

Существует два типа перемножения векторов: векторное и скалярное.

Отличительная особенность скалярного произведения - в результате всегда будет скалярное значение, т.е. число.

Тут стоит обратить внимание вот на какой момент. Если результат данной операции равен нулю, значит, два вектора перпендикулярны - угол между ними 90 градусов. Если результат больше нуля - угол меньше 90 градусов. Если результат меньше нуля, угол больше 90 градусов.

Данную операцию представляет следующая формула:

a · b = ax*bx + ay*by + az*bz

Скалярное произведение - это сумма произведений соответствующих компонент двух векторов. Т.е. Берём x'ы двух векторов, перемножаем их, затем складываем с произведением y'ов и так далее.

Векторное произведение векторов

Результатом векторного произведения двух векторов будет вектор перпендикулярный этим векторам.

a x b = <ay*bz - az*by, az*bx - ax*bz, ax*by - ay*bx>

Мы пока не будем обсуждать подробно эту формулу. К тому же она довольно трудна для запоминания. Мы ещё вернёмся к этому моменту после знакомства с определителями.

Ну и для общего развития полезно знать, что длина полученного вектора, равна площади параллелограмма построенного на векторах a и b.

Нормализация вектора

Нормализованный вектор - это вектор, длина которого равна единице.

Формула для нахождения нормализованного вектора следующая - все компоненты вектора необходимо разделить на его длину:

vn = v/|v| = <vx/|v|, vy/|v|, vz/|v|>

Послесловие

Как Вы, наверное, убедились, векторы не сложны для понимания. Мы рассмотрели ряд операций над векторами.

В следующих статьях раздела "математика" мы будем обсуждать матрицы, определители, системы линейных уравнений. Это всё теория.

После этого, мы рассмотрим преобразования матриц. Именно тогда Вы поймёте насколько важна математика в создании компьютерных игр. Данная тема как раз и станет практикой по всем предыдущим темам.