Все это классно, но попробуйте сделать из треугольников космический корабль или автомобиль, затем нанести текстуру и все это анимировать. И Вы сами будете не рады, что взялись за это... Поэтому Microsft решила облегчить жизнь программисту и дизайнеру, чтобы они (и мы в том числе) могли создавать поистине красивые трехмерные миры, лишь бы только желание было. Что для этого нужно?
Во-первых, любой 3D пакет при помощи которого можно создать 3D объекты. Я для таких целей выбрал 3D Studio MAX версии 4.26 (на данный момент уже вышла 5.0 версия). Чем он хорош? Просто я к нему привык и мне он показался одним из достойных пакетов на данный момент. Так что если он у Вас есть под рукой (любой версии, пусть даже DOS-овской), то Вы сможете проделать все сами. Если же нет, то не расстраивайтесь, в проект я включил один x-объект, над которым Вы можете поэкспериментировать и сделать для себя выводы.
Также незабудьте в 3D пакете перед экспортом сначала его отцентрировать:
Т.е. все оси проходят точно по центру (тонкие черные линии, не серые). Экспортируете и сохраняете файл с расширением 3ds. Я также создал дополнительно еще один файл cubes2, в котором куб поднял на 5 единиц по оси Y, что повлияет на поворот вокруг оси. Это сделано умышленно, чтобы показать Вам, что получится, если Вы забыли отцентрировать объект. Вы можете это позже проверить и запомнить.
Во-вторых, нам нужен иснтрумент, который сможет переконвертировать из формата 3ds в формат Х. Его мы берем из установленного DirectX SDK, любой версии скаченного с http://www.microsoft.com, в папке bin\dxutils\xfiles. Имя файла: conv3ds.exe. Т.е. запускаем его в виде командной строки:
conv3ds.exe cubes1.3ds
И файл готов: cubes1.x. Или можно взять другую программу: http://www.listsoft.ru/program.php?id=9868 - "программа 3D моделирования для создания, просмотра и редактирования DirectX файлов", занимает 13 Мб.
И в третьих, мы должны уметь загрузить X-файл в свое приложение и отобразить. Для этого откроем свой последний проект, найдем главный класс рамки и добавим следующее:
class CMainWnd : public CFrameWnd { private: LPDIRECT3D8 p_d3d; // наш главный интерфейс LPDIRECT3DDEVICE8 p_d3d_Device; // наше устройство d3d8 D3DDISPLAYMODE d3ddm; // способ отображения D3DPRESENT_PARAMETERS d3dpp; // параметры монитора LPDIRECT3DVERTEXBUFFER8 p_VertexBuffer; // наш буфер вершин LPDIRECT3DTEXTURE8 textura001; // наша текстура LPD3DXMESH p_d3dx_mesh; // трехмерный объект . . . public: D3DXVECTOR3 vecDir; // вектор направленного источника света CMainWnd(); // Конструктор по умолчанию ~CMainWnd(void); // Деструктор по умолчанию void Transform3D(void); void LoadMesh (char *filename); // Загрузка трехмерного объекта . . .
Более подробно об этой структуре см. раздел Справка по DirectX: "Шаг 74 - Описание интерфейса ID3DXMesh". Теперь осталось только загрузить файл Х. Расположите в конструкторе главного окна CMainWnd::CMainWnd() перед закрывающей скобкой:
LoadMesh ("cubes1.x");
А здесь наша новая сцена:
p_d3d_Device->BeginScene (); p_d3d_Device->SetMaterial (&mtrl1); p_d3dx_mesh->DrawSubset( 0 ); p_d3d_Device->EndScene ();
Более подробно об этой функции см. раздел Справка по DirectX: "Шаг 77 - ID3DXBaseMesh::DrawSubset". Также не забудем удалить указатель на 3D объект:
CMainWnd::~CMainWnd(void) { _RELEASE_ (p_d3dx_mesh); _DELETE_ (p_d3dx_mesh); . . .
И на последок: заставьте сцену снова вращаться по оси Y. И установите камеру в позицию: 0.0f, 30.0f, -70.0f, а также закомментируйте вращение света, загрузку текстуры и в деконструкторе указатель на текстуру. Вот теперь все, запускайте и смотрите :) Потом загрузите файл cubes2.x.