Aracılığıyla paylaş


Geometri Karıştırmayı Kullanma (Direct3D 9)

Aşağıdaki kullanıcı tanımlı yapı, iki matris arasında karıştırılacak köşeler için kullanılabilir.

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

Karışım ağırlığı, FVF'deki konum ve RHW verilerinin ardından ve köşe normalden önce görünmelidir.

Önceki tepe noktası formatının yalnızca bir karıştırma ağırlığı değeri içerdiğine dikkat edin. Bunun nedeni, D3DTS_WORLDMATRIX(0) ve D3DTS_WORLDMATRIX(1) dönüştürme durumlarında tanımlanan iki dünya matrisi olmasıdır. Sistem, tek ağırlık değerini kullanarak bu iki matris arasındaki her köşeyi harmanlar. Üç matris için yalnızca iki ağırlık gereklidir ve bu şekilde devam eder.

Not

Cilt ağırlıklarını tanımlamak kolaydır. Eklemler arasındaki mesafenin doğrusal bir işlevini kullanmak iyi bir başlangıçtır, ancak daha yumuşak bir sigmoid işlevi daha iyi görünür. Bir cilt ağırlığı dağılımı fonksiyonunun seçilmesi, kısa bir mesafe boyunca cilt ağırlığının büyük bir varyasyonunu kullanarak, istenirse eklemlerde keskin kırışıklıklara neden olabilir.

 

Karıştırma Matrislerini Ayarlama

IDirect3DDevice9::SetTransform yöntemini çağırarak sistemin karıştırdığı dönüştürme matrislerini ayarlarsınız. İlk parametreyi D3DTS_WORLDMATRIX makro tarafından tanımlanan bir değere, ikinci parametreyi de ayarlanacak matrisin adresine ayarlayın.

Aşağıdaki C++ kod örneği, iki dünya matrisini tanımlar ve bu matrisler arasında geometri harmanlanarak eklemli bir kol yanılsaması yaratılır.

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

Karıştırma matrisi ayarlamak yalnızca sistemin matrisi daha sonra kullanmak üzere önbelleğe almasına neden olur; sisteme köşeleri karıştırmaya başlama talimatı vermez.

Geometri Birleştirmeyi Etkinleştirme

Geometri harmanlama varsayılan olarak devre dışıdır. Geometri karıştırmayı etkinleştirmek için IDirect3DDevice9::SetRenderState yöntemini çağırarak D3DRS_VERTEXBLEND işleme durumunu D3DVERTEXBLENDFLAGS numaralandırılmış türünden bir değere ayarlayın. Aşağıdaki kod örneği, iki dünya matrisi arasındaki bir karışım için işleme durumunu ayarlarken bu çağrının nasıl görünebileceğini gösterir.

d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );

D3DRS_VERTEXBLEND D3DVBF_DISABLE dışında bir değere ayarlandığında sistem, uygun sayıda karıştırma ağırlığının köşe biçimine dahil olacağını varsayar. Uyumlu bir köşe biçimi sağlamak ve Direct3D işleme yöntemlerine bu biçimin düzgün bir açıklamasını sağlamak sizin sorumluluğunuzdadır.

Etkinleştirildiğinde, sistem DrawPrimitive işleme yöntemleri tarafından işlenen tüm nesneler için geometri karıştırması gerçekleştirir.

Ayrıca Bkz.

Sabit İşlev FVF Kodları (Direct3D 9)

Geometri Birleşimi