netlib.narod.ru | < Назад | Оглавление | Далее > |
Direct3D определяет несколько типов данных, которые несомненно будут снова и снова применяться в ваших программах. В данном разделе мы обсудим эти типы данных.
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 определена следующим образом:
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 применяется в 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().
Direct3D использует структуру D3DRMBOX для описания размеров объекта. Интерфейсы Direct3DRMMesh и Direct3DRMMeshBuilder предоставляют функцию GetBox(), применяемую для получения размеров объекта. Структура D3DRMBOX содержит две структуры D3DVECTOR:
typedef struct _D3DRMBOX { D3DVECTOR min, max; } D3DRMBOX;
Хотя используются структуры типа D3DVECTOR, данные в них описывают точки, а не векторы. Структуры min и max применяются для указания противоположных углов минимального возможного параллелепипеда, который мог бы содержать рассматриваемый объект.
Структура 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() программа может изменить задаваемые по умолчанию нормали граней или вершин.
Кватернионы описывают вращение. В главе 2 для описания вращения мы применяли вектор и значение вращения. Вектор определял ось вращения, а значение — угол поворота. Кватернионы инкапсулируют вектор и значение в одной структуре:
typedef struct _D3DRMQUATERNION { D3DVALUE s; D3DVECTOR v; } D3DRMQUATERNION; typedef D3DRMQUATERNION *LPD3DRMQUATERNION;
Для инициализации кватернионов применяется функция D3DRMQuaternionFromRotation(). Функция получает вектор и значение вращения и создает кватернион.
Кватернионы удобны для вычисления промежуточных значений вращения. Например, функция D3DRMQuaternionSlerp() принимает в качестве аргументов два кватерниона и число. Функция вычисляет промежуточный кватернион между двумя векторами. Передаваемое в качестве параметра число определяет, в каком месте между двумя указанными кватернионами будет расположен новый. Например, если указать значение 0.5, новый кватернион будет создан точно между двумя исходными.
Большинство основных функций DirectX возвращают в качестве кода ошибки значение типа HRESULT. Тип HRESULT представляет собой 32-разрадное значение, индицирующее состояние функции в момент завершения. Direct3D предоставляет ряд констант, используемых при оценке возвращаемого значения. В идеальном случае функции возвращают константу D3DRM_OK, что свидетельствует об успешном завершении. Если при вызове функции возникает ошибка, возвращаемое значение указывает на характер проблемы.
netlib.narod.ru | < Назад | Оглавление | Далее > |