Delen via


Wereldtransformatie (Direct3D 9)

De bespreking van de wereldtransformatie introduceert basisconcepten en bevat details over het instellen van een wereldtransformatie.

Wat is een wereldtransformatie?

Een wereldtransformatie transformeert coördinaten van de modelruimte, waarbij hoekpunten worden gedefinieerd ten opzichte van de lokale oorsprong van een model, in wereldruimte, waarbij hoekpunten worden gedefinieerd ten opzichte van een oorsprong die gebruikelijk is voor alle objecten in een scène. In wezen plaatst de wereld een model in de wereld; vandaar de naam. In het volgende diagram ziet u de relatie tussen het wereldcoördinaatsysteem en het lokale coördinaatsysteem van een model.

diagram van de relatie tussen wereldcoördinaten en lokale coördinaten

De wereldtransformatie kan elke combinatie van vertalingen, rotaties en schalen omvatten.

Een wereldmatrix instellen

Net als bij elke andere transformatie maakt u de wereldtransformatie door een reeks matrices samen te vatten in één matrix die het totaal van hun effecten bevat. In het eenvoudigste geval, wanneer een model zich bij de oorsprong van de wereld bevindt en de lokale coördinaatassen hetzelfde zijn als de wereldruimte, is de wereldmatrix de identiteitsmatrix. De wereldmatrix is meestal een combinatie van een vertaling in wereldruimte en mogelijk een of meer rotaties om het model naar behoefte om te zetten.

In het volgende voorbeeld, van een fictieve 3D-modelklasse die is geschreven in C++, worden de helperfuncties gebruikt die zijn opgenomen in de D3DX-hulpprogrammabibliotheek om een wereldmatrix te maken die drie draaiingen bevat om een model te richten en een vertaling om het te verplaatsen ten opzichte van de positie in de wereldruimte.

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

Nadat u de wereldmatrix hebt voorbereid, roept u de methode IDirect3DDevice9::SetTransform methode aan om deze in te stellen, waarbij u de D3DTS_WORLD macro opgeeft voor de eerste parameter.

Notitie

Direct3D maakt gebruik van de wereld en bekijk matrices die u instelt om verschillende interne gegevensstructuren te configureren. Telkens wanneer u een nieuwe wereld of weergavematrix instelt, berekent het systeem de bijbehorende interne structuren opnieuw. Het instellen van deze matrices, bijvoorbeeld duizenden keren per frame, kost rekenkracht veel tijd. U kunt het aantal vereiste berekeningen minimaliseren door uw wereld samen te voegen en matrices te bekijken in een wereldweergavematrix die u als wereldmatrix hebt ingesteld en vervolgens de weergavematrix in te stellen op de identiteit. Bewaar kopieën van afzonderlijke wereld en bekijk matrices in de cache, zodat u de wereldmatrix zo nodig kunt wijzigen, samenvoegen en opnieuw kunt instellen. Ter duidelijkheid: in deze documentatie maken Direct3D-voorbeelden zelden gebruik van deze optimalisatie.

 

transformeert