Partilhar via


Usando o Geometry Blending (Direct3D 9)

A estrutura definida pelo usuário a seguir pode ser usada para vértices que serão combinados entre duas matrizes.

// The flexible vertex format (FVF) descriptor for this vertex would be:
//   FVF = D3DFVF_XYZB1 | D3DFVF_NORMAL | D3DFVF_TEX1; 

struct D3DBLENDVERTEX {
    D3DVECTOR v;
    FLOAT     blend; 
    D3DVECTOR n;
    FLOAT     tu, tv;
};

O peso da mistura deve aparecer após a posição e os dados RHW no FVF e antes do vértice normal.

Observe que o formato de vértice anterior contém apenas um valor de peso de mesclagem. Isso ocorre porque haverá duas matrizes mundiais, definidas nos estados de transformação D3DTS_WORLDMATRIX(0) e D3DTS_WORLDMATRIX(1). O sistema mescla cada vértice entre essas duas matrizes usando o valor de peso único. Para três matrizes, apenas dois pesos são necessários, e assim por diante.

Observação

Definir pesos de pele é fácil. Usar uma função linear da distância entre as articulações é um bom começo, mas uma função sigmóide mais suave parece melhor. Escolher uma função de distribuição de peso de pele pode resultar em vincos afiados nas articulações, se desejado, usando uma grande variação no peso da pele em uma curta distância.

 

Configurando matrizes de mesclagem

Defina as matrizes de transformação entre as quais o sistema se mistura chamando o método IDirect3DDevice9::SetTransform . Defina o primeiro parâmetro como um valor definido pela macro D3DTS_WORLDMATRIX e defina o segundo parâmetro como o endereço da matriz a ser definido.

O exemplo de código C++ a seguir define duas matrizes mundiais, entre as quais a geometria é combinada para criar a ilusão de um braço articulado.

// For this example, the d3dDevice variable is assumed to be a valid pointer
//   to an IDirect3DDevice9 interface for an initialized 3D scene.

float     BendAngle = 3.1415926f / 4.0f; // 45 degrees
D3DMATRIX matUpperArm, matLowerArm;

// The upper arm is immobile. Use the identity matrix.
D3DXMatrixIdentity( matUpperArm );
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matUpperArm );

// The lower arm rotates about the x-axis, attached to the upper arm.
D3DXMatrixRotationX( matLowerArm, -BendAngle ); 
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(1), &matLowerArm );

Definir uma matriz de mesclagem apenas faz com que o sistema armazene em cache a matriz para uso posterior; ele não instrui o sistema a começar a mesclar vértices.

Habilitando a mesclagem geometry

A combinação de geometria é desabilitada por padrão. Para habilitar a combinação de geometria, chame o método IDirect3DDevice9::SetRenderState para definir o estado de renderização D3DRS_VERTEXBLEND como um valor do tipo enumerado D3DVERTEXBLENDFLAGS . O exemplo de código a seguir mostra como essa chamada pode ser ao definir o estado de renderização para uma combinação entre duas matrizes mundiais.

d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

Quando D3DRS_VERTEXBLEND é definido como qualquer valor diferente de D3DVBF_DISABLE, o sistema pressupõe que o número apropriado de pesos de mesclagem será incluído no formato de vértice. É sua responsabilidade fornecer um formato de vértice em conformidade e fornecer uma descrição adequada desse formato para os métodos de renderização do Direct3D.

Quando habilitado, o sistema executa a mesclagem de geometria para todos os objetos renderizados pelos métodos de renderização DrawPrimitive.

Consulte Também

Códigos FVF de função fixa (Direct3D 9)

Mesclagem geometry