Compartir a través de


Usar fusión de geometría (Direct3D 9)

La siguiente estructura definida por el usuario se puede usar para vértices que se combinarán entre dos matrices.

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

El peso de la mezcla debe aparecer después de la posición y los datos RHW en el FVF, y antes del vértice normal.

Observe que el formato de vértice anterior contiene solo un valor de peso de fusión. Esto se debe a que habrá dos matrices mundiales, definidas en los estados de transformación D3DTS_WORLDMATRIX(0) y D3DTS_WORLDMATRIX(1). El sistema combina cada vértice entre estas dos matrices mediante el valor de peso único. Para tres matrices, solo se requieren dos pesos, etc.

Nota

Definir pesos de piel es fácil. El uso de una función lineal de la distancia entre las articulaciones es un buen comienzo, pero una función sigmoide más suave se ve mejor. La elección de una función de distribución de peso de la piel puede dar lugar a pliegues agudos en las articulaciones, si lo desea, mediante una gran variación en el peso de la piel en una distancia corta.

 

Establecer matrices de mezcla

Se establecen las matrices de transformación entre las que se combina el sistema mediante una llamada al método IDirect3DDevice9::SetTransform . Establezca el primer parámetro en un valor definido por la macro D3DTS_WORLDMATRIX y establezca el segundo parámetro en la dirección de la matriz que se va a establecer.

En el siguiente ejemplo de código de C++ se establecen dos matrices de mundo, entre las que se mezcla la geometría para crear la ilusión de un brazo conjunto.

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

Establecer una matriz de mezcla simplemente hace que el sistema almacene en caché la matriz para su uso posterior; no indica al sistema que empiece a mezclar vértices.

Habilitación de la combinación de geometría

La combinación de geometría está deshabilitada de forma predeterminada. Para habilitar la combinación de geometría, llame al método IDirect3DDevice9::SetRenderState para establecer el estado de representación de D3DRS_VERTEXBLEND en un valor del tipo enumerado D3DVERTEXBLENDFLAGS . En el ejemplo de código siguiente se muestra el aspecto que podría tener esta llamada al establecer el estado de representación para una combinación entre dos matrices mundiales.

d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

Cuando D3DRS_VERTEXBLEND se establece en cualquier valor distinto de D3DVBF_DISABLE, el sistema supone que el número adecuado de pesos de mezcla se incluirá en el formato de vértice. Es su responsabilidad proporcionar un formato de vértice compatible y proporcionar una descripción adecuada de ese formato a los métodos de representación de Direct3D.

Cuando se habilita, el sistema realiza la combinación de geometría para todos los objetos representados por los métodos de representación DrawPrimitive.

Consulte también

Códigos FVF de función fija (Direct3D 9)

Fusión de geometría