World Transform (Direct3D 9)
Diskussionen om världsomvandlingen introducerar grundläggande begrepp och innehåller information om hur du konfigurerar en världsomvandling.
Vad är en världstransformering?
En värld transformerar koordinater från modellutrymmet, där hörn definieras i förhållande till en modells lokala ursprung, till Världsrymden, där hörn definieras i förhållande till ett ursprung som är gemensamt för alla objekt i en scen. I grund och botten förvandlar världen en modell till världen; därav namnet. Följande diagram visar relationen mellan världskoordinatsystemet och en modells lokala koordinatsystem.
Världsomvandlingen kan omfatta alla kombinationer av översättningar, rotationer och skalningar.
Konfigurera en världsmatris
Precis som med alla andra transformeringar skapar du världen genom att sammanfoga en serie matriser till en enda matris som innehåller summan av deras effekter. I det enklaste fallet, när en modell har sitt ursprung i världen och dess lokala koordinataxlar är orienterade på samma sätt som världsrymden, är världsmatrisen identitetsmatrisen. Oftast är världsmatrisen en kombination av en översättning till världsrymden och eventuellt en eller flera rotationer för att omvandla modellen efter behov.
I följande exempel, från en fiktiv 3D-modellklass skriven i C++, används hjälpfunktionerna som ingår i D3DX-verktygsbiblioteket för att skapa en världsmatris som innehåller tre rotationer för att orientera en modell och en översättning för att flytta den i förhållande till dess position i världsrymden.
/*
* 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);
}
}
När du har förberett världsmatrisen anropar du metoden IDirect3DDevice9::SetTransform för att ange den och anger D3DTS_WORLD makro för den första parametern.
Not
Direct3D använder världen och visar matriser som du anger för att konfigurera flera interna datastrukturer. Varje gång du anger en ny värld eller vymatris beräknar systemet om de associerade interna strukturerna. Att ställa in dessa matriser ofta, till exempel tusentals gånger per ram, är beräkningsmässigt tidskrävande. Du kan minimera antalet nödvändiga beräkningar genom att sammanfoga din värld och visa matriser i en matris med världsvyer som du anger som världsmatris och sedan ange visningsmatrisen till identiteten. Behåll cachelagrade kopior av en enskild värld och visa matriser så att du kan ändra, sammanfoga och återställa världsmatrisen efter behov. För tydlighetens skull använder Direct3D-exempel sällan den här optimeringen i den här dokumentationen.
Relaterade ämnen