Utilisation de Geometry Blending (Direct3D 9)
La structure définie par l’utilisateur suivante peut être utilisée pour les sommets qui seront fusionnés entre deux 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;
};
Le poids du mélange doit apparaître après la position et les données RHW dans la FVF, et avant le sommet normal.
Notez que le format de vertex précédent ne contient qu’une seule valeur de pondération de fusion. En effet, il y aura deux matrices mondiales, définies dans les états de transformation D3DTS_WORLDMATRIX(0) et D3DTS_WORLDMATRIX(1). Le système fusionne chaque sommet entre ces deux matrices à l’aide de la valeur de pondération unique. Pour trois matrices, seules deux pondérations sont requises, et ainsi de suite.
Notes
La définition des poids de la peau est facile. L’utilisation d’une fonction linéaire de la distance entre les articulations est un bon début, mais une fonction sigmoïde plus lisse semble mieux. Le choix d’une fonction de distribution du poids de la peau peut entraîner des plis aigus au niveau des articulations, si vous le souhaitez, en utilisant une grande variation du poids de la peau sur une courte distance.
Définition de matrices de fusion
Vous définissez les matrices de transformation entre lesquelles le système fusionne en appelant la méthode IDirect3DDevice9::SetTransform . Définissez le premier paramètre sur une valeur définie par la macro D3DTS_WORLDMATRIX et définissez le deuxième paramètre sur l’adresse de la matrice à définir.
L’exemple de code C++ suivant définit deux matrices mondiales, entre lesquelles la géométrie est mélangée pour créer l’illusion d’un bras joint.
// 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 );
La définition d’une matrice de fusion entraîne simplement le fait que le système met en cache la matrice pour une utilisation ultérieure ; il n’indique pas au système de commencer à mélanger les sommets.
Activation de la fusion géométrique
La fusion géométrique est désactivée par défaut. Pour activer la fusion géométrique, appelez la méthode IDirect3DDevice9::SetRenderState pour définir l’état de rendu D3DRS_VERTEXBLEND sur une valeur à partir du type énuméré D3DVERTEXBLENDFLAGS . L’exemple de code suivant montre à quoi cet appel peut ressembler lors de la définition de l’état de rendu pour un mélange entre deux matrices mondiales.
d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );
Lorsque D3DRS_VERTEXBLEND est défini sur une valeur autre que D3DVBF_DISABLE, le système suppose que le nombre approprié de pondérations de fusion est inclus dans le format de vertex. Il vous incombe de fournir un format de vertex conforme et de fournir une description appropriée de ce format aux méthodes de rendu Direct3D.
Lorsque cette option est activée, le système effectue la fusion géométrique pour tous les objets rendus par les méthodes de rendu DrawPrimitive.
Voir aussi
Codes FVF de fonction fixe (Direct3D 9)
Rubriques connexes