Отправляет email-рассылки с помощью сервиса Sendsay

Уроки по DirectX

  Все выпуски  

Уроки по DirectX


Информационный Канал Subscribe.Ru

Direct3D для Visual C++. Рассылки сайта progs.biz
Выпуск № 35
 
Начало > DirectX > Direct3D > VC++.NET > Урок 14

Дональд Херн, М. Паулин Бейкер. Компьютерная графика и стандарт OpenGL.
Дональд Херн, М. Паулин Бейкер. Компьютерная графика и стандарт OpenGL
Заказать на Озоне

Подробнее


Полные версии уроков (с картинками): урок 14.

Direct3D для Visual C++
Урок 14. Вывод модели из x-файла

На предыдущих уроках мы с вами сами строили модели - например, для постоения модели куба мы вычислили положение 12 треугольников и. п. Все это мы делали ручками. А теперь представьте себе, что вы имеете дело с настоящей моделью - которая состоит из тысяч треугольников. Высчитывать их вершины вручную - неблагодарное дело. Поэтому это обычно делается так - модель рисует профессиональный 3D-художник в каком-нибудь 3D-редакторе - например, в 3D max'е. Потом модель конвертируется из формата 3D-редактора (3d max'а в нашем случае) в специальный формат, который понимает DirectX - в так называемый x-файл. Т. е. x-файл и будет содержать нашу модель. Эта модель, кстати, называется меш (от английского mesh - сетка).

За основу урока мы возьмем код из урока 8.

Начинаем вносить изменения. Их будет не очень много.

Во-первых, подключаем нужный заголовочный файл для использования мешей:

#include <d3dx9mesh.h>

Во-вторых, надо объявить несколько глобальных переменных:

LPD3DXMESH pMesh = NULL;
LPD3DXBUFFER pBuffer = NULL;
D3DMATERIAL9 *pMeshMaterial = NULL;
LPDIRECT3DTEXTURE9 *pMeshTextures = NULL;
DWORD dwNum;

Назначение их следующее: pMesh - собственно наш меш, pBuffer - вспомогательный бефер, необходимый для создания меша, pMeshMaterial - материалы, использующиеся в меше, pMeshTextures - текстуры, использующиеся в меше, dwNum - число текстур и материалов меша.

В-третьих, нам надо написать отдельную функцию для инициализации меша (его зарузки и т. п.):

HRESULT InitMesh()
{
    // Загрузка меша из файла.
    if(FAILED(D3DXLoadMeshFromX("tiger.x",
        D3DXMESH_SYSTEMMEM, g_pd3dDevice, NULL, &pBuffer, NULL, &dwNum, &pMesh)))
    {
        return E_FAIL;
    }

    D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pBuffer->GetBufferPointer();
    // Выделение памяти для материалов и текстур.
    pMeshMaterial = new D3DMATERIAL9[dwNum];
    pMeshTextures = new LPDIRECT3DTEXTURE9[dwNum];
    // Заполнение массивов для материалов и текстур данными.
    for (DWORD i = 0; i < dwNum; i++)
    {
        pMeshMaterial[i] = d3dxMaterials[i].MatD3D;
        pMeshMaterial[i].Ambient = pMeshMaterial[i].Diffuse;
        // Загрузка текстуры.
        if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,
            d3dxMaterials[i].pTextureFilename, &pMeshTextures[i])))
        {
            pMeshTextures[i] = NULL;
        }
    }
    pBuffer->Release();
    return S_OK;
}

Код должен быть ясен из комментария. Разумеется, x-файл, указанный в параметре функции D3DXLoadMeshFromX, должен существовать.

Следующий, четвертый шаг - это функция для непосредственного рисования меша. Вот ее текст:

VOID DrawMesh()
{
    for (DWORD i = 0; i < dwNum; i++)
    {
        g_pd3dDevice->SetMaterial(&pMeshMaterial[i]);
        g_pd3dDevice->SetTexture(0, pMeshTextures[i]);
        pMesh->DrawSubset(i);
    }
}

Обратите внимание, что для примитивов, из которых состоит наш меш, мы устанавливаем разные материалы и текстуры (такое случается часто для сложных моделей).

С написанием новых функций все. Теперь осталось эти функции где-то применить. InitMesh мы вызываем в WinMain:

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow)
{
    ...
    if(!SUCCEEDED(InitD3D(hWnd)))
    {
        return 0;
    }
    InitMesh();
    ...

А DrawMesh - в функции Render (часть старого кода для рисования надо просто убрать):

VOID Render()
{
    ...
    if(SUCCEEDED(g_pd3dDevice->BeginScene()))
    {
        SetupMatrices();
        
        DrawMesh();

        g_pd3dDevice->EndScene();
    }
    ...

Компилируем и запускаем программу. Результат будет приблизительно такой, как мы и ожидали - фигурка тигра в нашем окне.

Рассылки сайта progs.biz
Visual C++, MFC
C# и .NET
VB.NET
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX new!
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


PARKING.RU. Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows(r): поддержка NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты. Управляемый ВЫДЕЛЕННЫЙ ХОСТИНГ на платформе Windows(r): производительные серверы, профессиональная поддержка, аренда ПО Microsoft(r), безопасность, гарантии. http://www.parking.ru


Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2005 сайт progs.biz
© 2002-2005 Игорь Алексеев

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.directxlessons
Отписаться
Вспомнить пароль

В избранное