Ramilol
Ramilol

Reputation: 3462

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

Upvotes: 1

Views: 527

Answers (1)

Goz
Goz

Reputation: 62333

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 ...

Upvotes: 1

Related Questions