Шаг 19 - Создание, загрузка и отображение X-файла

Все это классно, но попробуйте сделать из треугольников космический корабль или автомобиль, затем нанести текстуру и все это анимировать. И Вы сами будете не рады, что взялись за это... Поэтому Microsft решила облегчить жизнь программисту и дизайнеру, чтобы они (и мы в том числе) могли создавать поистине красивые трехмерные миры, лишь бы только желание было. Что для этого нужно?

Во-первых, любой 3D пакет при помощи которого можно создать 3D объекты. Я для таких целей выбрал 3D Studio MAX версии 4.26 (на данный момент уже вышла 5.0 версия). Чем он хорош? Просто я к нему привык и мне он показался одним из достойных пакетов на данный момент. Так что если он у Вас есть под рукой (любой версии, пусть даже DOS-овской), то Вы сможете проделать все сами. Если же нет, то не расстраивайтесь, в проект я включил один x-объект, над которым Вы можете поэкспериментировать и сделать для себя выводы.

Также незабудьте в 3D пакете перед экспортом сначала его отцентрировать:

19_1.gif (3066 b)

Т.е. все оси проходят точно по центру (тонкие черные линии, не серые). Экспортируете и сохраняете файл с расширением 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.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Хавов Евгений Валерьевич - 2.09.2002