Transformationer D-grafik Gustav Taén gustavt@nada.kth.se Inom datorgrafik är transformationer den kanske viktigaste formen av operation. De vanligaste transformationerna är linjära och kan skrivas som matriser. Många är också affina, d.v.s. alla punkter på en linje fortsätter tter att ligga på linjen efter transformationen, parallella linjer bevaras, och förhållandet mellan avstånd bevaras. D64 Grafik och Interaktionsprogrammering VT 6 Translation Skalning ' + d, ' + d ' d P P T, ', d ' P' P + T ' s ' s Skalningen sker kring origo. Rotation ' cosθ ' sinθ sinθ cosθ Rotationen sker kring origo. Homogena koordinater Det vore bra om vi kunde skriva alla dessa transformationer på ett konsekvent sätt. Det funkar om vi inför en tredje koordinat w. Definition: två punkter är lika om den ena är en multipel av den andra. Aiom: Åtminstone en av de tre koordinaterna måste vara skild från. Vi säger att (/w, /w) är de kartesiska koordinaterna (cartesian coordinates). När w ligger punkten i oändligheten och vi definierar att (, ) då representerar en riktning/vektor.
Punkter och riktningar Transformationsmatriser Riktningar (vektorer) och punkter är olika geometriska entiteter och eisterar oberoende av referenskoordinatsstem! Men de kan definieras i förhållande till ett sådant. Och vi behöver ett för att kunna specificera dem med siffror. Translation Skalning Rotation ' d ' d ' s ' s ' cosθ sinθ ' sinθ cosθ I affina transformationer ändras aldrig w-koordinaten. Kombination av transformationer Eempel Vi kan nu kombinera transformationer genom att multiplicera ihop matriserna! Men resultatet kan bli olika om man vänder på ordningen! Rotera kring en punkt annan än origo: T.5 S.5 ( ST ) P.5 ( T ) S P.5 (,) (,) (.5,.5) Mer om rotationsmatriser Skevning (shear) Om R är en rotationsmatris är den översta - delmatrisen ortogonal. Riktningsvektorerna (r,r,) och (r,r,) är de två vektorer som - resp. - aeln är roterade till! r R r r r SH SH b a
Spegling (reflection) u uu RE uu u Där (u, u ) är riktningsvektorn (med längd ) man speglar igenom. Ickelinjära transformationer Förekommer inte lika ofta som linjära ra,, men är inte alls ovanliga. Eempel: : Environment mapping. s R t + R R + ( R z z + ) + R + R + R + ( R + ) Transformationer av hörn Det vore i praktiken omöjligt i 3D-grafik att transformera varje piel för sig. Om vi använder nder linjära transformationer räcker det dock att transformera hörnen och binda samman dem med linjer! Man interpolerar sedan data definierad i hörnen linjärt över primitiverna. Om det är färg man interpolerar brukar det kallas Goraud shading. Transformationer av pilar I många lägen transformerar man dock pilar. Det är viktigt att man utgår från målbilden och hämtar mtar pilar från originalet genom att transformera bak bakåt, annars uppstår hål. Det kan också vara nödvändigt att filtrera resultatet. Eempel Compositing 3
Compositing Compositing Georges Méliès, tidigt 9-t. http://www.cdisweden.com/ Lager Eempel Bildbuffrar som kombineras ihop piel för piel nedifrån och upp. För varje ntt lager definierar man en funktion som beskriver hur informationen från föregående lager ska kombineras ihop med aktuellt lager. Eempel Eempel 4
Eempel Sprites Monke Island 3 Lager och sprites Paralla-scrolling Monke Island 3 Moon Patrol Pseudo-3D.5D Out Run Doom 5
Isometriska projektioner D-grafik i Java import java.awt.*; import java.swing.*; public class GrafikTest etends JFrame { public void paint(graphics g) { g.drawstring("hello",, 5); Q*Bert Knight Lore SimCit public static void main(string[] args) { GrafikTest f new GrafikTest(); f.settitle("grafiktest"); f.setsize(3, 3); f.setvisible(true); D-grafik i Java import java.awt.*; import java.swing.*; import java.awt.geom.*; D-grafik i Java public class JavaD etends JFrame { public void paint(graphics g) { GraphicsD g (GraphicsD) g; g.setrenderinghint(renderinghints.key_antialiasing, RenderingHints.VALUE_ANTIALIAS_ON); BasicStroke bs new BasicStroke(); g.setstroke(bs); GeneralPath p new GeneralPath(); p.moveto(5, 5); p.lineto(5, 5); p.lineto(, ); p.closepath(); g.draw(p); public static void main(string[] args) { JavaD f new JavaD(); f.settitle("javad"); f.setsize(3, 3); f.setvisible(true); Transformationer i JavaD GeneralPath p new GeneralPath(); p.moveto(5, 5); p.lineto(5, 5); p.lineto(, ); p.closepath(); g.draw(p); AffineTransform t AffineTransform.getTranslateInstance(, 5); t.rotate(-math.pi/3.); AffineTransform old g.gettransform(); g.transform(t); g.draw(p); g.settransform(old); Mer om JavaD Det finns möjlighet att använda nda lager och masking i JavaD. Man kan också kombinera ihop primitiver automatiskt med boolska operationer. Stöd för att ladda och rita bitmaps/bilder bilder finns också. 6