Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Матрицы

13K
21 июля 2009 года
karimchik
65 / / 16.06.2008
Товарищи эксперты!Помогите пожалуйста!
Проблема в том , что не работают матрицы, или ещё что то, не могу понять.
Код:
#include <stdafx.h>      ///Подключил .h Файлы
#include <windows.h>
#include <d3d9.h>
#include <d3dx9math.h>

IDirect3D9 *D3dObject;                  /////Всё по стандартному
IDirect3DDevice9 *D3dDevice;
IDirect3DVertexBuffer9 *D3dVertexBuffer;

D3DXMATRIX M_world; /////Матрицы....
D3DXMATRIX M_cam;
D3DXMATRIX M_pro;

D3DXVECTOR3 cam(0.0f,-100.0f,0.0f);  ////Векторы камер
D3DXVECTOR3 at(0.0f,0.0f,0.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);


struct Vertex           ////Структура Нашего "Куба" ))
{
    float x, y, z,rhw;
    DWORD color;
};

Vertex cube[] = ////Собственно сам кубик))
        {                      
            // лицевая грань
           
            {20,  20, 4, D3DCOLOR_XRGB(0,0,0)},
            { 60,  20, 4, D3DCOLOR_XRGB(0,0,0)},
            { 40, 40, 4, D3DCOLOR_XRGB(0,0,0)}
                       
        };




#define CUSTOM_FVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) ////Эти...Как их там... ИКС_ИГРЕК_ЗЕД проекции и Цвет

LRESULT __stdcall MainWindowProc /////Всё по стандартному
    (
        HWND hwnd,
        UINT msg,
        WPARAM wParam,
        LPARAM lParam
    );


int __stdcall WinMain /////Всё по стандартному
    (
        HINSTANCE instance,
        HINSTANCE previousInstance,
        LPSTR commandLine,
        int commandShow
    )
{
    WNDCLASS wc;   /////Всё по стандартному
    ZeroMemory(&wc, sizeof(wc));   /////Всё по стандартному

    wc.style = CS_HREDRAW | CS_VREDRAW;  /////Всё по стандартному
    wc.hInstance = instance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = "mywndclass";
    wc.lpfnWndProc = MainWindowProc;

    if( !RegisterClass(&wc) )
        return 0;  

    HWND AppWnd = CreateWindow   /////Всё по стандартному
        (
            "mywndclass",
            "d3d test",
            WS_OVERLAPPEDWINDOW,
            40, 40, 500, 500,
            NULL,
            NULL,
            instance,
            NULL
        );

    if( !AppWnd )  /////Всё по стандартному
        return 0;

    D3dObject = Direct3DCreate9(D3D_SDK_VERSION);  /////Всё по стандартному
    if( !D3dObject )
        return 0;

    D3DPRESENT_PARAMETERS d3dpp;    /////Всё по стандартному
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
   
    d3dpp.Windowed = TRUE; /////Всё по стандартному
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

    HRESULT res;    /////Всё по стандартному
    res = D3dObject -> CreateDevice  /////Создаём девайс
                    (
                        D3DADAPTER_DEFAULT,
                        D3DDEVTYPE_HAL,
                        AppWnd,
                        D3DCREATE_HARDWARE_VERTEXPROCESSING,
                        &d3dpp,
                        &D3dDevice
                    );



    if( res != D3D_OK )/////Всё подчищяем
    {
        D3dVertexBuffer->Release();
        D3dDevice -> Release();
        D3dObject -> Release();
        return 0;
    }


    ShowWindow(AppWnd, commandShow); /////Всё по стандартному
    UpdateWindow(AppWnd);

    MSG msg;     /////Обработка сообщений

    while( GetMessage(&msg, NULL, 0, 0) > 0 )
    {
        DispatchMessage(&msg);
    }
   
    D3dVertexBuffer -> Release();
    D3dDevice -> Release();
    D3dObject -> Release();

    return msg.wParam;
}

