Počítačové hry a animace Cvičení 2
(2) Notová osnova Transformace Kamera Viewporty Quaterniony
(3) Transformace Homogenní koordináty – –R n => n + 1 Affiní transformace reprezentovány jako maticové operace – –Rotation – –Scale (Shear) – –Translation
(4) Translace (posun) Není lineární transformací – –A => A + t Matrix.CreateTranslation
(5) Rotace Matrix.CreateRotationX Matrix.CreateRotationY Matrix.CreateRotationZ
Vy nemáte rádi algebru? To máte blbý :-) To máte blbý :-) –Tak pokračujeme… (6)
(7) Škálování Škálování daným faktorem (to znamená zvětšování a zmenšování) Matrix.CreateScale
Jak je to v XNA XNA má třídy reprezentaci matic a vektorů. XNA má třídy reprezentaci matic a vektorů. Vector2, Vector3, Vector4 Vector2, Vector3, Vector4 –Přetížené operátory +,-,*,/ –Cross(Vector,Vector) –Dot(Vector, Vector) –Normalize –Transform – Vynásobení maticí Matrix Matrix –CreateTranslation, CreateRotation, CreateScale atd. –Přetížené operátory (8)
Jak chápat transformace Děláme je obráceně než nám to dává smysl Děláme je obráceně než nám to dává smysl –(to ale není zrovna ideální přístup k věci :-)) Mění souřadnicový systém (lineární prostor, bázi) Mění souřadnicový systém (lineární prostor, bázi) –(Jsou to matice, na pořadí záleží! Ukážeme si to na příkladech) (9)
Na pořadí záleží (na tabuli) Rozdíl mezi Rozdíl mezi –Matrix m = Matrix.CreateRotation(0, MathHelper.PI, 0); –m *= Matrix.CreteTranslation(50, 0, 0); A –Matrix m = Matrix.CreteTranslation(50, 0, 0); –m *= Matrix.CreateRotation(0, MathHelper.PI, 0); (10)
Úkol na teď Otevřít dnešní cvičení Otevřít dnešní cvičení Vyrobte takovou světovou matici aby tank jezdil dokolečka (a byl vždy předkem ve směru jízdy) Vyrobte takovou světovou matici aby tank jezdil dokolečka (a byl vždy předkem ve směru jízdy) –V update funkci se přepočítává world matice, tam udělejte změnu –Počítá se tam taky úhel. –(a to je všechno co teď potřebujete) (11)
(12) Kamera Pozice kamery – –„vozík“ a „rameno“ Rotace kamery – –Sledování cíle Zoom kamery – –Pohyb kamery pozice -> cíl – –Zvětšení/Zmenšení FOV Depth of field – –Oko dokáže ostřit jen na určitou dálku
Kamera Je popsána dvěma maticemi: Je popsána dvěma maticemi: View Matice View Matice –Udává pozici a směr (rotaci kamery) v prostoru Projection Matice Projection Matice –Udává „fyzikální“ vlastnosti kamery. (13) Perspektivní kamera Ortho kamera
World*View*Projection K tomu abychom dostali objekt na obrazovku potřebujeme 3 matice: K tomu abychom dostali objekt na obrazovku potřebujeme 3 matice: –World – Světová matice defineje pozici, rotaci a velikost objektu k počátku souř. systému –View – Definuje pozici kamery v prostoru –Projection – Definuje „fyzikální“ vlastnosti kamery. (FoV, poměr stran). Zajišťuje, to že objekty víc „vzadu“ jsou menší (Nebo taky ne, pokud je Ortho)Zajišťuje, to že objekty víc „vzadu“ jsou menší (Nebo taky ne, pokud je Ortho) WorldViewProj * Bod_v_3D = Bod_na_obrazovce WorldViewProj * Bod_v_3D = Bod_na_obrazovce –(xy – pozice na obrazovce a hloubka-vzdálenost od kamery v z) (14)
(15) Herní kamera Matrix.CreateLookAt Matrix.CreatePerspectiveFieldOfView Matrix.CreateOrthographic
(16) Viewport Mapování renderu do daného prostoru na obrazovce Aktuální viewport – –graphics.GraphicsDevice.Viewport Přenastavení – –Viewport.X – –Viewport.Y – –Viewport.Width – –Viewport.Height
Úkol na teď Odkomentujte #define USE_VIEWPORTS Odkomentujte #define USE_VIEWPORTS –Woohooo najednou funguje split screen Pro druhý viewport vyrobte 3rd person kameru (vždycky napevno za objektem) – Nic moc kamera, ale co… Pro druhý viewport vyrobte 3rd person kameru (vždycky napevno za objektem) – Nic moc kamera, ale co… Nápověda Nápověda –Vypočítat správně pozici kde kamera je Normalizace, skalární násobení…Normalizace, skalární násobení… (17)
Úkol na teď (a možná taky na doma) Naprogramovat ovládání tanku pomocí šipek Naprogramovat ovládání tanku pomocí šipek Nápověda: Nápověda: –Pro pohyb: Vector3 direction; – vždy normalizovanýVector3 direction; – vždy normalizovaný Vector3 position;Vector3 position; Float speed;Float speed; position = position + direction * speed;position = position + direction * speed; –Pro render: Stačí co už máte a udržovat aktuální pozici a rotaci tankuStačí co už máte a udržovat aktuální pozici a rotaci tanku (18)
Jak na quaterniony V XNA struktura Quaternion V XNA struktura Quaternion –vektor=pozice, quaternion=orientace –Nulová rotace – Quaternion.Identity –Matrix.FromQuaternion převede na rotační matici –Skládání pomocí Quaternion.Concatenate –Interpolace pomocí Quaternion.Slerp –Matrix.Transform a Vector.Transform pro transformace bez převedení na matici (19)
Quaternionová interpolace Úhel rotace reprezentované quaternionem: Úhel rotace reprezentované quaternionem: –theta=2*arccos(w) Analogie s vektory: Analogie s vektory: –Úhel ~ délka vektoru –Slerp ~ interpolace vektorů –Úhlová rychlost ~ vektorová rychlost (20)
Jak přijít ke quaternionu Quaternion.CreateFromAxisAngle Quaternion.CreateFromAxisAngle –Pokud předem přesně víme co a jak Quaternion.CreateFromYawPitchRoll Quaternion.CreateFromYawPitchRoll –Vhodné pro volné a relativní rotace (letadla aj.) Quaternion.CreateFromRotationMatrix Quaternion.CreateFromRotationMatrix –Pro ošemetné případy si pomůžeme maticí Složitá absolutní rotace pomocí XYZ vektorůSložitá absolutní rotace pomocí XYZ vektorů „koukám na něco“ dekompozicí LookAt matice: Matrix.CreateLookAt → Matrix.Decompose„koukám na něco“ dekompozicí LookAt matice: Matrix.CreateLookAt → Matrix.Decompose (21)
(22) Quaterniony Efektivnější pro výpočet rotací než matice – –„Gímbal Lock“ problém Quaternion.CreateFromRotationMatrix Quaternion.CreateFromYawPitchRoll Quaternion.CreateFromAxisAngle Quaternion.Slerp – –Spherical Linear Interpolation Matrix.CreateFromQuaternion!
(23) Samples