2010-12-07 21 views
1

如何查找靜態網格轉型?
我會用它爲我採摘的功能。
我都試過,但沒有奏效...如何找到靜態網格的變換?

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 
} 

在此先感謝。

編輯2:
這裏是滿級

#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(); 
} 

編輯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)); 
     } 
    } 
} 

回答

1

嗯,你的代碼上面是正確的matWorld是變換的對象。如果您希望將光線轉換爲對象局部空間(即前matWorld改造的空間),那麼你只需要通過matWorld的倒數乘以你的世界空間射線...

+0

是不是什麼`D3DXVec3Unproject( )`呢? – Ramilol 2010-12-08 20:54:33