Для создания Direct3D устройства используется метод CreateDevice интерфейса IDirect3D. В общем виде метод выглядит следующим образом:
HRESULT CreateDevice(UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface);Параметры функции:
· Adapter – номер адаптера, который необходимо использовать. В большинстве случаев достаточно использовать первичный адаптер и на него ссылается константа D3DADAPTER_DEFAULT;
· DeviceType – тип устройства. Здесь можно указать одно из следующих значений:
– D3DDEVTYPE_HAL – использовать аппаратные возможности. Этот параметр является более предпочтительным.
– D3DDEVTYPE_REF – использовать программные возможности, но если есть возможность, можно применять специализированные инструкции процессора;
– D3DDEVTYPE_SW – использовать программное устройство;
· hFocusWindow – окно, которое будет использоваться для вывода графики. Это должно быть верхнее (поверх всех) или полноэкранное окно;
· BehaviorFlags – дополнительные параметры создания устройства;
· pPresentationParameters – указатель на структуру типа D3DPRESENT_PARAMETERS;
· ppReturnedDeviceInterface – указатель на указатель на переменную типа IDirect3DDevice9, в которую будет сохранен интерфейс созданного устройства (возвращает указатель на созданное устройство).
Пример вызова метода в функции DX3DInit:
HRESULT hRes;if(FAILED(hRes = (*ppiD3D9)->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, Flags, &d3dpp, ppiD3DDevice9))) return hRes;Устройство создано, и мы готовы к работе, но еще желательно настроить параметры камеры.
Работа Direct3D с трехмерным миром.
Для перемещения объекта в трёхмерном пространстве вдоль какой - либо оси достаточно изменить координаты каждой из вершин в ту или иную сторону. При повороте необходимо применять формулы, основанные на синусе и косинусе.
Для поворота вокруг нескольких осей сразу, нужно применять эти формулы по очереди для каждой оси в отдельности. Для избавления от этого недостатка была разработана, так называемая, однородная система координат, где все действия над объектами было очень удобно производить с помощью МАТРИЦ.
Если хотели произвести сразу много действий, то просто перемножали матрицы нужных операций и результирующую матрицу, содержащую в себе все преобразования, уже применяли к вершинам всего обьекта. Все системы просчета 3D графики работают с матрицами.
Матрица представляет собой обычную числовую таблицу из строк и столбцов. Вот как она выглядит:
|а11 a12 a13 a14|- матрица 4х4. Всего 16 элементов. Каждый элемент имеет |a21 a22 a23 a24| обозначение. Буквой обозначается элемент, а цифрами место |a31 a32 a33 a34| расположения в матрице. Например "a23" - это элемент, |a41 a42 a43 a44| стоящий на второй строке в третьем столбце.Размер каждого элемента в матрице – 4 байта. Соответственно, размер в памяти, который занимает одна матрица, равен 64 байтам.
Существуют три основные матрицы при работе с DirectX:
· World Matrix (мировая матрица)
· View Matrix (матрица вида)
· Matrix Projection (матрица проекции).
"Мировая матрица" отвечает за преобразование всей сцены (вращение вокруг осей, перемещение и т.д.). "Матрица вида" отвечает за то, какая часть сцены будет видна на экране. "Матрица проекции" отвечает за то, как трехмерные координаты будут преобразованы в двумерные для отображения на экран.
С помощью этих трёх метриц Direct3D превращает трехмерный мир в плоскую картинку на мониторе.