Откровение ot Rel'a, глава минус первая, стих нулевой

Откровение минус первое. Стих нулевой, вступительный

Итак, ты захотел написать серьезное игровое трехмерное приложение, более того, ты наверное уже прочитал книжку, по какому-нибудь трехмерному API, скорее всего OpenGL - я угадал? Нет? Странно... Почему-то раньше все начинали с OpenGL. Хороший был такой API когда-то, не замусоренный еще сильно расширениями, и удобный.

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

У тебя уже появляются мысли написать движек, обязательно крутой, в котором будут поднимать модели из макса. Хотя... Нет, сначала ты напишешь парсер какого-нибудь формата X и поймешь, что информации там мало, для реализации твоих мозговыдавливающих идей и уже потом полезешь писать свой экспортер из 3ДС Макса. Затем ты захочешь по быстрому наваять что-то типа привьюшки моделей для игры, которая при неудачном исходе выльется в тулсет, но об этом немного позже.

Так вот, ты уверен, что это все тебе надо?, если надо, то специально для тебя - начинающего джедая геймдева, далее просто джедая - цикл откровений от человека любящего грабли и велосипеды, то есть меня Wink

Откровение нулевое, Матрицы и вектора

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

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

Итак. "Все это матрица," - как-то сказал Нео и был отчасти прав. И не надо глотать таблетки и звать на помощь оператора. Все намного проще. Матрица - это основа трехмерной графики и если не понимать, как сие чудо работает, то можно словить множество граблей, а иногда и изобрести самокат.

Для начала скажу, что матрица, в большинстве своем зависит от системы координат. Бывают два вида систем:
  • LH (Left Hand) левостороняя и
  • RH (Right Hand) правостороняя.

Собственно с этим можно смириться. Но этого оказалось мало, и особоумные джедаи придумали еще и способ задания матриц: строками или столбцами. То есть в памяти лежат последовательно либо вектора строк либо вектора колонок матрицы. Джедаи писавшие OpenGL еще додумались эту матрицу транспонировать (другими словами поменяли элементы матрицы местами, относительно главной диагонали). Отсюда следствие: чтобы умножить вектор на матрицу - надо умножить матрицу на вектор. Им это понадобилось видно для оптимизации Smile - настоящие джедаи любят все оптимизировать.

Матрицы существуют двух видов:
  • матрица преобразования и
  • проективная матрица.

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

Рассмотрим по подробнее матрицу преобразования - это матрица 4х4, в которой можно выделить три блока:
  1. матрица 3х3 лежащая в верхнем левом углу, называемая в узких кругах базисом, может быть как ортогональным и так ортонормированым, или не тем и не другим в случае преобразования сдвига;
  2. четвертая строчка, содержащая приращение позиции;
  3. нули в остальных элементах матрицы.

Джедайской техникой высоких полетов является использование матрицы 3х4. Т.к. четвертый столбец у всех матриц одинаково выглядит, его просто доращивают, когда спускают матрицу в конкретный API. Но данная техника сложна тем, что необходимо переписывать всю математику.

Сейчас можно развить тему базиса. Начинающий джедай сразу представляет синусы и косинусы. Должен тебя огорчить - это тоже заговор. На проверку все опять же оказывается на много проще. Что же представляет из себя базис - это тройка векторов. Каждый вектор - столбец матрицы, причем все эти вектора перпендикулярны (ортогональны) друг другу. Если отказаться от такого типа трансформации как масштабирование, то базис наш может назваться ортонормированым, то есть тройка векторов еще и нормирована.

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

В классификации видов проективной матрицы можно выделить основные два:
  • Перспективная - дальние обьекты сходятся в точку, и
  • Ортогональная - дальние обьекты по размерам такиеже как и ближние, тоесть не искажаются. Она часто используется для вывода двухмерной информации, например GUI (интерфейса приложения).

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

Кстати, у треугольника есть две грани: передняя и задняя. И в зависимости от системы координат, они меняются местами, то есть передняя грань треугольника V1->V2->V3 в одной системе соответствует передней грани треугольника V1->V3->V2 в другой... Что? Ты это уже знал? Ну ничего, повторение - мать учения.

На этом все. Продолжение следует...

P.S.: Это основные вещи, которые забывают упомянуть в джедайской литературе. Чувствуешь пульсацию в висках? Ты настоящий будущий джедай - я в тебе не сомневался. Smile

Последняя правка: чт, 03/11/2011 - 17:41
Submitted by Relyer on

GameDev.by