DirectX rotacija objekata

poruka: 5
|
čitano: 1.811
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
14 godina
neaktivan
offline
DirectX rotacija objekata

Trebao bi malu pomoc, uglavnom imam iscrtavanje trokuta i sad bi htio da se okrece oko svoje osi (po x osi),

pokusavam na sve moguce nacine, ali ne radi, pa me zanima u cemu grijesim?

 

 

main.cpp

#include "stdafx.h"

#include "directX9.h"

 

int WIDTH = 1024;

int HEIGHT = 768;

 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

{

HWND hwnd;

WNDCLASS wndclass;

MSG msg;

 

wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = WndProc;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

wndclass.hInstance = hInstance;

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName = NULL;

 

wndclass.lpszClassName = L"Experimental Game Project";

 

if (!RegisterClass(&wndclass)) 

{

   return 0;

}

hwnd = CreateWindow(L"Experimental Game Project",

L"Experimental Game Project",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

WIDTH,

HEIGHT,

NULL,

NULL,

hInstance,

NULL);

 

DX_init(hwnd); /* >>>> Initialize DirectX */

 

ShowWindow(hwnd, iCmdShow);

UpdateWindow(hwnd);

 

while(true)

{

 while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))

 {

TranslateMessage(&msg);

DispatchMessage(&msg);

 }

     if(msg.message == WM_QUIT) break;

DX_render(); /* >>>> DirectX render */

}

 

return msg.wParam;

}

 

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT ps;

RECT rect;

switch (message)

{

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

GetClientRect(hwnd, &rect);

EndPaint(hwnd, &ps);

break;

 

case WM_DESTROY:

  DX_clean(); /* >>>> DirectX cleanup */

PostQuitMessage(0);

break;

 

default:

     return DefWindowProc(hwnd, message, wParam, lParam);

   }

}

 

DirectX.cpp

#include "stdafx.h"

#include <d3d9.h>

#include <d3d9types.h>

#include <d3d9caps.h>

#include "directX9.h"

#include <d3dx9.h>

 

 

#pragma comment (lib,"d3d9.lib")

#pragma comment (lib,"d3dx9.lib");

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

 

LPDIRECT3D9 d3d;

LPDIRECT3DDEVICE9 d3ddev;

LPDIRECT3DVERTEXBUFFER9 v_buffer;

 

D3DXMATRIX matrixRotate;

 

void DX_init (void);

void DX_render (void);

void DX_clean (void);

 

struct customVertex

{

float x,y,z,rhw;

DWORD color;

};

 

void DX_init (HWND hWnd)

{

customVertex vertices [] =

{

{ 480.0f, 150.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },

     { 680.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },

     { 280.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },

};

 

d3d = Direct3DCreate9(D3D_SDK_VERSION);

D3DPRESENT_PARAMETERS d3dpp;

VOID * pVoid;

 

ZeroMemory(&d3dpp,sizeof(d3dpp));

d3dpp.Windowed = true;

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

d3dpp.hDeviceWindow = hWnd;

d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&d3ddev);

 

  d3ddev->CreateVertexBuffer(3*sizeof(customVertex),0,CUSTOMFVF,D3DPOOL_MANAGED,&v_buffer,NULL);

v_buffer->Lock(0,0,(void**)&pVoid,0);

memcpy(pVoid,vertices,sizeof(vertices));

v_buffer->Unlock();

}

 

void DX_render (void)

{

 

IDirect3DSurface9 * backBuffer = NULL;

static float index = 0.0f; index +=0.5f;

 

d3ddev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);

d3ddev->BeginScene();

 

d3ddev->SetFVF(CUSTOMFVF);

d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);

 

d3ddev->SetStreamSource(0,v_buffer,0,sizeof(customVertex));

D3DXMatrixRotationX(&matrixRotate,index);

d3ddev->SetTransform(D3DTS_WORLD ,&matrixRotate);

 

d3ddev->EndScene();

d3ddev->Present(NULL,NULL,NULL,NULL);

}

 

void DX_clean (void)

{

v_buffer->Release();

d3d->Release();

d3ddev->Release();

}

Poruka je uređivana zadnji put uto 25.9.2012 1:52 (NiGHT_RiDER92).
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
DirectX rotacija objekata

