c++ - 如何找到静态网格的转换?

标签 c++ winapi visual-c++ directx

如何找到静态网格物体的变换?
我会将它用于我的选择功能。
我已经试过了,但是没有用……

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 的倒数 ...

关于c++ - 如何找到静态网格的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382448/

相关文章:

c++ - pcl_visualizer.cpp 与 2015 构建错误

c++ - 将字符串转换为 GUID 不会给出正确的结果

c++ - 如何正确地将指针传递给第三方代码的成员函数?

c++ - Win32 Audio API endpointVolume 接口(interface)返回错误的 channel 数

c++ - 如何使用 C++ 在 Windows 中查找文件是否被修改?

c++ - 以下程序背后的逻辑是什么?

c++ - 如何获取 std::map 中的键数?

c++ - ActiveMQCPP connection.start() 挂了

winapi - 正确移除窗框/边框

c++ - __forceinline 的执行速度是否比 __inline 快?