2010-12-07 6 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(); 
} 

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

答えて

1

さて、あなたのコードは、上記matWorldは、オブジェクトの変換である正しいです。レイをオブジェクトのローカル空間(つまり、matWorld変換の前の空間)に変換する場合は、ワールド空間レイをmatWorldの逆数で乗算するだけです。

+0

'D3DXVec3Unproject ) 'はしますか? – Ramilol

+0

@Ramilol:そうです。しかし、世界の行列が異なる複数のオブジェクトがある場合は、恒等行列を使用して投影を外した後、各オブジェクトのワールド行列の逆数で光線を変換する方がよいでしょう。 – Goz

+0

&Gozアニメーションメッシュで試してみましたが、動作しましたが、スタティックメッシュ(アニメーションなし)では動作しません。 – Ramilol

関連する問題