Condividi tramite


Uso della fusione geometry (Direct3D 9)

La struttura definita dall'utente seguente può essere usata per i vertici che verranno uniti tra due matrici.

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

Il peso della miscela deve essere visualizzato dopo la posizione e i dati RHW nel FVF e prima della normale istanza del vertice.

Si noti che il formato del vertice precedente contiene solo un valore di peso di fusione. Questo è dovuto al fatto che ci saranno due matrici mondiali, definite negli stati di trasformazione D3DTS_WORLDMATRIX(0) e D3DTS_WORLDMATRIX(1). Il sistema combina ogni vertice tra queste due matrici usando il valore di peso singolo. Per tre matrici, sono necessari solo due pesi e così via.

Nota

La definizione dei pesi della pelle è facile. L'uso di una funzione lineare della distanza tra le articolazioni è un buon inizio, ma una funzione sigmoid più liscia sembra migliore. Se si sceglie una funzione di distribuzione del peso della pelle, è possibile creare creature nitide alle articolazioni, se desiderate, usando una grande variazione nel peso della pelle su una breve distanza.

 

Impostazione di matrici di fusione

Impostare le matrici di trasformazione tra cui il sistema si fonde chiamando il metodo IDirect3DDevice9::SetTransform . Impostare il primo parametro su un valore definito dalla macro D3DTS_WORLDMATRIX e impostare il secondo parametro sull'indirizzo della matrice da impostare.

Nell'esempio di codice C++ seguente vengono impostate due matrici del mondo, tra cui la geometria viene unita per creare l'illusione di un braccio in combinazione.

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

L'impostazione di una matrice di fusione causa semplicemente che il sistema memorizza nella cache la matrice per un uso successivo; non indica al sistema di iniziare a fondere vertici.

Abilitazione della fusione geometry

La fusione geometry è disabilitata per impostazione predefinita. Per abilitare la fusione geometry, chiamare il metodo IDirect3DDevice9::SetRenderState per impostare lo stato di rendering D3DRS_VERTEXBLEND su un valore dal tipo enumerato D3DVERTEXBLENDFLAGS . Nell'esempio di codice seguente viene illustrato il aspetto di questa chiamata quando si imposta lo stato di rendering per una fusione tra due matrici mondiali.

d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

Quando D3DRS_VERTEXBLEND è impostato su qualsiasi valore diverso da D3DVBF_DISABLE, il sistema presuppone che il numero appropriato di pesi di fusione venga incluso nel formato del vertice. È responsabilità dell'utente fornire un formato di vertice conforme e fornire una descrizione appropriata di tale formato ai metodi di rendering Direct3D.

Se abilitato, il sistema esegue la fusione geometry per tutti gli oggetti sottoposti a rendering dai metodi di rendering DrawPrimitive.

Vedere anche

Codici FVF della funzione fissa (Direct3D 9)

Geometry Blending