Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565

    C++ / DirectX - Dubbi sulle matrici

    Salve ragazzi.
    Anche se molto a rilento, gli studi sulle DirectX9 continuano, e sono finalmente arrivato alle matrici . Leggendo varie guide inglesi sono arrivato a stendere questo listato
    codice:
    #include <windows.h>
    #include <d3dx9.h>
    #pragma comment (lib,"d3d9.lib")
    #pragma comment (lib,"d3dx9.lib")
    #define CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
    
    typedef struct _vertex_
    {
    	float x,y,z;
    	WORD Colore;
    } Vertex;
    
    void Render();
    void Chiudi();
    HRESULT Init3D(HWND hWnd);
    bool InitVertex();
    void Posiziona();
    
    LPDIRECT3D9 g_pD3D = NULL;
    LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
    LPDIRECT3DVERTEXBUFFER9 g_pVX = NULL;
    const char NomeClasse[] = "Finestra";
    Vertex Vertici[] = 
    {
        { 150.0f,  50.0f, 0.5f, D3DCOLOR_ARGB(0,255,123,214), },
        { 250.0f, 250.0f, 0.5f, D3DCOLOR_ARGB(0,124,255,120), },
        { 50.0f, 250.0f, 0.5f,  D3DCOLOR_ARGB(0,0,184,255), },
    };
    
    LRESULT CALLBACK WndProc (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
    	switch (Msg)
    		{
    			case WM_CLOSE:
    				Chiudi();
    				DestroyWindow(hWnd);
    			break;
    			case WM_DESTROY:
    				PostQuitMessage(0);
    			break;
    			case WM_PAINT:
    				Render();
    				ValidateRect(hWnd,NULL);
    			break;
    		}
    			return DefWindowProc(hWnd,Msg,wParam,lParam);
    }
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
    {
    
    
    	WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, 
                          GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                          NomeClasse, NULL };
        RegisterClassEx( &wc );
    
        HWND hWnd = CreateWindow( NomeClasse, "D3D Tutorial 01: CreateDevice", 
                                  WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                                  GetDesktopWindow(), NULL, wc.hInstance, NULL );
    	if( SUCCEEDED (Init3D(hWnd) ) )
    		{
    		InitVertex();
    		ShowWindow(hWnd,SW_SHOWDEFAULT);
    		UpdateWindow(hWnd);
    		MessageBox(NULL,"Gnam",NULL,MB_OK);
    		}
    
    	else
    		{
    			MessageBox(NULL,"Impossibile inizializzare il Device","Errore",MB_OK);
    		}
    	MSG Msg;
    
    	while(GetMessage(&Msg,NULL,0,0) > 0)
    		{
    			TranslateMessage(&Msg);
    			DispatchMessage(&Msg);
    		}	
    	return 0;
    }
    HRESULT Init3D (HWND hWnd)
    {
    	if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
    			return E_FAIL;
    		
    	  D3DPRESENT_PARAMETERS d3dpp;
    	  ZeroMemory(&d3dpp,sizeof(d3dpp));
    
    		d3dpp.BackBufferCount = 1;
    		d3dpp.Windowed = TRUE;
    		d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    		d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    
    	if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
    		D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
    	{
    		MessageBox(NULL,"Impossibile creare il Device","Adso",MB_OK);
    		return E_FAIL;
    	}
    		return S_OK;
    }
    bool InitVertex()
    {
    	if(FAILED(g_pd3dDevice->CreateVertexBuffer(3 * sizeof(Vertex),0,
    		CUSTOMVERTEX,D3DPOOL_MANAGED,&g_pVX,NULL)))
    	{
    		MessageBox(NULL,"Errore nella creazione del buffer dei vertici","Adso",MB_OK);
    		return false;
    	}
    		VOID *PVertex;
    
    		g_pVX->Lock(0,sizeof(Vertex),(void**)&PVertex,NULL);
    
    		memcpy(PVertex,Vertici,sizeof(Vertici));
    
    		g_pVX->Unlock();
    		
    		return true;
    }
    
    void Chiudi()
    {
    	if (g_pVX != NULL)
    		g_pVX->Release();
    	if (g_pd3dDevice != NULL)
    		g_pd3dDevice->Release();
    	if (g_pD3D != NULL)
    		g_pD3D->Release();
    }
    void Render()
    {
    	if (NULL == g_pd3dDevice)
    		return;
    
    	g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(110,211,123), 1.0f, 0 );
    
    	g_pd3dDevice->BeginScene();
    		g_pd3dDevice->SetStreamSource(0,g_pVX,0,sizeof(Vertex));
    		g_pd3dDevice->SetFVF(CUSTOMVERTEX);
    		Posiziona();
    		g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
    	g_pd3dDevice->EndScene();
    	g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
    }
    
    void Posiziona()
    {
    	D3DXMATRIX FinPos;
    	D3DXMatrixIdentity(&FinPos);
    	D3DXMatrixTranslation(&FinPos,10.0f,20.0f,50.0f);	
    	g_pd3dDevice->SetTransform(D3DTS_WORLD,&FinPos);
    }
    Lo riporto anche qui nel caso vi possa andare meglio...
    http://www.phpfi.com/87349

    Adesso sto cercando di capire un po le matrici: ho quindi provato a fare una translazione di un trinagolo creato utilizzando l'index buffer...
    Ora compila tutto bene, ma purtroppo non si vede un bel niente, e all'inizio non capivo.. :master:
    Un amico ha detto che è normale perchè se non imposti la telecamera non vedrai niente. Ora...come si crea una telecamera? Ho cercato inutilmente nell'interfaccia IDirect3DDevice9 una funzione tipo CreateCamera(), anche nella documentazione, ma niente...forse si deve creare da se?
    E poi volevo un po di chiaramento (ma in italiano), sulle matrici...
    Ultima cosa: cosa sono le interfaccie in C++?
    Grazie mille!

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Porto sopra, se non erro xegallo se ne intende molto...

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Ehm...aiuto..

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    51
    Non conosco le DirectX.
    Tuttavia, se funzionano come le openGL, non c'e' nessun comando che crea la camera. Nelle openGL, la camera esiste di default, si trova nelle coordinate del mondo 0,0,0 e guarda sempre nella stessa direzione.

    Poi utilizzando le matrici, puoi trasformare sia la posizione della camera che quella del mondo. Ma non c'e' un comando esplicito che crea la camera. La camera c'e' sempre, si tratta solo di trasformare la visualizzazione o la posizione degli oggetti affinche' questi ultimi rientrino nel suo campo visivo.

    So che non e' un granche', ma spero ti esserti stato d'aiuto...

    Ciao!

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    ho solo fatto una ricerca sul sito della microsoft, però non conoscendo la tecnologia in questione non ti so aiutare nello specifico.

    Vedi comunque se trovi qualcosa di utile qui:

    http://msdn.microsoft.com/library/de...d_Clipping.asp

    ciao.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Grazie mille per il link e l'aiuto, ora qualcosa sulla telecamera mi è chairo. zaxis tu sai usare le OpenGL? Se si potresti darmi il tuo cntatto msn? Grazie!
    Cerco ancora aiuto sulle matrici

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    56
    hey ciao!!! finalmente un po' di gente ke smistica le librerie grafiche!!! io sto imparando le opengl.. sono ancora alle Texture.. tra un esame e l'altro le porto avanti.. cmq come dice zaxis, le open hanno sempre una telecamera ma siccome è troppo vicina di solito si fa sempre una traslazione generale tipo

    codice:
    gltranslatef(0.0f,0.0f,-6.0f);
    cioè si sposta indietro la telecamera di 6 così vedi un po' meglio se crei gli oggetti nel piano x/y

    Wolverine se vuoi ti do la mia email ke ci scambiamo info.. a me interessa un botto la grafica 3d...

    includevir@yahoo.it

    Zaxis anke te fatti sentire.. ke ci possiamo scambiare info!
    cmq Wolve secondo me sono meglio le OpenGl.. più ke altro xkè nn dipendono strettamente da Bill.. poi vabé ci sarebbero discorsoni da fare xò se combini WxWidGets + Open.. penso ke nn ti serve più niente.. cmq sono all'inizio ankio ciao ciao


    SommoVir

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Bhe in DirectX non si fa cosi, ma alla fine ci sono riuscito grazie a due funzioni.

    codice:
    #include <d3dx9.h>
    #include <windows.h>
    #pragma comment (lib,"d3d9.lib")
    #pragma comment (lib,"d3dx9.lib")
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
    
    LPDIRECT3D9				g_pD3D			= NULL;
    LPDIRECT3DDEVICE9		g_pd3dDevice	= NULL;
    LPDIRECT3DVERTEXBUFFER9 g_pVX			= NULL;
    void Render();
    void Chiudi();
    HRESULT InizializzaScena(HWND hWnd);
    HRESULT CostruisciTriangolo();
    void ImpostaCamera();
    
    typedef struct _vertex_
    {
    	float x,y,z;
    	DWORD Colore;
    } Vertex;
    HRESULT InizializzaScena(HWND hWnd)
    {
    	if ( NULL == (g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
    	{
    		MessageBox(NULL,"Impossibile creare il device (Sdk_Version)","Errore",MB_OK);
    		return E_FAIL;
    	}
    
    		D3DPRESENT_PARAMETERS d3dpp;
    		ZeroMemory(&d3dpp,sizeof(d3dpp));
    	
    		d3dpp.BackBufferCount = 1;
    		d3dpp.Windowed = TRUE;
    		d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    		d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
    		d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    		d3dpp.hDeviceWindow = hWnd;
    		d3dpp.FullScreen_RefreshRateInHz = 0;
    
    
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    
    		{
    			MessageBox(NULL,"Impossibile inizializzare il device (CreateDevice)","Errore",MB_OK);
    			return E_FAIL;
    		}
    		
    		else
    		{
    			return S_OK;
    		}
    }
    
    void Chiudi()
    {
    	if ( g_pVX != NULL )
    		g_pVX->Release();
    	if ( g_pd3dDevice != NULL )
    		g_pd3dDevice->Release();
    	if ( g_pD3D != NULL )
    		g_pD3D->Release();
    }
    
    void Render() 
    {
    	if (g_pd3dDevice == NULL)
    	{
    		MessageBox(NULL,"Il device è null!","Adso",MB_OK);
    		return;
    	}
    		
    	g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(15,48,170), 1.0f, 0 );
    
    	g_pd3dDevice->BeginScene();
    				ImpostaCamera();
    		g_pd3dDevice->SetStreamSource(0,g_pVX,0,sizeof(Vertex));	
    		g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    		g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1);
    			
    	g_pd3dDevice->EndScene();
    	g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
    }
    HRESULT CostruisciTriangolo()
    {
    	Vertex Vertici[] =
    	{
    		{ -10.0f, 10.0f, 0.0f, D3DCOLOR_XRGB(88,121,70), },
    		{ 10.0f,  10.0f, 0.0f, D3DCOLOR_XRGB(21,121,21), }, 
    		{  0.0f, -10.0f, 0.0f, D3DCOLOR_XRGB(53,123,125), },
    	};
    
    	if(FAILED(g_pd3dDevice->CreateVertexBuffer(3 * sizeof(Vertex),0,
    					D3DFVF_CUSTOMVERTEX,D3DPOOL_MANAGED,&g_pVX,NULL)))
    	{
    		MessageBox(NULL,"Impossibile creare il VertexBuffer(CreateVertexBuffer)","Mustin",MB_OK);
    		return E_FAIL;
    	}
    		
    		void *PVertex;
    		if(FAILED(g_pVX->Lock(0,0,&PVertex,0)))
    		{
    			MessageBox(NULL,"Impossibile effettuare il Lock(Lock)","Mustin",MB_OK);
    			return E_FAIL;
    		}
    		else
    		{
    			memcpy( PVertex, Vertici, sizeof(Vertici) );
    			
    			g_pVX->Unlock();
    			return S_OK;
    		}
    
    
    }
    void ImpostaCamera()
    {
    	/* Per creare la telecamera devono essere passati 3 vettori
    		Il punto da cui guardi
    		Il punto in cui guardi
    		La rotazione intorno al punto
    		A questi si unisce una matrice che conterrà il risultato.
    	*/
    			D3DXVECTOR3 vEyePt   ( 0.0f, 30.0f,-50.0f );
    			D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    			D3DXVECTOR3 vUpVec   ( 0.0f, 1.0f, 0.0f );
    			D3DXMATRIX  matView;
    			D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    			g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
    
    			D3DXMATRIX matProj;
    			D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,1000.0f );
    			g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
    
    }
    LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,WPARAM wParam, LPARAM lParam)
    {
    		switch (Msg)
    		{
    			case WM_PAINT:
    				Render();
    				ValidateRect(hWnd,NULL);
    			break;
    
    			case WM_CLOSE:
    				DestroyWindow(hWnd);
    			break;
    
    			case WM_DESTROY:
    				Chiudi();
    				PostQuitMessage(0);
    			break;
    
    			case WM_MBUTTONDOWN:
    				MessageBox(NULL,"Bustin","Mustin",MB_OK);
    			break;
    		}
    	return DefWindowProc(hWnd,Msg,wParam,lParam);
    }
    int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLinet,int nCmdShow)
    {
    	static const char Finestra[] = "Device";
    	HWND hWnd;
    	MSG Msg;
    	WNDCLASSEX wc;
    
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = Finestra;
        wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    
    	if(!RegisterClassEx(&wc))
    	{
    		MessageBox(NULL,"Impossibile registrare la classe (RegisterClassEx)","Bustin",MB_OK);
    	}
    
    	if ((hWnd = CreateWindowEx(
            WS_EX_CLIENTEDGE,
            Finestra,
            "Matrici",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 640,480,
            NULL, NULL, wc.hInstance, NULL)) == NULL)
    	{
    		MessageBox(NULL,"Impossibile creare la finestra (CreateWindowEx)","Errore",MB_OK);
    		return 1;
    	}
    
    
    		if (FAILED(InizializzaScena(hWnd)))
    		return 1;
    
    						if(FAILED(CostruisciTriangolo()))
    			{
    				MessageBox(NULL,"Ci sono stati errori nella costruzione del triangolo","Mustin",MB_OK);
    				return 0;
    			}
    
    
    		ShowWindow(hWnd,nCmdShow);
    		UpdateWindow(hWnd);
    
    		while (GetMessage(&Msg,hWnd,0,0) > 0)
    		{
    			TranslateMessage(&Msg);
    			DispatchMessage(&Msg);
    		}
    
    	return 0;
    }
    Con questo codice ora il triangolo si vede, ma i colori no...mi sapete dire qalcosa?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.