2009-08-20 21 views
6

Mam poważne problemy ze zrozumieniem macierzy widoku w XNA. Osiągnąłem dość daleko z wszystkimi pozostałymi częściami i odkąd nauczyłem się już wymaganych matematyki, nie chcę używać wbudowanych funkcji Matrixa bez zrozumienia tego, co robią w pierwszej kolejności.Widok macierzy XNA - szukam wyjaśnienia

Teraz rozumiem podstawy rotacji, projekcji i tłumaczenia, ale nie mogę do końca zrozumieć, jak działa matryca widoku w XNA.

Z tego, co zgromadziłem, matryca widokowa powinna przekształcić "świat" w swoją własną przestrzeń. Wydaje się to rozsądne, ale metoda Matrix.CreateLookAt w bibliotece jest dość zagadkowa.

Mam ustalone (poprzez sprawdzenie jaka wyjść funkcyjnych Library), że te dwa kawałki kodu wydajnością te same wyniki:

Matrix view = Matrix.CreateReflection(new Plane(Vector3.UnitX, 0)) * Matrix.CreateReflection(new Plane(Vector3.UnitZ, 0)) * Matrix.CreateTranslation(Position); 
// ..equals this if (Position = (0 0 -5), since LookAt "looks at" but the above just looks straight down Z).. 
Matrix blah = Matrix.CreateLookAt(Position, Vector3.Zero, Vector3.UnitY); 

Dlaczego flip osi X i Z? Myślałem, że powinieneś obrócić świat zgodnie z obrotem kamer, ale w przeciwnym kierunku, a następnie przetłumaczyć świat o tę samą ilość w przeciwnym kierunku.

Czy matryca widoku nie jest w ogóle wykorzystywana jako transformacja, a jedynie koduje pozycję i obrót kamery na świecie?

Odpowiedz

5

Macierz widoku przekształca scenę w przestrzeń widoku. W polu widzenia wirtualna kamera jest na początku i patrzy w dodatnim kierunku Z. Istnieją różne sposoby osiągnięcia tego celu, ale najczęściej matryca widokowa składa się z tłumaczenia i trzech obrotów wokół każdej osi.

Transform = Przekłada * rotationZ * rotationY * rotationX

+0

Dzięki, wygląda na to, że mój pierwotny pomysł był poprawny. Ale wszystkie te różne układy współrzędnych były nieco zagmatwane. – Skurmedel

1

komponowanie dwóch odbić daje jeden obrót, jeśli dobrze pamiętam moją geometrię.

+0

Interesujące. Powyższe odbicia powinny następnie odpowiadać obróceniu o 180 stopni wokół Y. – Skurmedel

21

Są trzy rodzaje transformacji, które musisz zrozumieć: świat, widok i projekcja.

Światowa transformacja zmienia współrzędne modeli z przestrzeni modelu na przestrzeń światową. Definiując wierzchołki modelu, definiujesz je względem źródła tego modelu. Transformacja światowa przekształca te wierzchołki, tak aby były względne względem początku współdzielonego przez wszystkie obiekty w scenie, tj. Przestrzeń światową.

Następnie transformacja widoku przekształca te wierzchołki w obszar widoku. Przeglądarka/kamera ma pozycję i orientację w przestrzeni widoku i służy do tworzenia macierzy widoku, którą stosujesz do wszystkich obiektów w scenie. W polu widoku kamera/widz znajduje się na początku, więc macierz widoku tłumaczy i obraca wszystkie obiekty, aby umieścić je w przestrzeni widoku.

Na koniec przekształcenie rzutów określa, jaki rodzaj "obiektywu" używa kamera. Do tej pory tłumaczymy i obracamy przedmioty, nie ma poczucia skali ani perspektywy. Transformata odwzorowania tworzy punkt widzenia i przekształca wierzchołki w tę rzutnię.

Teraz za twoje pytanie. Odbijasz układ współrzędnych wokół osi x, następnie na osi Z, a na końcu tłumaczysz. Zdarza się, że daje taki sam wynik, jak macierz, ponieważ pozycja znajduje się na płaszczyźnie xz i yz, ale zauważ, co się stanie, jeśli przeniesiesz pozycję o jedną jednostkę do osi Y. Wtedy dwie macierze nie będą równe

+1

Dziękuję za odpowiedź. Wybrałem odpowiedź z najniższą pozycją. Oboje pomogliście. – Skurmedel

+2

Bez obaw. Cieszę się, że to wymyśliłeś :) – Tchami

4

Poniższy link pomógł mi zrozumieć i znacznie bardziej efektywnie korzystać z matryc.Można je znaleźć interesujący:

http://stevehazen.wordpress.com/2010/02/15/matrix-basics-how-to-step-away-from-storing-an-orientation-as-3-angles/

robię stosunkowo samo jak ty teraz :)

+0

Dziękuję, że wygląda dość kompleksowo. – Skurmedel

+0

jeśli robisz cokolwiek innego opartego na 3D w XNA i chcesz być pompowany z linkami informacyjnymi, po prostu zapytaj. Zrobiłem wiele badań, zanim zacząłem i skompilowałem całkiem dobrą listę informacji dla bardziej zaawansowanych rzeczy. – Remm

+0

Hiya, Remm, robię trójwymiarowe materiały XNA i chciałbym, aby były one wypełnione linkami informacyjnymi! Masz jakieś sugestie dla mnie? –