Сетки C ++ становятся анимированными, когда их тоже нет - PullRequest
1 голос
/ 06 декабря 2010

У меня есть две сетки. Один из них анимирован, а другой не анимирован. Когда я отрисовываю их, неодушевленная сетка анимируется так же, как анимированная сетка.
Итак, пусть только анимированная сетка уходит влево, а затем возвращается, моя неодушевленная сетка делает то же самое!
Это мой класс кода для неодушевленных мешей.
основной класс

class StaticMesh
{
public:
    StaticMesh(LPDIRECT3DDEVICE9* device);
    ~StaticMesh(void);
    void Render(void);
    void Load(LPCWSTR fileName);
    void CleanUp(void);
private:
    LPDIRECT3DDEVICE9* d3ddev;                      // the pointer to the device class
    LPD3DXMESH mesh;    // define the mesh pointer
    D3DMATERIAL9* material;    // define the material object
    DWORD numMaterials;    // stores the number of materials in the mesh
    LPDIRECT3DTEXTURE9* texture;    // a pointer to a texture
    LPD3DXBUFFER bufMeshMaterial;
};

#include "StdAfx.h"
#include "StaticMesh.h"


StaticMesh::StaticMesh(LPDIRECT3DDEVICE9* device)
{
    d3ddev=device;
}


StaticMesh::~StaticMesh(void)
{
}

void StaticMesh::Render(void)
{
    LPDIRECT3DDEVICE9 device=*d3ddev;
    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
    }
}

void StaticMesh::Load(LPCWSTR fileName)
{
    LPDIRECT3DDEVICE9 device=*d3ddev;

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

1 Ответ

0 голосов
/ 06 декабря 2010

Аниация происходит из матрицы преобразования.Вы либо передаете это непосредственно на устройство (если используете фиксированную функцию) или шейдеру / эффекту.Все сетки, которые вы рисуете после установки матрицы, будут подвергаться одинаковому преобразованию.Таким образом, если вы хотите, чтобы одна сетка оставалась неодушевленной, вы должны изменить трансформацию до рисования сетки.

Псевдокод:

SetTransform( world* view * projection );
DrawMesh();
SetTransform( identity * view * projection );
DrawMesh();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...