Pa nije valjda da nitko ne zna??

Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: DirectX rotacija objekata

Uf, nisam baš stručnjak, malo sam se nagnjavio dok nisam uspio kompajlirati taj tvoj kod u mingw-u bez directx SDK-a da bih vidio što točno ne valja jer ti nisi naveo.

 

Uglavnom, ovo je problem koji imaš. A ovdje imaš opisano rješenje.

 

Evo kako sam prepravio render funkciju:

void DX_render(void)
{
    IDirect3DSurface9 *backBuffer = NULL;
    static float index = 0.0f;
    index +=0.05f;
    D3DXMATRIX rotationMatrix, viewMatrix, projectionMatrix;

    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    d3ddev->BeginScene();
    d3ddev->SetFVF(CUSTOMFVF);
    d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(customVertex));

    D3DXMatrixRotationZ(&rotationMatrix, index);
    d3ddev->SetTransform(D3DTS_WORLD, &rotationMatrix);

    D3DXVECTOR3 cameraPosition(0.0f, 0.0f, 10.0f),
                cameraTarget(0.0f, 0.0f, 0.0f),
                upDirection(0.0f, 1.0f, 0.0f);

    D3DXMatrixLookAtLH(&viewMatrix, &cameraPosition, &cameraTarget, &upDirection);
    d3ddev->SetTransform(D3DTS_VIEW, &viewMatrix);

    D3DXMatrixPerspectiveFovLH(&projectionMatrix, D3DXToRadian(60), (FLOAT)1024/(FLOAT)768, 1.0f, 100.0f);
    d3ddev->SetTransform(D3DTS_PROJECTION, &projectionMatrix);

    d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
    d3ddev->EndScene();

    d3ddev->Present(NULL, NULL, NULL, NULL);
}

 

Ovako inicijalizacijsku funkciju:

void DX_init(HWND hWnd)
{
    customVertex vertices [] =
    {
        { 0.00f, 1.50f, 0.5f,  D3DCOLOR_XRGB(0, 0, 255) },
        { -1.5f, -1.5f, 0.5f,  D3DCOLOR_XRGB(0, 0, 255) },
        { 1.50f, -1.5f, 0.5f,  D3DCOLOR_XRGB(0, 0, 255) },
    };

    d3d = Direct3DCreate9(D3D_SDK_VERSION);
    D3DPRESENT_PARAMETERS d3dpp;
    VOID *pVoid;

    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = true;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);

    d3ddev->CreateVertexBuffer(3*sizeof(customVertex), 0, CUSTOMFVF, D3DPOOL_MANAGED, &v_buffer, NULL);
    v_buffer->Lock(0, 0, (void **)&pVoid, 0);
    memcpy(pVoid, vertices, sizeof(vertices));
    v_buffer->Unlock();
    d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);
}

 

i još par sitnih izmjena:

#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)

 

struct customVertex
{
    float x, y, z;
    DWORD color;
};

 

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
Poruka je uređivana zadnji put čet 27.9.2012 23:15 (rustweaver).
14 godina
neaktivan
offline
Re: DirectX rotacija objekata

Hvala na pomoci, vec sam mislio da nitko uopce ne zna to rijesiti. 

 

P.S.

Naveo sam problem, trokut kojeg iscrtavam se ne rotira

(a prema kodu bi se trebao, pa mi nije bilo jasno zasto ... )

Poruka je uređivana zadnji put pet 28.9.2012 13:05 (NiGHT_RiDER92).
14 godina
neaktivan
offline
Re: DirectX rotacija objekata
NiGHT_RiDER92 kaže...

Hvala na pomoci, vec sam mislio da nitko uopce ne zna to rijesiti. 

 

P.S.

Naveo sam problem, trokut kojeg iscrtavam se ne rotira

(a prema kodu bi se trebao, pa mi nije bilo jasno zasto ... )

 

Kod objekata imaš world i local space plus camera view frustum, znaći kada transformiraš objekt trebaš obratiti pozornost na to dal radiš sa world ili local osima, plus dal ti je sve skupa u view frustumu. Ovo je pravilo koje manje više vrijedi za sve render apije.

 

 

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice