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

Уроки по DirectX

  Все выпуски  

Уроки по DirectX Урок 17. Создание нескольких фигур


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

Мэтью Мак-Дональд, Марио Шпушта
Microsoft ASP.NET 2.0 с примерами на C# 2005 для профессионалов.
М. Мак-Дональд, М. Шпушта. Microsoft ASP.NET 2.0 с примерами на C# 2005 для профессионалов
Заказать на Озоне
Подробнее


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

Direct3D для Visual C++
Урок 17. Создание нескольких фигур

Разумеется, в реальных программах в сценах присутствует не одна фигура, а несколько. При этом они зачастую существуют независимо друг от друга (например, некий монстр может двигаться относительно других монстров и относительно стен и т. п.). Сейчас мы посмотрим, как это можно сделать.

В качесвие основы возмем урок 9, в котором мы рисовали куб. Сейчас мы сделаем в нашей программе два куба, причем они будут двигаться независимо друг от друга.

Начинаем вносить изменения в листинг 9-го урока.

Для начала внесем изменения в функцию SetupMatrices. А именно, добавим для нее три параметра для задания двух координат и угла поворота (в принципе, число новых параметров может быть любое - в зависимости от того, что за движение мы захотим осуществлять. Мы в нашем примере будем перемещать объекты в горизонтальной плоскости и вращать - именно поэтому у нас и будет только три новых параметра). Измененая функция будет выглядить вот так:

VOID SetupMatrices(float x, float y, float angle)
{
    D3DXMATRIXA16 matWorld;
    D3DXMATRIXA16 matWorldRotation;
    D3DXMATRIXA16 matWorldTranslation;

    D3DXMatrixRotationY( &matWorldRotation, angle );
    
    D3DXMatrixTranslation(&matWorldTranslation, x, y, 0);
    
    D3DXMatrixMultiply(&matWorld, &matWorldTranslation, &matWorldRotation);

    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

    D3DXVECTOR3 vEyePt( 0.0f, 3.0f, -5.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

Теперь мы напишем функцию DrawMyMesh, которая и будет выводить наши фигуры в некотором месте. Эта функция будет вызывать внутри себя измененную выше функцию SetupMatrices и сразу отрисовывать фигуру. Вот ее код:

//Вывод фигуры в определеном месте и под определенным углом.
VOID DrawMyMesh(float x, float y, float angle){
    SetupMatrices(x, y, angle);
    g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);
}

Как вы видите, мы тут сначала делаем преобразование координат, а потом в преобразованных координатах рисуем нашу фигуру.

И, наконец, мы должны изменить функцию Render. А именно, в ней мы должны изменить непосредственно отрисовку - т. е. код между вызовами BeginScene и EndScene. Вот новый код:

    if(SUCCEEDED(g_pd3dDevice->BeginScene()))
    {
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX));
        g_pd3dDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);//6:

        // Изменение смещения и угла поворота.
        n += 0.01;
        angle += 0.01;

        // Рисование 2-х объектов.
        DrawMyMesh(0, 0, angle);
        DrawMyMesh(n, 0, -angle*2);
        
        // Конец отрисовки сцены.
        g_pd3dDevice->EndScene();
    }

Как вы видите, самое главное тут - это два вызова нашей функции DrawMyMesh (по одному разу для каждой фигуры). Вызываем мы их с разными параметрами - в частности, первая фигура всегда будет находится в центре (так как x и y не меняются), а вторая будет постепенно удаляться от центра (так как перрвый параметр n постоянно увеличивается). Кроме того, наши две фигуры будут вращаться, причем в разные стороны (так как третий параметр у них идет с разным знаком). Скорости вращения тоже будут различне (одна фигура будет вращаться в два раза быстрее другой).

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


Parking.ru. Качественный виртуальный хостинг на платформе Windows(r): поддержка NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты. Управляемый выделенный хостинг на платформе Windows(r): производительные серверы, профессиональная поддержка, аренда ПО Microsoft(r), безопасность, гарантии. http://www.parking.ru


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

В избранное