Geometriemix gebruiken (Direct3D 9)
De volgende door de gebruiker gedefinieerde structuur kan worden gebruikt voor hoekpunten die worden gemengd tussen twee 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;
};
Het gewicht van de mix moet worden weergegeven na de positie en RHW-gegevens in de FVF, en vóór het hoekpunt normaal.
U ziet dat de voorgaande hoekpuntindeling slechts één gewichtswaarde voor blending bevat. Dit komt doordat er twee wereldmatrices zijn, gedefinieerd in de D3DTS_WORLDMATRIX(0) en D3DTS_WORLDMATRIX(1) transformatiestatussen. Het systeem mengt ieder hoekpunt tussen deze twee matrices met behulp van een enkele gewichtswaarde. Voor drie matrices zijn slechts twee gewichten vereist, enzovoort.
Notitie
Het definiëren van huidgewichten is eenvoudig. Het gebruik van een lineaire functie van de afstand tussen gewrichten is een goede start, maar een vloeiendere sigmoïde functie ziet er beter uit. Het kiezen van een verdelingsfunctie voor huidgewicht kan, indien gewenst, resulteren in scherpe plooien bij gewrichten door een grote variatie in huidgewicht over een korte afstand te gebruiken.
Blending Matrices instellen
U stelt de transformatiematrices in waarmee het systeem zich mengt door de methode IDirect3DDevice9::SetTransform aan te roepen. Stel de eerste parameter in op een waarde die is gedefinieerd door de D3DTS_WORLDMATRIX macro en stel de tweede parameter in op het adres van de matrix die moet worden ingesteld.
In het volgende C++-codevoorbeeld worden twee wereldmatrices ingesteld, tussen welke geometrie wordt gemengd om de illusie van een gemeenschappelijke arm te creëren.
// 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 );
Door een blendingmatrix in te stellen, wordt de matrix alleen in de cache opgeslagen voor later gebruik; het geeft het systeem geen instructie om hoekpunten te mengen.
Het inschakelen van geometriemenging
Geometriemenging is standaard uitgeschakeld. Als u geometriemenging wilt inschakelen, roept u de methode IDirect3DDevice9::SetRenderState methode aan om de D3DRS_VERTEXBLEND renderstatus in te stellen op een waarde van het D3DVERTEXBLENDFLAGS geïnventariseerd type. In het volgende codevoorbeeld ziet u hoe deze aanroep eruit kan zien bij het instellen van de renderstatus voor een mix tussen twee wereldmatrices.
d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );
Wanneer D3DRS_VERTEXBLEND is ingesteld op een andere waarde dan D3DVBF_DISABLE, gaat het systeem ervan uit dat het juiste aantal mengselgewichten wordt opgenomen in de hoekpuntindeling. Het is uw verantwoordelijkheid om een compatibele hoekpuntindeling te bieden en een juiste beschrijving van die indeling te geven aan de Direct3D-renderingmethoden.
Wanneer dit is ingeschakeld, voert het systeem geometriemenging uit voor alle objecten die worden weergegeven door de DrawPrimitive-renderingmethoden.
Zie ook
FVF-codes voor vaste functie (Direct3D 9)
Verwante onderwerpen