LRESULT __stdcall MainWindowProc /////Всё по стандартному
    (
        HWND hwnd,
        UINT msg,
        WPARAM wParam,
        LPARAM lParam
    )
{

    switch(msg) /////Всё по стандартному
    {
        case WM_PAINT:
 
    D3DXMatrixLookAtLH(&M_cam,&cam,&at,&up);  /////Камера
    D3DXMatrixPerspectiveFovLH(&M_pro,D3DX_PI/4,1,1,250); /////Перспектива

    D3dDevice->SetTransform(D3DTS_WORLD,&M_world); /////Всё по стандартному
    D3dDevice->SetTransform(D3DTS_VIEW,&M_cam); /////Всё по стандартному
    D3dDevice->SetTransform(D3DTS_PROJECTION,&M_pro); /////Всё по стандартному

    D3dDevice -> CreateVertexBuffer/////Буффер
                    (
                        3 * sizeof(Vertex),
                        0,
                        CUSTOM_FVF,
                        D3DPOOL_DEFAULT,
                        &D3dVertexBuffer,
                        NULL
                    );
    void *p;
    D3dVertexBuffer -> Lock(0, 0, &p, 0);/////Заполнение
    CopyMemory(p, cube, 3 * sizeof(Vertex));
    D3dVertexBuffer -> Unlock();


            D3dDevice -> Clear/////Всё по стандартному
                (
                    0,
                    NULL,
                    D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                    D3DCOLOR_XRGB(255,255,255),
                    1,
                    0
                );

    D3dDevice -> BeginScene();/////Начинем
   
    D3dDevice -> SetStreamSource(0, D3dVertexBuffer, 0, sizeof(Vertex));/////Поток
    D3dDevice -> SetFVF(CUSTOM_FVF);
    D3dDevice -> DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1);/////рисуем
    D3dDevice -> EndScene();/////КОНЧАЕМ))))

    D3dDevice -> Present(NULL, NULL, NULL, NULL);/////Смотрим))

    RECT wndRect;/////Сам не знаю на*иг это здалось ))
    GetClientRect(hwnd, &wndRect);
    ValidateRect(hwnd, &wndRect);
           
            return 0;

        case WM_DESTROY: /////Дестрой он и в Африке Дестрой ))

            PostQuitMessage(0);
            return 0;              
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);/////Всё по стандартному
}

А ещё ,при правке
 
Код:
#define CUSTOM_FVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

в
 
Код:
#define CUSTOM_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)

и изменении сруктуры следовательно,не отображается треугольник.
13K
26 июля 2009 года
karimchik
65 / / 16.06.2008
После более тщятельного осмотра кода нашёл лексическую и алгоретмическую ошибку.
Во первых
 
Код:
D3DXVECTOR3 cam(0.0f,-100.0f,0.0f);

переправил на
 
Код:
D3DXVECTOR3 eye( 0, -100, -150);

И второе
 
Код:
D3dDevice -> DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1);

переправил на
 
Код:
D3dDevice -> DrawPrimitive( D3DPT_TRIANGLELIST, 0, 3);

Поясняю.В первом случии переместил вектор камеры по Z координате на 100 единиц назад.
А во втором случии переправил кол.рисуемых примитив с 1-го до 3-ёх.
Вот и вся ошибка)
9
26 июля 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: karimchik

 
Код:
D3DXVECTOR3 cam(0.0f,-100.0f,0.0f);

переправил на
 
Код:
D3DXVECTOR3 eye( 0, -100, -150);


И чему вас эти чудовищные ошибки научили?

13K
28 июля 2009 года
karimchik
65 / / 16.06.2008
Ошибка не моя , а с книги "Графика в Формате DirectX9" - Алена Торна!
По книги в листинге именно такие координаты!
И тем более была ещё одна ошибка,моя , по отрисовки 3-ёх примитив, а не одной.
9
28 июля 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: karimchik
... по отрисовки 3-ёх примитив....


Эх, сильно сказано! вмемориз...

13K
28 июля 2009 года
karimchik
65 / / 16.06.2008
Цитата:
Эх, сильно сказано! вмемориз...


Не понял ,что такое "вмемориз..."))
А так ,проблема разрешена)

9
28 июля 2009 года
Lerkin
3.0K / / 25.03.2003
Ну и славненько. Прикроем этот безполезняк.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог