Dünya Dönüşümü (Direct3D 9)
Dünya dönüşümü tartışması, temel kavramları tanıtır ve bir dünya dönüşümünün nasıl ayarlanacağına ilişkin ayrıntılar sağlar.
Dünya Dönüşümü Nedir?
Dünya dönüşümü, köşelerin modelin yerel kaynağına göre tanımlandığı model uzayından, köşelerin sahnedeki tüm nesneler için ortak olan bir kaynakla göreli olarak tanımlandığı World Space'e göre koordinatları değiştirir. Özünde, dünya dönüşümü dünyaya bir model yerleştirir; bu nedenle adı. Aşağıdaki diyagramda dünya koordinat sistemi ile modelin yerel koordinat sistemi arasındaki ilişki gösterilmektedir.
nasıl ilişkili olduğunu gösteren diyagram
Dünya dönüşümü çevirilerin, döndürmelerin ve ölçeklendirmelerin herhangi bir bileşimini içerebilir.
Dünya Matrisi Ayarlama
Diğer dönüşümlerde olduğu gibi, bir dizi matrisi etkilerinin toplamını içeren tek bir matriste birleştirerek dünya dönüşümünü oluşturun. En basit durumda, bir model dünya kaynağında olduğunda ve yerel koordinat eksenleri dünya uzayıyla aynı şekilde yönlendirildiğinde, dünya matrisi kimlik matrisidir. Daha yaygın olarak, dünya matrisi, dünya uzayı çevirisinin ve modeli gerektiği gibi döndürmek için bir veya daha fazla döndürmenin birleşimidir.
Aşağıdaki örnek, C++ dilinde yazılmış kurgusal bir 3B model sınıfından D3DX yardımcı programı kitaplığında bulunan yardımcı işlevleri kullanarak modeli yönlendirmek için üç döndürme içeren bir dünya matrisi ve onu dünya uzayı içindeki konumuna göre yeniden konumlandırmak için bir çeviri içerir.
/*
* For the purposes of this example, the following variables
* are assumed to be valid and initialized.
*
* The m_xPos, m_yPos, m_zPos variables contain the model's
* location in world coordinates.
*
* The m_fPitch, m_fYaw, and m_fRoll variables are floats that
* contain the model's orientation in terms of pitch, yaw, and roll
* angles, in radians.
*/
void C3DModel::MakeWorldMatrix( D3DXMATRIX* pMatWorld )
{
D3DXMATRIX MatTemp; // Temp matrix for rotations.
D3DXMATRIX MatRot; // Final rotation matrix, applied to
// pMatWorld.
// Using the left-to-right order of matrix concatenation,
// apply the translation to the object's world position
// before applying the rotations.
D3DXMatrixTranslation(pMatWorld, m_xPos, m_yPos, m_zPos);
D3DXMatrixIdentity(&MatRot);
// Now, apply the orientation variables to the world matrix
if(m_fPitch || m_fYaw || m_fRoll) {
// Produce and combine the rotation matrices.
D3DXMatrixRotationX(&MatTemp, m_fPitch); // Pitch
D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
D3DXMatrixRotationY(&MatTemp, m_fYaw); // Yaw
D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
D3DXMatrixRotationZ(&MatTemp, m_fRoll); // Roll
D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
// Apply the rotation matrices to complete the world matrix.
D3DXMatrixMultiply(pMatWorld, &MatRot, pMatWorld);
}
}
Dünya matrisini hazırladıktan sonra, IDirect3DDevice9::SetTransform yöntemini çağırarak ilk parametre için D3DTS_WORLD makroyu belirtin.
Not
Direct3D dünyayı kullanır ve çeşitli iç veri yapılarını yapılandırmak için ayarladığınız matrisleri görüntüler. Her yeni dünya veya görünüm matrisi ayarladığınızda, sistem ilişkili iç yapıları yeniden hesaplar. Örneğin, bu matrisleri sık sık ayarlamak, kare başına binlerce kez hesaplama açısından zaman alır. Dünyanızı birleştirerek ve matrisleri dünya matrisi olarak ayarladığınız bir dünya görünümü matrisine dönüştürerek ve ardından görünüm matrisini kimliğe ayarlayarak gerekli hesaplamaların sayısını en aza indirebilirsiniz. Gerektiğinde dünya matrisini değiştirebilmeniz, birleştirebilmeniz ve sıfırlayabileceğiniz tek tek dünyanın önbelleğe alınmış kopyalarını tutun ve matrisleri görüntüleyin. Netlik sağlamak için, bu belgelerde Direct3D örnekleri nadiren bu iyileştirmeyi uygular.
İlgili konular