Программирование графики с использованием Direct3D

       

Создание сетки


Первый этап требует создания указателя на интерфейс Direct3DRMMeshBuilder. Функция Load() интерфейса Direct3DRMMeshBuilder применяется для загрузки сетки из файла. Если вызов функции Load() завершается неудачно (файл отсутствует или имеет неправильный формат), выводится окно сообщения и функция возвращает FALSE, сигнализируя о необходимости прекратить выполнение приложения. Давайте взглянем на эту часть кода:

d3drm->CreateMeshBuilder(&meshbuilder); r = meshbuilder->Load(meshname, NULL, D3DRMLOAD_FROMFILE, NULL, NULL ); if (r != D3DRM_OK) { CString msg; msg.Format("Failed to load file '%s'\n", meshname); AfxMessageBox(msg); return FALSE; } ScaleMesh(meshbuilder, D3DVALUE(25));

Если сетка успешно загружена, она масштабируется функцией ScaleMesh(). ScaleMesh() — это удобная функция, предоставляемая классом RMWin. Мы используем здесь эту функцию для масштабирования сетки, чтобы гарантировать корректное отображение сетки, независимо от ее оригинальных размеров. Функция ScaleMesh() будет описана позже в этой главе.

Затем конструктор сеток добавляется к фрейму. Эта часть кода выглядит следующим образом:

LPDIRECT3DRMFRAME meshframe; d3drm->CreateFrame(scene, &meshframe); meshframe->AddVisual(meshbuilder); meshframe->SetRotation(scene, D3DVALUE(0), D3DVALUE(1), D3DVALUE(0), D3DVALUE(0.1)); meshframe->Release(); meshframe = 0;

Функция CreateFrame() интерфейса Direct3DRM применяется для инициализации указателя meshframe. Обратите внимание, что в качестве первого аргумента функции CreateFrame() передается указатель на фрейм scene. Это означает, что новый фрейм (meshframe) будет дочерним для фрейма scene.

Затем вызывается функция AddVisual() для присоединения конструктора сеток meshbuilder к новому фрейму. К одному фрейму можно добавить несколько сеток, но обычно к одному фрейму присоединяется только одна сетка.

Вызов следующей функции назначает фрейму атрибуты вращения. В качестве аргументов функции SetRotation() передаются вектор и угол поворота. В нашем примере вектор направлен вдоль оси Y, а угол поворота равен 0.1. Поскольку сетка присоединена к фрейму, которому назначено вращение, она будет поворачиваться вокруг оси Y на 0.1 радиан при каждом обновлении экрана.

После того, как вращение назначено, вызывается функция фрейма Release(). Помните, что Release() не уничтожает объект, а уменьшает внутренний счетчик ссылок объекта. Эта функция должна вызываться всякий раз, когда указатель на интерфейс больше не нужен. Объект сам решает, когда уничтожить себя. Здесь мы вызываем функцию Release() потому, что указатель на данный интерфейс нам больше не нужен.



Содержание раздела