如何找到静态网格物体的变换?
我将其用于我的拣货功能。
我已经尝试过了,但是没有用...

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

最佳答案

那么您上面的代码是正确的matWorld是对象的转换。如果您希望将射线转换为对象局部空间(即,转换为matWorld转换之前的空间),则只需将世界空间射线乘以matWorld的逆矩阵即可...

10-08 04:11