Программирование 3D-игр в DirectX на Delphi
 
         
    [Главная] [Новости] [Статьи] [Игры] [Проекты] [Автор]  
         
  Теоретические основы 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).

 
     
 
векторное произведение векторов (Unit sphere - единичная сфера радиусом = 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    
Hosted by uCoz