2010-12-07 36 views
1

Comment trouver une transformation pour un maillage statique?
Je vais l'utiliser pour ma fonction de prélèvement.
Je l'ai essayé, mais cela n'a pas fonctionné ...comment trouver la transformation pour le maillage statique?

void StaticMesh::Render(void) 
{ 
    D3DXMATRIX matWorld; 

    D3DXMatrixIdentity(&matWorld); 

    device->SetTransform(D3DTS_WORLD, &matWorld); 

    for(DWORD i = 0; i < numMaterials; i++) // loop through each subset 
    { 
     device->SetMaterial(&material[i]); // set the material for the subset 
     device->SetTexture(0, texture[i]); // ...then set the texture 

     mesh->DrawSubset(i); // draw the subset 
    } 

    s = &matWorld; // THIS WOULD BE THE TRANSFORMATION FOR THE OBJECT 
} 

merci à l'avance.

Edit 2:
Voici pleine classe

#include "StdAfx.h" 
#include "StaticMesh.h" 


StaticMesh::StaticMesh(LPDIRECT3DDEVICE9* dev) 
{ 
    d3ddev=dev; 
    device = *d3ddev; 
} 


StaticMesh::~StaticMesh(void) 
{ 
} 

void StaticMesh::Render(void) 
{ 
    LPDIRECT3DDEVICE9 device=*d3ddev; 
    D3DXMATRIX matWorld; 

    D3DXMatrixIdentity(&matWorld); 

    device->SetTransform(D3DTS_WORLD, &matWorld); 

    for(DWORD i = 0; i < numMaterials; i++) // loop through each subset 
    { 
     device->SetMaterial(&material[i]); // set the material for the subset 
     device->SetTexture(0, texture[i]); // ...then set the texture 

     mesh->DrawSubset(i); // draw the subset 
    } 

    s = matWorld; 
} 

StaticMesh* StaticMesh::LoadXFile(LPCWSTR fileName, LPDIRECT3DDEVICE9* dev) 
{ 
    StaticMesh *obj = this; 
    obj = new StaticMesh(dev); 
    obj->Load(fileName); 
    return obj; 
} 

void StaticMesh::Load(LPCWSTR fileName) 
{ 
    D3DXLoadMeshFromX(fileName, // load this file 
         D3DXMESH_SYSTEMMEM, // load the mesh into system memory 
         device, // the Direct3D Device 
         NULL, // we aren't using adjacency 
         &bufMeshMaterial, // put the materials here 
         NULL, // we aren't using effect instances 
         &numMaterials, // the number of materials in this model 
         &mesh); // put the mesh here 

    // retrieve the pointer to the buffer containing the material information 
    D3DXMATERIAL* tempMaterials = (D3DXMATERIAL*)bufMeshMaterial->GetBufferPointer(); 

    // create a new material buffer and texture for each material in the mesh 
    material = new D3DMATERIAL9[numMaterials]; 
    texture = new LPDIRECT3DTEXTURE9[numMaterials]; 

    for(DWORD i = 0; i < numMaterials; i++) // for each material... 
    { 
     // Copy the material 
     material[i] = tempMaterials[i].MatD3D; 

     // Set the ambient color for the material (D3DX does not do this) 
     material[i].Ambient = material[i].Diffuse; 

     // Create the texture if it exists - it may not 
     texture[i] = NULL; 
     if (tempMaterials[i].pTextureFilename) 
     { 
      D3DXCreateTextureFromFileA(device, tempMaterials[i].pTextureFilename,&texture[i]); 
     } 
    } 
} 

void StaticMesh::CleanUp(void) 
{ 
    mesh->Release(); 
} 

EDIT 3:

void GUIDialog::Picking(HWND hWnd, int status) 
{ 
    LPDIRECT3DDEVICE9 device = *d3ddev; 
    D3DXMATRIX matProj; 
    POINT pt; 
    D3DVIEWPORT9 vp; 
    D3DXMATRIX *matWorld=NULL; 
    D3DXMATRIX matView; 

    GetCursorPos(&pt); 
    ScreenToClient(hWnd, &pt); 
    device->GetTransform(D3DTS_PROJECTION, &matProj); 
    device->GetViewport(&vp); 
    device->GetTransform(D3DTS_VIEW, &matView); 


    for(int i=0; (int)edit.size() > i; i++) 
    { 
     matWorld=&edit.at(i)->staticMesh->s; 
     // Use inverse of matrix 
     D3DXVECTOR3 rayPos((float)pt.x, (float)pt.y,0); // near-plane position 
     D3DXVECTOR3 rayDir((float)pt.x, (float)pt.y,1); // far-plane position 
     D3DXVec3Unproject(&rayPos,&rayPos,&vp,&matProj,&matView,matWorld); 
     D3DXVec3Unproject(&rayDir,&rayDir,&vp,&matProj,&matView,matWorld); 
     rayDir -= rayPos; // make a direction from the 2 positions 
     D3DXVec3Normalize(&rayDir,&rayDir); 
     if(FAILED(D3DXIntersect(edit.at(i)->staticMesh->mesh, &rayPos, &rayDir, &edit.at(i)->staticMesh->hasHit, NULL, NULL, NULL, &edit.at(i)->staticMesh-> 
      distanceToCollision, NULL, NULL))) 
     { 
      PostQuitMessage(0); 
     }; 

     if(edit.at(i)->staticMesh->hasHit!=0&&status==WM_LBUTTONUP) 
     { 
      if(status==WM_LBUTTONUP) 
       EventProc(HIT, *edit.at(i)); 
     } 
    } 
} 

Répondre

1

Eh bien votre code ci-dessus est matWorld correcte est la transformation de l'objet. Si vous souhaitez transformer un rayon en espace local objet (c'est-à-dire dans l'espace antérieur à la transformation matWorld), vous devez simplement multiplier votre rayon d'espace monde par l'inverse de matWorld ...

+0

Ce n'est pas ce que 'D3DXVec3Unproject () 'fait? – Ramilol

+0

@Ramilol: Oui c'est le cas. Cependant, si vous avez plusieurs objets avec des matrices du monde différentes, il vaut mieux ne pas projeter avec une matrice d'identité et ensuite transformer le rayon par l'inverse de la matrice du monde pour chaque objet. – Goz

+0

& Goz je l'ai essayé avec un maillage animé et cela a fonctionné mais cela ne fonctionne pas pour le maillage statique (pas d'animation). – Ramilol