netlib.narod.ru< Назад | Оглавление | Далее >

Типы данных Direct3D

Direct3D определяет несколько типов данных, которые несомненно будут снова и снова применяться в ваших программах. В данном разделе мы обсудим эти типы данных.

D3DVALUE

D3DVALUE — это основной тип данных в Direct3D. Тип D3DVALUE объявлен через тип float и применяется в Direct3D для представления координат вершин, интенсивности освещения, скорости вращения и т.д.

В 32-разрадных версиях C++, таких как Visual C++, числа для которых явно не указан тип, воспринимаются как числа типа int (если десятичная точка отсутствует) или double (если в числе есть десятичная точка). Другими словами, если в вашей программе встречается неспецифицированное число с плавающей точкой, компилятор выделит для него восемь байт (как для числа двойной точности), а не четыре (как для числа с плавающей точкой одинарной точности). По этой причине, а также из-за того, что код, использующий тип D3DVALUE будет более переносимым, в программах Direct3D часто используются значения типа D3DVALUE. Если вы уверены, что программа не будет переноситься на другие платформы, и вам неприятно наличие многочисленных приведений к типу D3DVALUE в коде (что довольно понятно), применяйте для указания компилятору типа значения суффикс «f» (в этом случае вы должны использовать десятичную точку). Приведем ряд примеров:

  d3dfunction((D3DVALUE)3)   // стандартный и безопасный способ
  d3dfunction((D3DVALUE)3.0) // стандартный и безопасный способ
  d3dfunction(3)             // воспринимается как int и вызывает
                             // предупреждение компилятора
  d3dfunction(3.0)           // воспринимается как double и
                             // вызывает предупреждение компилятора
  d3dfunction(3.0f)          // допустимо, но уменьшает
                             // переносимость
  d3dfunction(3f)            // недопустимо, должна использоваться
                             // десятичная точка

D3DVECTOR

Структура D3DVECTOR определена следующим образом:

  typedef struct _D3DVECTOR {
      union {
          D3DVALUE x;
          D3DVALUE dvX;
      };
      union {
          D3DVALUE y;
          D3DVALUE dvY;
      };
      union {
          D3DVALUE z;
          D3DVALUE dvZ;
      };
  } D3DVECTOR, *LPD3DVECTOR;

Объединения позволяют использовать переменные x и dvX (для примера) как взаимозаменяемые. Структура D3DVECTOR повсеместно применяется в Direct3D для представления не только векторов, но и точек.

D3DCOLOR

Тип D3DCOLOR применяется в Direct3D для представления цветов. Цвет имеет красную, зеленую, синюю и альфа составляющие. Значение каждой составляющей может варьироваться от нуля (отсутствие компонента) до единицы (максимальная интенсивность компонента).

Фактически дело обстоит несколько сложнее. Тип D3DCOLOR представляется типом DWORD, и поэтому, он не может хранить четыре значения с плавающей точкой. При сохранении значения цветовых составляющих умножаются на 255 и помещаются в соответствующие разряды значения типа DWORD. Для этой цели Direct3D предоставляет макроопределение. Присвоить значение переменной типа D3DCOLOR можно с помощью макроопределения D3DRGB или D3DRGBA:

  D3DCOLOR color=D3DRGB(1,1,1);    // создаем переменную D3DCOLOR
                                   // для белого цвета
  D3DCOLOR color=D3DRGBA(1,1,1,0); // создаем переменную D3DCOLOR
                                   // для белого цвета
                                   // с нулевой альфа-составляющей

Значения, передаваемые макроопределениям D3DRGB и D3DRGBA должны быть в диапазоне от нуля до единицы. Макроопределение выполняет умножение и преобразование значений. К тому же не требуется выполнять приведение к типу D3DVALUE, поскольку макроопределение осуществляет приведение типа автоматически.

Чтобы извлечь отдельные цветовые составляющие из значения типа D3DCOLOR применяются функции D3DRMColorGetRed(), D3DRMColorGetGreen(), D3DRMColorGetBlue() и D3DRMColorGetAlpha().

D3DRMBOX

Direct3D использует структуру D3DRMBOX для описания размеров объекта. Интерфейсы Direct3DRMMesh и Direct3DRMMeshBuilder предоставляют функцию GetBox(), применяемую для получения размеров объекта. Структура D3DRMBOX содержит две структуры D3DVECTOR:

  typedef struct _D3DRMBOX
  {
    D3DVECTOR min, max;
  } D3DRMBOX;

Хотя используются структуры типа D3DVECTOR, данные в них описывают точки, а не векторы. Структуры min и max применяются для указания противоположных углов минимального возможного параллелепипеда, который мог бы содержать рассматриваемый объект.

D3DRMVERTEX

Структура D3DRMVERTEX применяется в Direct3D для описания вершин сеток и определена следующим образом:

  typedef struct _D3DRMVERTEX{
    D3DVECTOR position;
    D3DVECTOR normal;
    D3DVALUE  tu, tv;
    D3DCOLOR  color;
  } D3DRMVERTEX;

Структура position описывает местоположение вершины. Вектор normal задает нормаль вершины (для метода визуализации Гуро) или вектор грани (при равномерной закраске). Значения tu и tv определяют координаты точки текстуры, которая отображается на данную вершину. Значение color задает цвет вершины.

Структура D3DRMVERTEX используется функциями GetVertices() и SetVertices() интерфейса Direct3DRMMesh. Функция GetVertices() заполняет массив структур D3DRMVERTEX значениями соответствующих вершин. Эти значения можно затем изменить и передать функции SetVertices(), что приведет к изменению характеристик сетки. Этот способ могут использовать такие методы анимации, как анимация вершин и анимация текстур. Также с помощью функций GetVertices() и SetVertices() программа может изменить задаваемые по умолчанию нормали граней или вершин.

D3DRMQUATERNION

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

  typedef struct _D3DRMQUATERNION {
    D3DVALUE   s;
    D3DVECTOR  v;
  } D3DRMQUATERNION;
  typedef D3DRMQUATERNION *LPD3DRMQUATERNION;

Для инициализации кватернионов применяется функция D3DRMQuaternionFromRotation(). Функция получает вектор и значение вращения и создает кватернион.

Кватернионы удобны для вычисления промежуточных значений вращения. Например, функция D3DRMQuaternionSlerp() принимает в качестве аргументов два кватерниона и число. Функция вычисляет промежуточный кватернион между двумя векторами. Передаваемое в качестве параметра число определяет, в каком месте между двумя указанными кватернионами будет расположен новый. Например, если указать значение 0.5, новый кватернион будет создан точно между двумя исходными.

HRESULT

Большинство основных функций DirectX возвращают в качестве кода ошибки значение типа HRESULT. Тип HRESULT представляет собой 32-разрадное значение, индицирующее состояние функции в момент завершения. Direct3D предоставляет ряд констант, используемых при оценке возвращаемого значения. В идеальном случае функции возвращают константу D3DRM_OK, что свидетельствует об успешном завершении. Если при вызове функции возникает ошибка, возвращаемое значение указывает на характер проблемы.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz