开发者

how to find transformation for static mesh?

How to find transformation for static mesh?

I'll be using it for my picking function.

I have tried this but it didn't work...

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
}

thanks in advance.

Edit 2:

Here is full class

#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,&am开发者_开发百科p;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));
        }
    }
}


Well your code above is correct matWorld IS the transform of the object. If you wish to transform a ray into object local space (ie to the space prior to the matWorld transformation) then you simply need to multiply your world space ray by the inverse of matWorld ...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