haazheel | Bonjour à tous,
voilà quelques temps que je tente désespérement de tourner autour d'un objet en fonction des mouvements de la souris.
J'ai trouvé dans les exemples du SDK des projets qui utilisaient une classe CD3DArcBall. J'ai recopié du code depuis ces exemples, mes objets s'affichent, mais je n'arrive pas à tourner autour des objets.
Ca fait 2 jours que je cherche dans tous les sens, sans succès, alors je vous mets le code, parce que là je galère trop...
Fichier CPP
Code :
- #define STRICT
- #include <vcl.h>
- #include <Mmsystem.h>
- #pragma hdrstop
- #pragma package(smart_init)
- #include "CMyD3DApplication.h"
- //-----------------------------------------------------------------------------
- // Name: CMyD3DApplication()
- // Desc: Constructeur de la class. On peut y définir divers paramètres
- // concernant la fenêtre.
- //-----------------------------------------------------------------------------
- CMyD3DApplication::CMyD3DApplication()
- : g_pyramid_count(6),g_cube_count(12)
- {
- // Définit le titre qui apparaîtra dans la barre des titres de la fenêtre
- m_strWindowTitle = _T("D3D Initialisation" );
- m_bUseDepthBuffer = TRUE;
- m_pVB = NULL;
- }
- //-----------------------------------------------------------------------------
- // Name: OneTimeSceneInit()
- // Desc: Cette procédure est appelée avant la création de la fenêtre. Cette
- // fonction n'est exécutée qu'une seule fois pour les initialisation de
- // type permanent.
- //-----------------------------------------------------------------------------
- HRESULT CMyD3DApplication::OneTimeSceneInit()
- {
- m_pFont = new CD3DFont(_T("Arial" ), 12, D3DFONT_BOLD);
- return D3D_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: FrameMove()
- // Desc: Cette fonction est appelée avant chaque rendu, pour l'animation des
- // objets, de la scène et d'éventuels calculs.
- //-----------------------------------------------------------------------------
- HRESULT CMyD3DApplication::FrameMove()
- {
- // Setup world matrix
- D3DXMATRIXA16 matWorld;
- D3DXMatrixTranslation( &matWorld, -m_vObjectCenter.x,
- -m_vObjectCenter.y,
- -m_vObjectCenter.z );
- D3DXMatrixMultiply( &matWorld, &matWorld, m_ArcBall.GetRotationMatrix() );
- D3DXMatrixMultiply( &matWorld, &matWorld, m_ArcBall.GetTranslationMatrix() );
- m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
- // Set up view matrix
- D3DXVECTOR3 vFrom( 0, 0,-5*m_fObjectRadius );
- D3DXVECTOR3 vAt( 0, 0, 0 );
- D3DXVECTOR3 vUp( 0, 1, 0 );
- D3DXMATRIXA16 matView;
- D3DXMatrixLookAtLH( &matView, &vFrom, &vAt, &vUp );
- m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: Render()
- // Desc : Appelé une fois par frame, cette fonction sert au rendu de la scène,
- // effacement de la scène...
- //-----------------------------------------------------------------------------
- HRESULT CMyD3DApplication::Render()
- {
- // Clear the viewport.
- m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0L );
- // Begin the scene.
- if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
- {
- m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof(CUSTOMVERTEX) );
- m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
- D3DXMATRIXA16 matLocal, matWorldSaved;
- m_pd3dDevice->GetTransform( D3DTS_WORLD, &matWorldSaved );
- // Restore the modified render states
- DrawPyramid();
- DrawCube();
- m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorldSaved );
- // Output statistics
- m_pd3dDevice->EndScene();
- }
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: InitDeviceObjects()
- // Desc: Cette fonction est appelée juste après la création du Device. On peut
- // y configurer tous les paramètres de la scène : lumières, textures,
- // matériaux, options de rendu, qualité du rendu...
- //-----------------------------------------------------------------------------
- HRESULT CMyD3DApplication::InitDeviceObjects()
- {
- m_pFont->InitDeviceObjects(m_pd3dDevice);
- m_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
- // Set miscellaneous render states
- void *vb_vertices;
- HRESULT hr;
- hr = m_pd3dDevice->CreateVertexBuffer(sizeof(data), //Length
- D3DUSAGE_WRITEONLY,//Usage
- D3DFVF_CUSTOMVERTEX, //FVF
- D3DPOOL_MANAGED, //Pool
- &m_pVB, //ppVertexBuffer
- NULL); //Handle
- if(FAILED(hr))
- {
- MessageBox(m_hWnd,"Error Creating vertex buffer",NULL,NULL);
- return hr;
- }
- hr = m_pVB->Lock(0, //Offset
- 0, //SizeToLock
- &vb_vertices, //Vertices
- 0); //Flags
- if(FAILED(hr))
- {
- MessageBox(m_hWnd,"Error Locking vertex buffer",NULL,NULL);
- return hr;
- }
- memcpy( vb_vertices, data,sizeof(data));
- hr = D3DXComputeBoundingSphere((D3DXVECTOR3*)vb_vertices,
- 18,
- D3DXGetFVFVertexSize(D3DFVF_CUSTOMVERTEX),
- &m_vObjectCenter,
- &m_fObjectRadius);
- m_pVB->Unlock();
- m_pd3dDevice->SetRenderState( D3DRS_DITHERENABLE, TRUE );
- m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );
- m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: RestoreDeviceObjects()
- // Desc: Méthode appelée pour la restauration des objets, des surfaces... après
- // la création d'un périphérique ou un redimentionnement
- //-----------------------------------------------------------------------------
- HRESULT CMyD3DApplication::RestoreDeviceObjects()
- {
- // Setup the arcball parameters
- m_ArcBall.SetWindow( m_d3dsdBackBuffer.Width, m_d3dsdBackBuffer.Height, 0.85f );
- m_ArcBall.SetRadius( m_fObjectRadius );
- // Setup the projection matrix
- D3DXMATRIXA16 matProj;
- FLOAT fAspect = (FLOAT)m_d3dsdBackBuffer.Width / (FLOAT)m_d3dsdBackBuffer.Height;
- D3DXMatrixPerspectiveFovLH(&matProj,
- D3DX_PI/4,
- fAspect,
- m_fObjectRadius/64.0f,
- m_fObjectRadius*200.0f );
-
- m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
- return D3D_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: InvalidateDeviceObjects()
- // Desc: Appelée quand les objets dépendants de dispositif sont sur le point
- // d'être perdus.
- //-----------------------------------------------------------------------------
- HRESULT CMyD3DApplication::InvalidateDeviceObjects()
- {
- m_pFont->InvalidateDeviceObjects();
- SAFE_RELEASE( m_pVB );
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: DeleteDeviceObjects()
- // Desc: Appelée quand l'application se termine, ou que le périphérique est
- // changé. Cette fonction supprime n'importe quels objets dépendants du
- // périphérique.
- //-----------------------------------------------------------------------------
- HRESULT CMyD3DApplication::DeleteDeviceObjects()
- {
- m_pFont->DeleteDeviceObjects();
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: FinalCleanup()
- // Desc: Appelée avant que l'application se termine, cette fonction donne la
- // possibilité de nettoyer la mémoire de ses variables d'elle-même.
- //-----------------------------------------------------------------------------
- HRESULT CMyD3DApplication::FinalCleanup()
- {
- SAFE_DELETE(m_pFont);
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: ConfirmDevice()
- // Desc: Appelée pendant l'initialisation, ce code vérifie si les périphériques
- // ont les capacités minimales requises.
- //-----------------------------------------------------------------------------
- HRESULT CMyD3DApplication::ConfirmDevice(D3DCAPS9* pCaps, DWORD dwBehavior, D3DFORMAT Format)
- {
- if( !(dwBehavior & D3DCREATE_SOFTWARE_VERTEXPROCESSING) && !(pCaps->VertexShaderVersion >= D3DVS_VERSION(1, 0)) )
- return E_FAIL;
- return S_OK;
- }
- //---------------------------------------------------------------------------
- //! Trace la pyramide
- void CMyD3DApplication::DrawPyramid()
- {
- D3DXMATRIX world_matrix;
- D3DXMATRIX rot_matrix;
- D3DXMATRIX trans_matrix;
- static float rot_triangle=0.0f;
- D3DXMatrixRotationY(&rot_matrix,rot_triangle); //Rotate the pyramid
- D3DXMatrixTranslation(&trans_matrix,-2.0f,0,0); //Shift it 2 units to the left
- D3DXMatrixMultiply(&world_matrix,&rot_matrix,&trans_matrix);
- m_pd3dDevice->SetTransform(D3DTS_WORLD,&world_matrix);
- //Render from our Vertex Buffer
- m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, //PrimitiveType
- 0, //StartVertex
- g_pyramid_count); //PrimitiveCount
- rot_triangle+=0.003f;
- if(rot_triangle > D3DX_PI*2)
- rot_triangle-=D3DX_PI*2;
- }
- //---------------------------------------------------------------------------
- //! Trace le cube
- void CMyD3DApplication::DrawCube()
- {
- D3DXMATRIX world_matrix;
- D3DXMATRIX rot_matrix;
- D3DXMATRIX trans_matrix;
- static float rot_cube=0.0f;
- int start_vertex;
- //Offset past the pyramid, offset is given as the number of vertices to be skipped
- start_vertex=g_pyramid_count * 3;
- D3DXMatrixRotationYawPitchRoll(&rot_matrix,0,rot_cube,rot_cube); //Rotate the cube
- D3DXMatrixTranslation(&trans_matrix,2.0f,0,0); //Shift it 2 units to the right
- D3DXMatrixMultiply(&world_matrix,&rot_matrix,&trans_matrix); //Rot & Trans
- m_pd3dDevice->SetTransform(D3DTS_WORLD,&world_matrix);
- //Render from our Vertex Buffer
- m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, //PrimitiveType
- start_vertex, //StartVertex
- g_cube_count); //PrimitiveCount
- rot_cube+=0.002f;
- if(rot_cube > D3DX_PI*2)
- rot_cube-=D3DX_PI*2;
- }
- //---------------------------------------------------------------------------
- LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
- LPARAM lParam )
- {
- // Pass mouse messages to the ArcBall so it can build internal matrices
- m_ArcBall.HandleMouseMessages( hWnd, uMsg, wParam, lParam );
- // Pass remaining messages to default handler
- return CD3DApplication::MsgProc( hWnd, uMsg, wParam, lParam );
- }
|
Fichier H
Code :
- #ifndef CMyD3DApplicationH
- #define CMyD3DApplicationH
- #define sqrtf (float)sqrt
- #include <D3DX9.h>
- #include <DXUtil.h>
- #include <D3DEnumeration.h>
- #include <D3DSettings.h>
- #include <D3DApp.h>
- #include <D3DFile.h>
- #include <D3DFont.h>
- #include <D3DUtil.h>
- struct CUSTOMVERTEX
- {
- float x, y, z; // The transformed position for the vertex.
- DWORD color; // The vertex color.
- };
- #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
- CUSTOMVERTEX data[] =
- {
- //Pyramid vertices
- {-1.0f,-1.0f,-1.0f,0x0000FF00},{ 0.0f, 1.0f, 0.0f,0x0000FF00},{ 1.0f,-1.0f,-1.0f,0x0000FF00},
- { 1.0f,-1.0f,-1.0f,0x000000FF},{ 0.0f, 1.0f, 0.0f,0x000000FF},{ 1.0f,-1.0f, 1.0f,0x000000FF},
- { 1.0f,-1.0f, 1.0f,0x00FF0000},{ 0.0f, 1.0f, 0.0f,0x00FF0000},{-1.0f,-1.0f, 1.0f,0x00FF0000},
- {-1.0f,-1.0f, 1.0f,0x00FFFF00},{ 0.0f, 1.0f, 0.0f,0x00FFFF00},{-1.0f,-1.0f,-1.0f,0x00FFFF00},
- { 1.0f,-1.0f,-1.0f,0xFFFFFFFF},{ 1.0f,-1.0f, 1.0f,0xFFFFFFFF},{-1.0f,-1.0f, 1.0f,0xFFFFFFFF},
- {-1.0f,-1.0f, 1.0f,0xFFFFFFFF},{-1.0f,-1.0f,-1.0f,0xFFFFFFFF},{ 1.0f,-1.0f,-1.0f,0xFFFFFFFF},
- //Cube vertices
- //Front face
- {-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 face
- { 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},
- //Top face
- {-1.0f, 1.0f,-1.0f,0xFFFF0000},{-1.0f, 1.0f, 1.0f,0xFFFF0000},{ 1.0f, 1.0f, 1.0f,0xFFFF0000},
- { 1.0f, 1.0f, 1.0f,0xFFFF0000},{ 1.0f, 1.0f,-1.0f,0xFFFF0000},{-1.0f, 1.0f,-1.0f,0xFFFF0000},
- //Bottom face
- { 1.0f,-1.0f,-1.0f,0xFFFF0000},{ 1.0f,-1.0f, 1.0f,0xFFFF0000},{-1.0f,-1.0f, 1.0f,0xFFFF0000},
- {-1.0f,-1.0f, 1.0f,0xFFFF0000},{-1.0f,-1.0f,-1.0f,0xFFFF0000},{ 1.0f,-1.0f,-1.0f,0xFFFF0000},
- //Left face
- {-1.0f,-1.0f, 1.0f,0xFF00FF00},{-1.0f, 1.0f, 1.0f,0xFF00FF00},{-1.0f, 1.0f,-1.0f,0xFF00FF00},
- {-1.0f, 1.0f,-1.0f,0xFF00FF00},{-1.0f,-1.0f,-1.0f,0xFF00FF00},{-1.0f,-1.0f, 1.0f,0xFF00FF00},
- //Right face
- { 1.0f,-1.0f,-1.0f,0xFF00FF00},{ 1.0f, 1.0f,-1.0f,0xFF00FF00},{ 1.0f, 1.0f, 1.0f,0xFF00FF00},
- { 1.0f, 1.0f, 1.0f,0xFF00FF00},{ 1.0f,-1.0f, 1.0f,0xFF00FF00},{ 1.0f,-1.0f,-1.0f,0xFF00FF00},
- };
- //-----------------------------------------------------------------------------
- // Name: class CMyD3DApplication
- // Desc: Application class. The base class (CD3DApplication) provides the
- // generic functionality needed in all Direct3D samples. CMyD3DApplication
- // adds functionality specific to this sample program.
- //-----------------------------------------------------------------------------
- class CMyD3DApplication : public CD3DApplication
- {
- int g_list_count;
- int g_pyramid_count;
- int g_cube_count;
-
- LPDIRECT3DVERTEXBUFFER9 m_pVB;
- CD3DArcBall m_ArcBall; // mouse rotation utility
- D3DXVECTOR3 m_vObjectCenter; // Center of bounding sphere of object
- FLOAT m_fObjectRadius; // Radius of bounding sphere of object
- CD3DFont* m_pFont;
- bool m_bUseDepthBuffer;
-
- HRESULT ConfirmDevice(D3DCAPS9*, DWORD, D3DFORMAT);
- void DrawPyramid();
- void DrawCube();
- protected:
- HRESULT OneTimeSceneInit();
- HRESULT InitDeviceObjects();
- HRESULT RestoreDeviceObjects();
- HRESULT InvalidateDeviceObjects();
- HRESULT DeleteDeviceObjects();
- HRESULT FinalCleanup();
- HRESULT Render();
- HRESULT FrameMove();
- public:
- CMyD3DApplication();
- LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
- };
- #endif
|
Merci d'avance |