Przekształcenia wierzchołków w 2D

Postanowiłem nieco przebudować wyświetlanie grafiki w AGE. Do tej pory wszystko wyświetlane było za pomocą D3DXSprite… Ma to swoje zalety (prostota użycia), ale ma też wady. Ciężko tego używać chcąc jednocześnie wyświetlać osobno linie i inne takie.

Stwierdziłem, że przejdę na „niższy” poziom i wykorzystam do tego celu bufory wierzchołków. To mi da trochę więcej możliwości. Jedynym powodem, dla którego wcześniej nie zastosowałem tego rozwiązania było to, że napisałem już interfejs dla klasy ageSprite, a więc były pewne wymagania związane z użytkowaniem. Prawdę mówiąc pomysł przejścia na Vertex Buffery zabiło głównie to, że nie miałem ochoty kombinować z przekształceniami, a wykorzystywanie do tego wszystkiego D3DXMatrix i mnożenie ich za każdym razem, a później wymnażanie jeszcze wierzchołków przez iloczyn tych macierzy to prawie morderstwo obliczeniowe dla procesora 😉 Masa niepotrzebnych operacji.

Z tego względu rozpisałem sobie jak powinny wyglądać przekształcenia dla kolejnych wierzchołków biorąc pod uwagę, że chce określić sobie hotspot dla obrazka czyli środek obrotu i rotacji. Można próbować nazwać to środkiem obrazka, ale takim nie do końca 😉 Kolejność tych przekształceń wygląda tak:

  1. Przesunięcie wierzchołka o wektor [-hx, -hy] (hx, hy – współrzędne hotspot)
  2. Rotacja i skalowanie
  3. Przesunięcie wierzchołka o wektor [tx, ty] (tx, ty – współrzędne obrazka na ekranie)

Aby łatwiej było zrozumieć o co chodzi stworzyłem sobie taki prosty rysuneczek prezentujący te wszystkie współrzędne w zrozumiały sposób (mam nadzieję):

Postanowiłem połączyć pożyteczne z pożytecznym (to nie błąd) i ręcznie wymnożyć sobie te wszystkie macierze przekształceń a na końcu pomnożyć współrzędne hipotetycznego wierzchołka przez tak otrzymaną macierz. Dzięki temu zyskałem 2 rzeczy. Poćwiczyłem sobie mnożenie macierzy, co warto było zrobić oraz otrzymałem konkretne wzory na współrzędne punktu do którego zastosowane są te wszystkie przekształcenia za jednym zamachem.

Jednym słowem odwaliłem trochę roboty za komputer, ale za to powinienem zyskać trochę na czasie używając tych wzorków. Jeśli ktoś jest ciekaw jak one wyglądają dam je tutaj wraz z opisem wszystkich znaczków 🙂

x’ = s( sin A * (hy-y) + cos A * (x-hx) ) + tx
y’ = s( sin A * (x-hx) + cos A * (y-hy) ) + ty

x, y – współrzędne wierzchołka przed przekształceniami
x’, y’ – nowe współrzędne wierzchołka po przekształceniach
A – kąt obrotu ( sin A i cos A to odpowiednio sinus i cosinus kąta A )
hx, hy – współrzędne hotspot
tx, ty – współrzędne obrazka na ekranie (konkretniej to są to globalne współrzędne dla hx i hy co widać na obrazku wyżej )

Reklamy

2 myśli nt. „Przekształcenia wierzchołków w 2D

  1. „a wykorzystywanie do tego wszystkiego D3DXMatrix i mnożenie ich za każdym razem, a później wymnażanie jeszcze wierzchołków przez iloczyn tych macierzy to prawie morderstwo obliczeniowe dla procesora. Masa niepotrzebnych operacji”

    A czy przypadkiem D3DXSprite wewnątrz nie robi wszystkiego tak samo? 😛

  2. Przypuszczam, że zastosowali tam jakieś optymalizacje, chociaż to ich tam wie…

    Tak czy inaczej używanie D3DXSprite było wygodniejsze i nie wymagało przemyśliwania zbyt wielkiego 😛 Teraz, kiedy się już zdobyłem na wyliczenie tych wzorków mogę spokojnie przerobić kilka kawałków kodu i powinno być szybciej. Taką mam nadzieję przynajmniej

    Jeszcze większą nadzieję mam jednak na to, że przerobienie tych kawałków kodu pójdzie mi sprawnie i szybko… Pewnie to tylko nadzieja… Wszyscy wiemy jak to jest zmieniać coś w kodzie 😉

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s