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

Уроки по DirectX

  Все выпуски  

Уроки по DirectX


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

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

Джим Адамс. DirectX: продвинутая анимация.
Джим Адамс. DirectX: продвинутая анимация
Заказать на Озоне

Подробнее


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

Direct3D для Visual C++
Урок 9. Рисование куба

На прошлом уроке мы нарисовали вращающийся треугольник. Давайте сейчас сделаем что-нибудь посложнее - например, куб.

Для рисования куба мы мысленно представим его как объединение 12 треугольников - т. е. каждую грань мы разбиваем на 2 треугольника. Обход вершин каждого треугльника происходит против часовой стрелки, если смотреть на наш куб снаружи. Это, в частности, означает, что вершины невидимых для нас треугольников будут обходиться как раз в противоположном направлении - т. е. по часовой стрелке.

Начинаем изменять код прошлого урока.

Во-первых, нам надо задать 12 треугольников в методе InitVB. Раз треугольников 12, то их вершин будет 36. Тут главное сделать все аккуратно - помните, что вершины мы должны обходить против часовой стрелки, если смотреть снаружи куба. Например, наш код можно изменить так:

HRESULT InitVB()
{
    // Задаем 36 вершин 12 треугольников.
    CUSTOMVERTEX vertices[] =
    {
        // Front.
        { -1.0f, -1.0f, -1.0f, 0xffffff00, },
        {  1.0f, -1.0f, -1.0f, 0xffffff00, },
        {  1.0f,  1.0f, -1.0f, 0xffffff00, },

        { -1.0f, -1.0f, -1.0f, 0xffffff00, },
        {  1.0f,  1.0f, -1.0f, 0xffffff00, },
        { -1.0f,  1.0f, -1.0f, 0xffffff00, },

        // Left.
        { -1.0f, -1.0f,  1.0f, 0xff0000ff, },
        { -1.0f, -1.0f, -1.0f, 0xff0000ff, },
        { -1.0f,  1.0f, -1.0f, 0xff0000ff, },

        { -1.0f, -1.0f,  1.0f, 0xff0000ff, },
        { -1.0f,  1.0f, -1.0f, 0xff0000ff, },
        { -1.0f,  1.0f,  1.0f, 0xff0000ff, },

        // Back.
        {  1.0f, -1.0f,  1.0f, 0xffff00ff, },
        { -1.0f,  1.0f,  1.0f, 0xffff00ff, },
        {  1.0f,  1.0f,  1.0f, 0xffff00ff, },

        { -1.0f,  1.0f,  1.0f, 0xffff00ff, },
        {  1.0f, -1.0f,  1.0f, 0xffff00ff, },
        { -1.0f, -1.0f,  1.0f, 0xffff00ff, },

        // Right.
        {  1.0f, -1.0f, -1.0f, 0xff999999, },
        {  1.0f,  1.0f,  1.0f, 0xff999999, },
        {  1.0f,  1.0f, -1.0f, 0xff999999, },

        {  1.0f, -1.0f, -1.0f, 0xff999999, },
        {  1.0f, -1.0f,  1.0f, 0xff999999, },
        {  1.0f,  1.0f,  1.0f, 0xff999999, },

        // Top.
        {  1.0f,  1.0f,  1.0f, 0xff339966, },
        { -1.0f,  1.0f, -1.0f, 0xff339966, },
        {  1.0f,  1.0f, -1.0f, 0xff339966, },

        { -1.0f,  1.0f, -1.0f, 0xff339966, },
        {  1.0f,  1.0f,  1.0f, 0xff339966, },
        { -1.0f,  1.0f,  1.0f, 0xff339966, },

        // Buttom.
        { -1.0f, -1.0f,  1.0f, 0xff33ff00, },
        {  1.0f, -1.0f, -1.0f, 0xff33ff00, },
        { -1.0f, -1.0f, -1.0f, 0xff33ff00, },

        {  1.0f, -1.0f, -1.0f, 0xff33ff00, },
        { -1.0f, -1.0f,  1.0f, 0xff33ff00, },
        {  1.0f, -1.0f,  1.0f, 0xff33ff00, },
    };
    ...

Тут мы еще для наглядности каждую грань раскрашиваем в свой цвет.

Во-вторых, надо в этом же методе InitVB при создании вершинного буфера указать новое число вершин - 36:

    ...
    // Создаем вершиный буфер.
    if(FAILED(g_pd3dDevice->CreateVertexBuffer(
        36*sizeof(CUSTOMVERTEX),
        0, D3DFVF_XYZ|D3DFVF_DIFFUSE,
        D3DPOOL_DEFAULT, &g_pVB, NULL )))
    {
    ...

И в-третьих, необходимо в методе Render задать новое число треугольников - 12:

VOID Render()
{
        ...
        // Отрисовка треугольников.
        g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);
        // Конец отрисовки сцены.
        g_pd3dDevice->EndScene();
    }
    ...
}

И, наконец, нам надо поменять одну строку в методе InitD3D:

HRESULT InitD3D( HWND hWnd )
{
    ...
    g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );
    ...
}

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

Компилируем и запускаем программу. Результатом будет вращающийся куб.

Рассылки сайта 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 Алексеев Игорь

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.directxlessons
Отписаться

В избранное