Układy odniesienia

2007-10-02 19:06

Programując grafikę czy choćby cokolwiek, co ma się ostatecznie pokazać na ekranie, cały czas operuje się współrzędnymi w przestrzeni. Wówczas trzeba zawsze pamiętać, że ten zestaw liczb – zwykle X, Y i ewentualnie Z – nie istnieje sam dla siebie i zawsze jest podawany względem czegoś. Tak więc wszystkie współrzędne są względne, bo nawet nazywane “bezwzględnymi” różnią się tylko tym, że ich punkt odniesienia jest wyjątkowo dobrze zdefiniowany – na przykład jako lewy górny róg ekranu lub punkt (0,0,0) nieprzetransformowanego układu sceny 3D.

Kłopoty zaczynają się wtedy, gdy zaczynamy nieświadomie mieszać koordynaty korzystające z innych układów odniesienia. Nadal czasami mi się to zdarza w kodzie systemu GUI, mimo że starałem się bardzo dokładnie określić względem czego jest określona np. pozycja danej kontrolki i jakie przekształcenia (głównie odpowiednia translacja) są wykorzystywane przy rysowaniu każdego elementu.
To wszystko jest oczywiście w dwóch wymiarach. W 3D potencjalnych punktów odniesienia jest nawet więcej; wśród nich mamy chociażby ten związany z kamerą, z modelem, ze światłem, i tak dalej. A co gorsza, ocena czy taki lub inny błąd wynika właśnie z pomylenia różnych układów współrzędnych jest trudniejsza właśnie ze względu na obecność tego trzeciego wymiaru.

Wniosek stąd taki, że należy pamiętać o używanym aktualnie układzie odniesienia. Łatwo bowiem napisać:

  1. void Foo(float x, float y, float z);

i za jakiś (niedługi) czas zastanawiać się, względem czego te x, y czy z powinno tak naprawdę być liczone. A podejrzewam, że u większości programistów umiejętność rozwiązywania tego typu łamigłówek jest dość… względna :)

Be Sociable, Share!
Be Sociable, Share!
Tags:
Author: Xion, posted under Programming »


One comment for post “Układy odniesienia”.
  1. Reg:
    October 7th, 2007 o 12:46

    po pierwsze, zamiast przekazywać (float x, float y, float z) radzę przekazywać (const D3DXVECTOR3 &Pos) – tak będzie dużo wygodniej.

    Po drugie, to jest tak jak z jednostkami – sekundy, metry, kilogramy. To jedna z tych rzeczy których język za nas nie sprawdza, ale samemu dbając o poprawność (w czym pomóc mogą np. komentarze opisujące zmienne) można sobie zapewnić poprawność obliczeń, żeby przypadowo nie dodać do siebie sekund i milisekund albo sekund i metrów. Podobnie warto rozróżniać co jest punktem a co wektorem, mimo że dla kompilatora to będzie ten sam typ D3DXVECTOR3. Tak samo z układami współrzędnych – warto sobie zawsze jasno powiedzieć, napisać albo chciaż pomyśleć, w jakim układzie jest wyrażona dana zmienna lub w jakim aktualnie liczymy.

Comments are disabled.
 


© 2021 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.