Freigeben über


Verwenden von Geometry Blending (Direct3D 9)

Die folgende benutzerdefinierte Struktur kann für Scheitelpunkte verwendet werden, die zwischen zwei Matrizen gemischt werden.

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

Die Mischgewichtung muss nach den Positions- und RHW-Daten in der FVF und vor dem Scheitelpunkt normal angezeigt werden.

Beachten Sie, dass das vorherige Scheitelpunktformat nur einen Mischgewichtungswert enthält. Dies liegt daran, dass es zwei Weltmatrizen geben wird, die in den Transformationszuständen D3DTS_WORLDMATRIX(0) und D3DTS_WORLDMATRIX(1) definiert sind. Das System mischt jeden Scheitelpunkt zwischen diesen beiden Matrizen mithilfe des Einzelgewichtungswerts. Für drei Matrizen sind nur zwei Gewichtungen erforderlich usw.

Hinweis

Das Definieren von Hautgewichten ist einfach. Die Verwendung einer linearen Funktion des Abstands zwischen Gelenken ist ein guter Anfang, aber eine glattere Sigmoidfunktion sieht besser aus. Die Wahl einer Hautgewichtsverteilungsfunktion kann bei Bedarf zu scharfen Falten an den Gelenken führen, indem eine große Variation des Hautgewichts über eine kurze Entfernung verwendet wird.

 

Festlegen von Mischmatrizen

Sie legen die Transformationsmatrizen fest, zwischen denen das System sich mischt, indem Sie die IDirect3DDevice9::SetTransform-Methode aufrufen. Legen Sie den ersten Parameter auf einen vom D3DTS_WORLDMATRIX Makro definierten Wert fest, und legen Sie den zweiten Parameter auf die Adresse der festzulegenden Matrix fest.

Im folgenden C++-Codebeispiel werden zwei Weltmatrizen festgelegt, zwischen denen Geometrie gemischt wird, um die Illusion eines gelenkten Arms zu erzeugen.

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

Das Festlegen einer Mischmatrix führt lediglich dazu, dass das System die Matrix zur späteren Verwendung zwischenspeichert. Das System wird nicht angewiesen, mit dem Mischen von Scheitelpunkten zu beginnen.

Aktivieren der Geometriemischung

Die Geometriemischung ist standardmäßig deaktiviert. Um die Geometriemischung zu aktivieren, rufen Sie die IDirect3DDevice9::SetRenderState-Methode auf, um den D3DRS_VERTEXBLEND Renderzustand auf einen Wert aus dem aufgezählten D3DVERTEXBLENDFLAGS-Typ festzulegen. Das folgende Codebeispiel zeigt, wie dieser Aufruf aussehen könnte, wenn der Renderzustand für eine Mischung zwischen zwei Weltmatrizen festgelegt wird.

d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

Wenn D3DRS_VERTEXBLEND auf einen anderen Wert als D3DVBF_DISABLE festgelegt ist, geht das System davon aus, dass die entsprechende Anzahl von Mischgewichten im Vertexformat enthalten ist. Es liegt in Ihrer Verantwortung, ein kompatibles Scheitelpunktformat bereitzustellen und den Direct3D-Renderingmethoden eine ordnungsgemäße Beschreibung dieses Formats bereitzustellen.

Wenn diese Option aktiviert ist, führt das System eine Geometriemischung für alle Objekte durch, die von den DrawPrimitive-Renderingmethoden gerendert werden.

Weitere Informationen

Behobene Funktions-FVF-Codes (Direct3D 9)

Geometriemischung