[Главная] [Новости] [Статьи] [Игры] [Проекты] | [Автор] | |||
Теоретические основы 3D-программирования: теоретические и практические основы программирования 3D-игр. | ||||
Предисловие Те кто впервые сталкивается с программированием 3D-графики могут встретить ряд трудностей, а именно - теоретические и практические пробелы в знаниях. Данный цикл статей призван восполнить эти пробелы и помочь тем, кто решил заняться освоением DirectX. Примеры даны применительно к Delphi 6-7. |
||||
Основы теории векторов Вектор - направленный отрезок, имеющий направление и длину. Задается триадой чисел (x, y, z). Причем начало вектора - это центр системы координат - (0, 0, 0), а конец вектора как раз указанная тройка чисел. |
||||
Длина вектора - обозначается |a|, вычисляется как |a| = Sqrt(Sqr(ax) + Sqr(ay) + Sqr(az)), где ax, ay, az - соответствующие координаты вектора, Sqrt - функция вычисления квадратного корня, Sqr - вычисление квадрата числа. В DirectX для вычисления длины вектора используется функция D3DXVec3Length; |
||||
Сложение векторов - если a и b векторы, то a + b = c. Можно также записать a + b = (ax + bx, ay + by, az + bz); Результат операции - вектор c. В DirectX для сложения векторов используется функция D3DXVec3Add; Графически сложение векторов можно представить так: |
||||
Вычитание векторов: с - a = b; c - a = (cx - ax, cy - ay, cz - az); Результат операции - вектор b. В DirectX для вычитания векторов используется функция D3DXVec3Sub; |
||||
Скалярное произведение векторов (dot product) - произведение длин этих векторов на Cos угла между ними. Другими словами скалярное произведение векторов - это длина проекции вектора a на вектор b (при условии, что вектор b - единичный). a . b = |a||b|cos d; или a . b = axbx + ayby + azbz; В DirectX для скалярного произведения векторов используется функция D3DXVec3Dot; |
||||
Следствие: d - угол между двумя векторами: cos d = a . b /(|a||b|); |
||||
Проекция одного вектора на другой - для того, чтобы вычислить проекцию вектора b на вектор a, требуется нормировать вектор a, то есть сделать его единичным, и произвести скалярное умножение этого вектора на вектор b, а затем полученное число умножить на нормированный вектор a. Обозначим искомый вектор как c, тогда Normalize(a) = a / |a|; В DirectX для нормализации векторов используется функция D3DXVec3Normalize; c = (Normalize(a) . b)*Normalize(a); |
||||
фактически, мы находим длину проекции и, умножая ее на вектор, проекцию которого мы нашли, маштабируем его до нужного размера. | ||||
Умножение вектора на вектор (cross product) - умножая вектор a на вектор b, мы получим вектор, перпендикулярный плоскости, которую определяют вектора a и b. a x b = (aybz - byaz, azbx - bzax, axby - bxay); Смысл выражения записанного в скобках следующий: в плоскостях YZ, ZX и XY производится векторное вычитание проекций указанных двух векторов на эти плоскости, так находятся 3 новых результирующих проекции которые и определяют координаты нового результирующего вектора. На рисунке ниже показаны проекции (чтобы не усложнять рисунок). Предполагается, что концы векторов A и B лежат на поверхности единичной сферы (т.е. их длины равны 1). |
||||
Фактически, таким образом находится вектор нормали к полигонам. В DirectX для векторного произведения 2х векторов используется функция D3DXVec3Cross; Небольшой вычислительный эксперимент для проверки смысла векторного произведения. Пусть векторы A и B - единичные векторы лежащие на осях координат X и Y соответственно, т.е. A(1, 0, 0), B(0, 1, 0), тогда их векторное произведение даст - A x B = (AyBz-ByAz, AzBx-BzAx, AxBy-BxAy) = (0*0-1*0, 0*0-0*1, 1*1-0*0)=(0, 0, 1), т.е. единичный вектор лежащий на оси Z. Всё правильно. |
||||
Это было немного теории, переходим к практике - [Основы управления камерой] | ||||
О кватернионах | ||||
[Главная] [Новости] [Статьи] [Игры] | ||||
(c) Мега Информатик 2006-2007 |