Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

XNA Współrzędne jednorodne Kurs ITA-106 (Grafika i multimedia) – Współrzędne jednorodne Jacek Matulewski (

Podobne prezentacje


Prezentacja na temat: "XNA Współrzędne jednorodne Kurs ITA-106 (Grafika i multimedia) – Współrzędne jednorodne Jacek Matulewski ("— Zapis prezentacji:

1 XNA Współrzędne jednorodne Kurs ITA-106 (Grafika i multimedia) – Współrzędne jednorodne Jacek Matulewski ( Wersja: 30 stycznia 2009

2 Transformacje Podstawowe pojęcia grafiki 3D: Transformacje – określane we współrzędnych sceny 3D translacja (Matrix.CreateTranslation, macierz 4x4!), obrót (Matrix.CreateRotationXYZ, z osi obrotu i kąta, yaw+pitch+roll, klasa Quaternion) skalowanie (Matrix.CreateScale), pochylenie złożenie – dowolna macierz 4x4 (Matrix.Multiply) Rozdzielenie macierzy świata i widoku (wygoda!) Transformacje są wykonywane od końca (post-multiplication)

3 Historia i zalety Współrzędne jednorodne (homogenous coordinates) Wprowadzone w 1946 przez E. Maxwella (rzutowanie) W 1965 L. Roberts użył ich do zunifikowania zapisu wszystkich transformacji: translacji, obrotów, skalowanie i pochylania Opis punktów n-wymiarowej przestrzeni za pomocą n+1 współrzędnych Obcinanie we współrzędnych jednorodnych może odbywać się w sześcianie zamiast w ściętym ostrosłupie (znacznie efektywniejsze numerycznie)

4 Macierz translacji? We współrzędnych kartezjańskich (2D) obrót i translacja mogą być zapisane: We współrzędnych jednorodnych:

5 Macierze w XNA Konstruktor klasy Matrix przyjmuje elementy kolumnami (m11, m12, m13, m14, m21, m22, …,m44) Oznacza to, że macierz możemy zadeklarować instrukcją Matrix macierz = new Matrix(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F);

6 Macierze w XNA Jeżeli chcemy ułatwić sobie życie, możemy użyć metody wykonującej transpozycję: Matrix macierz = Matrix.Identity; macierz = Matrix.Transpose(macierz);

7 Metoda Matrix.Multiply Metoda Matrix.Multiply (i operator *) wykonuje mnożenie macierzy (np. macierzy świata) przez macierz podaną w argumencie tj. M M·H (postmultiplication) Przykład użycia – mnożenie przez macierz jednostkową Matrix macierz = new Matrix(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); macierz = Matrix.Transpose(macierz); W szablonie zmiany wprowadzać w funkcji Game1.Initialize (przed rysowaniem figury) efekt.World = Matrix.Multiply( efekt.World, macierz); efekt.World = efekt.World * macierz;efekt.World *= macierz;

8 Funkcja glMultMatrix Efekt mnożenia przez macierz I: żadnych zmian

9 Skalowanie Macierz skalowania we współrzędnych jednorodnych efekt.World = Matrix.Identity; Matrix m..rz = new Matrix(0.5f, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); macierz = Matrix.Transpose(macierz); efekt.World *= macierz;

10 Skalowanie Macierz skalowania jednorodnego we wszystkich kier. efekt.World = Matrix.Identity; Matrix macierz = new Matrix(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2); macierz = Matrix.Transpose(macierz); efekt.World *= macierz;

11 Odbicie Odbicie = ujemne skalowanie efekt.World = Matrix.Identity; Matrix macierz = new Matrix(1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); macierz = Matrix.Transpose(macierz); efekt.World *= macierz;

12 Obrót Macierz obrotu we współrzędnych jednorodnych rozkładana jest na obroty wokół osi (kąty Eulera): Obrót wokół osi XObrót wokół osi Y Obrót o kąt wokół osi Z kąt cos sin 0°0°10 30° ° ° °01

13 Obrót Obrót wokół osi Z o kąt 45° Matrix macierz = new Matrix( f, f, 0, 0, f, f, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); macierz = Matrix.Transpose(macierz); macierz = Matrix.CreateRotationZ(MathHelper.PiOver4);

14 OpenGL float const a=-30; float const ar=a*M_PI/180.0f; float Rx[16]= {1,0,0,0, 0,cos(ar),-sin(ar),0, 0,sin(ar),cos(ar),0, 0,0,0,1}; glMultMatrixf(Transpozycja(Rx)); OpenGL: glRotatef(30,1,0,0); Obrót Obrót wokół osi X o kąt : #include

15 Obrót Obrót wokół osi X o kąt : XNA: Matrix.CreateFromAxisAngle( Vector3.UnitX, MathHelper.ToRadians(-30)); Matrix.CreateRotationX(MathHelper.ToRadians(-30)); OpenGL: glRotatef(-30,1,0,0);

16 Obrót Obrót wokół osi X o kąt : float a = MathHelper.ToRadians(30); float cosa = (float)Math.Cos(a); float sina = (float)Math.Sin(a); Matrix macierz = new Matrix( 1, 0, 0, 0, 0, cosa, -sina, 0, 0, sina, cosa, 0, 0, 0, 0, 1); macierz = Matrix.Transpose(macierz);

17 Pochylenie Macierz pochylenia (ang. skew) Elementy pozadiagonalne Nie ma odpowiednika w metodach klasy Matrix

18 Translacja Macierz translacji we współrzędnych jednorodnych macierz = new Matrix(1, 0, 0, 1, 0, 1, 0, 0.5f, 0, 0, 1, 0.25f, 0, 0, 0, 1); macierz = Matrix.Transpose(macierz); macierz = Matrix.CreateTranslation(1, 0.5f, 0.25f);

19 Składanie transformacji Złożenie translacji w kier. X i obrotu wokół osi Z

20 1)Translacja o wektor [2,0,0] 2) Obrót wokół osi Z o 45° 3) Przesunięcie o wektor [-2,0,0] Obrót wokół wyznaczonego punktu Obrót o 45° w płaszczyźnie XY wokół punktu (2,0,0):

21 Obrót wokół wyznaczonego punktu Obrót o 45° w płaszczyźnie XY wokół punktu (2,0,0): 3) Przesunięcie o wektor [-2,0,0] macierz *= Matrix.CreateTranslation(-2, 0, 0); 2) Obrót wokół osi Z o 45° macierz *= Matrix.CreateRotationZ(MathHelper.PiOver4); 1)Translacja o wektor [2,0,0] macierz *= Matrix.CreateTranslation(2,0,0); Matrix macierz = Matrix.Identity; Należy pamiętać o odwrotnej kolejności transformacji!

22 Obrót wokół wyznaczonego punktu Obrót o 45° w płaszczyźnie XY wokół punktu (2,0,0): 1)Translacja o wektor [2,0,0] 2) Obrót wokół osi Z o 45° 3) Przesunięcie o wektor [-2,0,0]

23 Rzutowania Rzutowanie równoległe na płaszczyznę XY (Matrix.CreateOrthographic) Rzutowanie perspektywiczne (Matrix.CreatePerspective)


Pobierz ppt "XNA Współrzędne jednorodne Kurs ITA-106 (Grafika i multimedia) – Współrzędne jednorodne Jacek Matulewski ("

Podobne prezentacje


Reklamy Google