Användning av geometriblandning (Direct3D 9)
Följande användardefinierade struktur kan användas för hörn som blandas mellan två matriser.
// 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;
};
Blandningsvikten måste visas efter positions- och RHW-data i FVF och före vertexnormalen.
Observera att föregående vertexformat endast innehåller ett blandningsviktvärde. Det beror på att det kommer att finnas två världsmatriser, definierade i D3DTS_WORLDMATRIX(0) och D3DTS_WORLDMATRIX(1) transformeringstillstånd. Systemet blandar varje hörn mellan dessa två matriser med hjälp av det enskilda viktvärdet. För tre matriser krävs endast två vikter, och så vidare.
Not
Det är enkelt att definiera hudvikter. Att använda en linjär funktion av avståndet mellan lederna är bra början, men en smidigare sigmoidfunktion ser bättre ut. Att välja en hudviktsfördelningsfunktion kan resultera i skarpa veck vid leder, om så önskas, genom att använda en stor variation i hudvikt över ett kort avstånd.
Ange blandningsmatriser
Du anger de omvandlingsmatriser mellan vilka systemet blandas genom att anropa metoden IDirect3DDevice9::SetTransform. Ange den första parametern till ett värde som definierats av makrot D3DTS_WORLDMATRIX och ange den andra parametern till den adress för matrisen som ska anges.
I följande C++-kodexempel anges två världsmatriser, mellan vilka geometri blandas för att skapa illusionen av en gemensam arm.
// 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 );
Om du anger en blandningsmatris cachelagrar systemet bara matrisen för senare användning. Det instruerar inte systemet att börja blanda hörn.
Aktivera geometriblandning
Geometriblandning är inaktiverad som standard. Om du vill aktivera geometriblandning anropar du metoden IDirect3DDevice9::SetRenderState för att ange D3DRS_VERTEXBLEND återgivningstillstånd till ett värde från den D3DVERTEXBLENDFLAGS uppräknade typen. Följande kodexempel visar hur det här anropet kan se ut när återgivningstillståndet anges för en blandning mellan två världsmatriser.
d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );
När D3DRS_VERTEXBLEND är inställt på något annat värde än D3DVBF_DISABLE förutsätter systemet att lämpligt antal blandningsvikter inkluderas i hörnformatet. Det är ditt ansvar att tillhandahålla ett kompatibelt hörnformat och att ge en korrekt beskrivning av det formatet till Direct3D-återgivningsmetoderna.
När det är aktiverat utför systemet geometriblandning för alla objekt som återges av DrawPrimitive-återgivningsmetoderna.
Se även
FVF-koder för fast funktion (Direct3D 9)
Relaterade ämnen