Udostępnij za pośrednictwem


Korzystanie z mieszania geometrii (Direct3D 9)

Poniższa struktura zdefiniowana przez użytkownika może służyć do łączenia wierzchołków, które zostaną połączone między dwiema macierzami.

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

Waga mieszanki musi pojawić się po pozycji i danych RHW w FVF, a przed normalny wierzchołek.

Zwróć uwagę, że poprzedni format wierzchołka zawiera tylko jedną wartość wagi mieszania. Dzieje się tak, ponieważ w D3DTS_WORLDMATRIX(0) i D3DTS_WORLDMATRIX(1) będą istnieć dwie macierze świata. System łączy każdy wierzchołek między tymi dwoma macierzami przy użyciu pojedynczej wartości wagi. W przypadku trzech macierzy wymagane są tylko dwie wagi i tak dalej.

Notatka

Definiowanie wag skóry jest łatwe. Korzystanie z funkcji liniowej odległości między stawami jest dobry początek, ale gładka funkcja sigmoidalna wygląda lepiej. Wybór funkcji rozkładu wagi skóry może spowodować ostre fałdy przy stawach, jeśli jest to pożądane, przy użyciu dużej zmienności wagi skóry na niewielkiej odległości.

 

Ustawianie macierzy mieszania

Ustawiasz macierze przekształcania, między którymi system dokonuje mieszania, przez wywołanie metody IDirect3DDevice9::SetTransform. Ustaw pierwszy parametr na wartość zdefiniowaną przez makro D3DTS_WORLDMATRIX i ustaw drugi parametr na adres macierzy do ustawienia.

Poniższy przykład kodu C++ ustawia dwie światowe macierze, między którymi geometria jest mieszana, aby stworzyć iluzję połączonego ramienia.

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

Ustawienie macierzy mieszanej powoduje jedynie buforowanie macierzy do późniejszego użycia; nie nakazuje systemowi rozpoczęcia mieszania wierzchołków.

Włączanie mieszania geometrii

Łączenie geometrii jest domyślnie wyłączone. Aby włączyć mieszanie geometrii, wywołaj metodę IDirect3DDevice9::SetRenderState, aby ustawić stan renderowania D3DRS_VERTEXBLEND na wartość z wyliczonego typu D3DVERTEXBLENDFLAGS. Poniższy przykład kodu pokazuje, jak to wywołanie może wyglądać przy ustawianiu stanu renderowania przy połączeniu dwóch macierzy świata.

d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

Jeśli D3DRS_VERTEXBLEND jest ustawiona na dowolną wartość inną niż D3DVBF_DISABLE, system zakłada, że odpowiednia liczba mas mieszanych zostanie uwzględniona w formacie wierzchołka. Twoim zadaniem jest dostarczenie zgodnego formatu wierzchołka oraz podanie odpowiedniego opisu tego formatu metod renderowania Direct3D.

Po włączeniu system wykonuje mieszanie geometrii dla wszystkich obiektów renderowanych przez metody renderowania DrawPrimitive.

Zobacz też

stałe kody FVF funkcji (Direct3D 9)

Geometry Blending