Transformed Vertices; x-Achse vertauscht



  • Hallo,

    Ich kann mir vorstellen, dass die Lösung dieses Problems relativ einfach sein wird, für mich nur nicht. Ich habe folgenden Code:

    #include <windows.h>
    #include <windowsx.h>
    #include <d3d9.h>
    #include <d3dx9.h>
    
    #define SCREEN_WIDTH 1680
    #define SCREEN_HEIGHT 1050
    #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
    #define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
    
    #pragma comment (lib, "d3d9.lib")
    #pragma comment (lib, "d3dx9.lib")
    
    LPDIRECT3D9 d3d;    
    LPDIRECT3DDEVICE9 d3ddev;    
    LPDIRECT3DVERTEXBUFFER9 t_buffer = NULL;    
    
    float x,y,z =1.0f;
    
    void initD3D(HWND hWnd);    
    void render_frame(void);    
    void cleanD3D(void);    
    void init_graphics(void);    
    
    struct CUSTOMVERTEX {FLOAT X, Y, Z; DWORD COLOR;};
    #define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)
    
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
        HWND hWnd;
        WNDCLASSEX wc;
    
        ZeroMemory(&wc, sizeof(WNDCLASSEX));
    
        wc.cbSize = sizeof(WNDCLASSEX);
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = (WNDPROC)WindowProc;
        wc.hInstance = hInstance;
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.lpszClassName = "WindowClass";
    
        RegisterClassEx(&wc);
    
        hWnd = CreateWindowEx(NULL, "WindowClass", "Our Direct3D Program",
                              WS_EX_TOPMOST | WS_POPUP, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
                              NULL, NULL, hInstance, NULL);
    
        initD3D(hWnd);
    
        MSG msg;
    
        while(TRUE)
        {
            DWORD starting_point = GetTickCount();
    
            if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                if (msg.message == WM_QUIT)
                    break;
    
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    
            render_frame();
    
            if(KEY_DOWN(VK_ESCAPE))
                PostMessage(hWnd, WM_DESTROY, 0, 0);
    
            while ((GetTickCount() - starting_point) < 25);
        }
    
        cleanD3D();
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
            case WM_DESTROY:
                {
                    PostQuitMessage(0);
                    return 0;
                } break;
        }
    
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
    
    void initD3D(HWND hWnd)
    {
        d3d = Direct3DCreate9(D3D_SDK_VERSION);
    
        D3DPRESENT_PARAMETERS d3dpp;
    
        ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.Windowed = FALSE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow = hWnd;
        d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
        d3dpp.BackBufferWidth = SCREEN_WIDTH;
        d3dpp.BackBufferHeight = SCREEN_HEIGHT;
        d3dpp.EnableAutoDepthStencil = TRUE;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    
        d3d->CreateDevice(D3DADAPTER_DEFAULT,
                          D3DDEVTYPE_HAL,
                          hWnd,
                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                          &d3dpp,
                          &d3ddev);
    
        init_graphics();    
    
        d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);    
        d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE);    
    
        return;
    }
    
    void render_frame(void)
    {
        d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
        d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    
        d3ddev->BeginScene();
    
        d3ddev->SetFVF(CUSTOMFVF);
    
        D3DXMATRIX matView;    
        D3DXMatrixLookAtLH(&matView,
        &D3DXVECTOR3 (0.0f, 5.0f, 25.0f),    
        &D3DXVECTOR3 (0.0f, 0.0f, 0.0f),      
        &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));    
        d3ddev->SetTransform(D3DTS_VIEW, &matView);    
    
        D3DXMATRIX matProjection;    
        D3DXMatrixPerspectiveFovLH(&matProjection,
                                   D3DXToRadian(45),    
                                   (FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, 
                                   1.0f,   
                                   100.0f);    
        d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); 
    
        static float index = 0.0f; index+=0.03f; 
        D3DXMATRIX matRotateY;    
        D3DXMatrixRotationY(&matRotateY, index); 
    
    	D3DXMATRIX matTranslate;
    	D3DXMatrixTranslation(&matTranslate,x,y,z);
    	if(KEY_DOWN(VK_LEFT))
    		x-=0.5f;
    	if(KEY_DOWN(VK_RIGHT))
    		x+=0.5f;
    
        d3ddev->SetTransform(D3DTS_WORLD, &(matRotateY*matTranslate));    
    
        d3ddev->SetStreamSource(0, t_buffer, 0, sizeof(CUSTOMVERTEX));
    
    	d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
    	d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 4, 2);
    	d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 8, 2);
    	d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 12, 2);
    	d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 16, 2);
    	d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 20, 2);
    
        d3ddev->EndScene(); 
    
        d3ddev->Present(NULL, NULL, NULL, NULL);
    
        return;
    }
    
    void cleanD3D(void)
    {
        t_buffer->Release();    
        d3ddev->Release();    
        d3d->Release();    
    
        return;
    }
    
    void init_graphics(void)
    {
    
        struct CUSTOMVERTEX t_vert[] =
        {
    
        { -3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { -3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 255), },
    
        { -3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { -3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { 3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 255), },
    
        { -3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { -3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 255), },
    
        { -3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { -3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { 3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 255), },
    
        { 3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { 3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 255), },
    
        { -3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { -3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { -3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { -3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 255), },
        };
    
        d3ddev->CreateVertexBuffer(24*sizeof(CUSTOMVERTEX),
                                   0,
                                   CUSTOMFVF,
                                   D3DPOOL_MANAGED,
                                   &t_buffer,
                                   NULL);
    
        VOID* pVoid;    
    
        t_buffer->Lock(0, 0, (void**)&pVoid, 0);
        memcpy(pVoid, t_vert, sizeof(t_vert));
        t_buffer->Unlock();
    
        return;
    }
    

    Problem: Wenn ich die rechte Cursor-Taste betätige fährt der Würfel nach links, obwohl ja eigentlich x**+**= 0.5f; also auf der x-Achse 0.5 einheiten nach rechts(ins positive).Gleiches gilt umgekehrt für die linke Cursortaste. Was muss ich also ändern damit es umgekehrt funktioniert, klar ich könnte natürlich + und - vertauschen, das ist aber auch nicht Sinn der Sache(gleiches gilt für:

    [cpp]
    D3DXMATRIX matView;
    D3DXMatrixLookAtLH(&matView,
    &D3DXVECTOR3 (0.0f, 5.0f, 25.0f),
    &D3DXVECTOR3 (0.0f, 0.0f, 0.0f),
    &D3DXVECTOR3 (0.0f, **-**1.0f, 0.0f));
    d3ddev->SetTransform(D3DTS_VIEW, &matView);
    [/cpp]

    zumal ich hier dann dass Objekt umgekehrt nach unten bzw. nach oben bewege. ).

    Vielen Dank im Voraus!

    P.S. In welcher Einheit sind eigentlich transformierte Welt-Koordinaten, bzw um wie viele Pixel verschiebe ich sie bei einer Welt-Einheit?



  • 1. Du wirfst hier komplett unkommentierten, mit Vertices arbeitenden Riesencode rein und erwartest, dass Dir hier irgend jemand helfen kann? O_o
    2. Kann es sein, dass Du den Code einfach nur kopiert hast?

    Wenn ich den Code so ansehe, finde ich das Problem nicht.
    (Das liegt aber teils auch an den Kommentaren.)
    Ich würde aber auf die Kameraeinstellung tippen.
    Das Koordinatensystem wirst Du ja wohl kaum irgendwie verstellt haben. Oo

    PS: Das kommt drauf an, wie Du alles plazierst und die Kamera dann setzt.
    Angegeben wird alles in float. Die "Auflösung" kannst Du allerdings selbst bestimmen. (Naja, bis zu einem gewissen Grad)



  • 1. Wie bereits gesagt wurde: Poste den relevanten (!) Code und nicht das komplette Zeug.
    2. Ist ja ganz normal, dass sich das Objekt aus Sicht der Kamera nach links bewegt, wenn das Objekt auf der x-Achse nach rechts wandert aber die Kameraposition bei (0.0f, 5.0f, 25.0f) ist und auf den Ursprung schaut. Um das zu ändernd musst du lediglich dem eyePoint der Kamera einen negativen z-Wert geben, also z.B. D3DXVECTOR3 (0.0f, 5.0f, -25.0f)
    3. Um wieviele Pixel sich das Objekt bewegt hängt (u.a.) von der Projektionsmatrix und der Backbuffergröße ab.



  • Tut mir echt Leid, ich hatte 2 Versionen, eine wollte ich kopieren und dann hier einfügen und eine wollte ich nur für mich (Gründe sind ja egal) woanders hinkopieren. Ich hab aber anscheinend einmal vergessen neben Strg+A auch noch Strg+C zu drücken, denk ich zumindest. Vielen Dank, dass ihr trotz des unüberschaubaren Codes versucht habt mir zu helfen und damit auch Erfolg hattet!

    Ich bin immer von rechtshändischen Koordinatensystem ausgegangen.


Anmelden zum Antworten