О чем?
Теперь мы создадим класс объекта сцены и научимся его отображать, а так же крутить. Сделаем что-то такое, тут планета и вокруг нее, по орбите, крутятся корабли:
Объектное ориентирование.
Для дальнейшего изучения вы должны разобраться, что такое классы и указатели и как с ними работать! Так же я надеюсь вы знаете что такое вектора матрицы и операции над ними.
Для отображения множества объектов в сцене я решил создать класс объектов. В программе будет создан массив указателей на объекты созданные в памяти. Сам файл примера берите >тут
Переменные:
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 и использовать его как редактор карт, как и делают многие, что будет описано далее, в соответствующей части.