Uso della fusione di geometrie (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 vertice.
Si noti che il formato del vertice precedente contiene un solo valore di peso di fusione. Ciò è dovuto al fatto che saranno presenti due matrici del mondo, definite negli stati di trasformazione D3DTS_WORLDMATRIX(0) e D3DTS_WORLDMATRIX(1). Il sistema combina ogni vertice tra queste due matrici usando il singolo valore di peso. Per tre matrici, sono necessari solo due pesi e così via.
Nota
Definire i 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. La scelta di una funzione di distribuzione del peso della pelle può comportare pieghe taglienti alle articolazioni, se lo si desidera, utilizzando una grande variazione del peso della pelle su una breve distanza.
Impostazione delle matrici di fusione
È possibile 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 viene combinata la geometria per creare l'illusione di un braccio unito.
// 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 fa in modo che il sistema memorizza nella cache la matrice per un uso successivo; non indica al sistema di iniziare a fondere i vertici.
Abilitazione della fusione della geometria
La fusione della geometria è disabilitata per impostazione predefinita. Per abilitare la fusione di geometria, 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 l'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 corretta di tale formato ai metodi di rendering Direct3D.
Quando è abilitata, il sistema esegue la fusione della geometria per tutti gli oggetti renderizzati tramite i metodi di rendering di DrawPrimitive.
Vedere anche
codici FVF a funzione fissa (Direct3D 9)
Argomenti correlati