Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Matristransformeringar hanterar mycket av lågnivåmatematiken för 3D-grafik.
Geometripipelinen tar hörn som indata. Transformeringsmotorn tillämpar världstransformeringar, vytransformeringar och projektionstransformeringar på topunkterna, klipper resultatet och skickar allt till rasteriseraren.
| Transformera och utrymme | Beskrivning |
|---|---|
| Modellkoordinater i modellutrymme | I pipelinens huvud deklareras en modells hörn i förhållande till ett lokalt koordinatsystem. Det här är ett lokalt ursprung och en riktning. Den här orienteringen av koordinater kallas ofta modellutrymme. Enskilda koordinater kallas modellkoordinater. |
| Världen förvandlas till världsrymd | Den första fasen av geometripipelinen omvandlar en modells hörn från deras lokala koordinatsystem till ett koordinatsystem som används av alla objekt i en scen. Processen att omorientera hörnen kallas World transform, som konverterar från modellutrymme till en ny orientering som kallas världsrymd. Varje hörn i världsrymden deklareras med hjälp av världskoordinater. |
| Visa transformering till visningsutrymme (kamerautrymme) | I nästa steg är hörnen som beskriver din 3D-värld inriktade på en kamera. Programmet väljer alltså en synvinkel för scenen, och koordinaterna för världsrymden flyttas och roteras runt kamerans vy, vilket omvandlar världsrymden till visningsutrymme (kallas även kamerautrymme). Det här är Viewtransform, som konverterar från världsutrymmet till vyutrymmet. |
| Projektion omvandlas till projektionsutrymme | Nästa steg är projektionstransformering, som konverterar från visningsutrymme till projektionsutrymme. I den här delen av pipelinen skalas objekt vanligtvis med förhållande till deras avstånd från betraktaren för att ge illusionen av djup till en scen; nära objekt görs för att visas större än fjärran objekt. För enkelhetens skull refererar den här dokumentationen till det utrymme där hörn finns efter projektionstransformationen som projektionsutrymme. Vissa grafikböcker kan referera till projektionsutrymme som homogent utrymme efter perspektiv. Inte alla projektionstransformationer förändrar storleken på objekt i en scen. En projektion som denna kallas ibland en affin eller ortoggonal projektion. |
| Urklipp i skärmutrymme | I den sista delen av pipelinen tas alla vertexer som inte kommer att synas på skärmen bort, så att rasteriseraren inte behöver ta tid att beräkna färger och skuggning för något som aldrig syns. Den här processen kallas urklipp. Efter beskärning skalas de återstående vertiklarna enligt visningsfönstrets parametrar och konverteras till skärmkoordinater. De resulterande hörnen, som visas på skärmen när scenen rastreras, finns i skärmutrymme. |
Transformeringar används för att konvertera objektgeometri från ett koordinatutrymme till ett annat. Direct3D använder matriser för att utföra 3D-transformeringar. Matriser skapar 3D-transformeringar. Du kan kombinera matriser för att skapa en enda matris som omfattar flera transformeringar.
Du kan transformera koordinater mellan modellutrymme, världsutrymme och visningsutrymme.
- World transform – Konverterar från modellutrymme till världsrymd.
- Visa transformering – Konverterar från världsrymden för att visa utrymme.
- Projection transform – Konverterar från vyutrymme till projektrumsutrymme.
matristransformeringar
I program som fungerar med 3D-grafik kan du använda geometriska transformeringar för att göra följande:
- Ange platsen för ett objekt i förhållande till ett annat objekt.
- Rotera och ändra storlek på objekt.
- Ändra visningspositioner, riktningar och perspektiv.
Du kan transformera valfri punkt (x,y,z) till en annan punkt (x', y', z') med hjälp av en 4x4-matris, enligt följande ekvation.
Utför följande ekvationer på (x, y, z) och matrisen för att producera punkten (x', y', z').
De vanligaste transformerna är översättning, rotation och skalning. Du kan kombinera matriserna som ger dessa effekter till en enda matris för att beräkna flera transformeringar samtidigt. Du kan till exempel skapa en enda matris för att översätta och rotera en serie punkter.
Matriser skrivs i radkolumnsordning. En matris som jämnt skalar hörn längs varje axel, så kallad enhetlig skalning, representeras av följande matris med matematisk notation.
I C++deklarerar Direct3D matriser som en tvådimensionell matris med hjälp av en matrisstruct. I följande exempel visas hur du initierar en D3DMATRIX struktur för att fungera som en enhetlig skalningsmatris (skalningsfaktorn "s").
D3DMATRIX scale = {
5.0f, 0.0f, 0.0f, 0.0f,
0.0f, 5.0f, 0.0f, 0.0f,
0.0f, 0.0f, 5.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
};
Översätt
Följande ekvation översätter punkten (x, y, z) till en ny punkt (x', y', z').
Du kan skapa en översättningsmatris manuellt i C++. I följande exempel visas källkoden för en funktion som skapar en matris för att översätta hörn.
D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
D3DXMATRIX ret;
D3DXMatrixIdentity(&ret);
ret(3, 0) = dx;
ret(3, 1) = dy;
ret(3, 2) = dz;
return ret;
} // End of Translate
Skala
Följande ekvation skalar punkten (x, y, z) efter godtyckliga värden i x-, y- och z-riktningarna till en ny punkt (x', y', z').
rotera
De transformeringar som beskrivs här gäller för vänsterhänta koordinatsystem och kan därför skilja sig från transformeringsmatriser som du har sett någon annanstans.
Följande ekvation roterar punkten (x, y, z) runt x-axeln och producerar en ny punkt (x', y', z').
Följande ekvation roterar punkten runt y-axeln.
Följande ekvation roterar punkten runt z-axeln.
I dessa exempelmatriser står den grekiska bokstaven theta för rotationsvinkeln, i radianer. Vinklar mäts medsols när du tittar längs rotationsaxeln mot ursprunget.
Följande kod visar en funktion för att hantera rotation om X-axeln.
// Inputs are a pointer to a matrix (pOut) and an angle in radians.
float sin, cos;
sincosf(angle, &sin, &cos); // Determine sin and cos of angle
pOut->_11 = 1.0f; pOut->_12 = 0.0f; pOut->_13 = 0.0f; pOut->_14 = 0.0f;
pOut->_21 = 0.0f; pOut->_22 = cos; pOut->_23 = sin; pOut->_24 = 0.0f;
pOut->_31 = 0.0f; pOut->_32 = -sin; pOut->_33 = cos; pOut->_34 = 0.0f;
pOut->_41 = 0.0f; pOut->_42 = 0.0f; pOut->_43 = 0.0f; pOut->_44 = 1.0f;
return pOut;
}
Sammanfoga matriser
En fördel med att använda matriser är att du kan kombinera effekterna av två eller flera matriser genom att multiplicera dem. Det innebär att du inte behöver använda två matriser för att rotera en modell och sedan översätta den till någon plats. I stället multiplicerar du rotations- och översättningsmatriserna för att skapa en sammansatt matris som innehåller alla deras effekter. Den här processen, som kallas matrissammanfogning, kan skrivas med följande ekvation.
I den här ekvationen är C den sammansatta matris som skapas, och M₁ via Mn är de enskilda matriserna. I de flesta fall sammanfogas bara två eller tre matriser, men det finns ingen gräns.
Den ordning i vilken matrisens multiplikation utförs är avgörande. Föregående formel återspeglar vänster-till-höger-regeln för matrissammanfogning. Det vill: de synliga effekterna av de matriser som du använder för att skapa en sammansatt matris sker i vänster-till-höger-ordning. En typisk världsmatris visas i följande exempel. Tänk dig att du skapar en världsmatris för ett typiskt flygande tefat. Du skulle förmodligen vilja snurra tefatet runt sitt centrum - y-axeln i modellutrymmet - och förflytta det till en annan plats i din scen. För att åstadkomma den här effekten skapar du först en rotationsmatris och multiplicerar den sedan med en översättningsmatris, enligt följande ekvation.
I den här formeln är Ry en matris för rotation om y-axeln, och Tw är en översättning till någon position i världskoordinater.
Den ordning i vilken du multiplicerar matriserna är viktig eftersom matris multiplikation, till skillnad från att multiplicera två skalärvärden, inte är kommutativ. Genom att multiplicera matriserna i motsatt ordning förflyttas det flygande tefatet visuellt till dess position i världsrummet och roteras sedan runt världens ursprung.
Oavsett vilken typ av matris du skapar, kom ihåg regeln från vänster till höger för att säkerställa att du uppnår de förväntade effekterna.
Relevanta ämnen