Матрица проекций обекта изначально

О чем?

Теперь мы создадим класс объекта сцены и научимся его отображать, а так же крутить. Сделаем что-то такое, тут планета и вокруг нее, по орбите, крутятся корабли:

Объектное ориентирование.

Для дальнейшего изучения вы должны разобраться, что такое классы и указатели и как с ними работать! Так же я надеюсь вы знаете что такое вектора матрицы и операции над ними.

Для отображения множества объектов в сцене я решил создать класс объектов. В программе будет создан массив указателей на объекты созданные в памяти. Сам файл примера берите >тут

Переменные:

LPDIRECT3DDEVICE9              *pd3dDevice;   // Our rendering device

D3DXMATRIXA16                          GOMatrix;   // матрица проекций обекта, изначально клон мировой матрицы

D3DXMATRIX GOMatrixDef;

LPD3DXMESH                                       pMesh;   // собственно сетка объекта

D3DMATERIAL9*                  pMeshMaterials;   // материалы объекта

LPDIRECT3DTEXTURE9*     pMeshTextures;   // текстуры объекта

DWORD                                  dwNumMaterials;  // число материалов объекта

Функции:

InitGeometry(LPCSTR filename) не претерпела изменений, она только стала получать параметр – имя файла. У меня он сразу с путем. То как подставить путь к имени файла видно из примера с загрузкой текстуры.

GORender() вобрала в себя код  отображения объекта и его частей с нанесением текстур уже знакомый нам.

rotateYL(float timeFactor) просто поворачивает матрицу объекта, для привнесения некоторой динамики в сцену. Функцией D3DXMatrixRotationY( &GOMatrix, timeGetTime()/timeFactor ); мы устанавливаем угол на timeGetTime()/timeFactor, при этом значение timeGetTime() обеспечивает увеличение угла с течением времени.

Обратим внимание на конструктор:

CGObject_static(LPDIRECT3DDEVICE9 *Device,D3DXMATRIXA16* matrix)

//нам при создании объекта нужно передать в него мировую матрицу и 3d девайс

{              pd3dDevice = Device;                       // получаем 3д девайс

    GOMatrix = *matrix;                                  // получаем мировую матрицу проекции

                D3DXMatrixIdentity(&GOMatrix);  // обрабатываем созданную матрицу

};

Создаем объекты.

Так как это первый пример, я не буду создавать массива объектов. В graphic_dx.cpp вам должно быть все понятно, если вы следовали моим инструкциям. Обратим внимание на то, что теперь мы можем легко добавлять объекты:

 

//прописав новую переменную

CGObject_static object(d3dDevice,&matWorld);

//Инициализировав в объекте геометрию (в функции InitGeometry())

object.InitGeometry(«models\\модель.x»);

//отрисовав объект(в Render())

object.GORender();

//возможно включив ему вращение

object.rotateYL(8500.0f);

Не забывайте убирать из памяти объекты и переменные созданные в процессе работы программы через указатели, например через деструктор (в Cleanup()) иначе вы можете потом удивляться странным результатам работы программы или полюбоваться на экстренную перезагрузку компа :)

object.~CGObject_static();

Клавиатура и мышь.

В принципе можно было использовать directinput, однако, чтобы не заморачиваться, я использовал более простой подход взятый из примера с opensource.net

Кажется, тут все понятно и не вижу смысла подробно объяснять, учитывая, что впереди еще много чего я объясню, а если бы я стал останавливаться здесь, то укоротилась бы другая тема, а она вам надо?)

Иллюзия освещения.

В моем примере (пример 5) создается ощущение, что на планете тень, однако это не так, просто я установил у источника света дальность освещения, а ambient-свет сделал темно синем и слабым. Вообщем эффектно, но просто)

Итог.

Сцена, конечно, получилась не великая, но когда я сам ее сделал, то я был в шоке! Ведь то, что я делал раннее было не так прикольно, а ведь все писалось мной самим, а не чьими-то библиотеками, когда делаешь что то своими руками это всегда приятно). Еще интересен тот момент, что объекты можно позиционировать в 3dsMax и использовать его как редактор карт, как и делают многие, что будет описано далее, в соответствующей части.

Понравилась статья? Поделиться с друзьями: