Wektory w różnych przestrzeniach

2008-07-28 17:26

Kiedy zaczynamy uczyć się programowania, dowiadujemy się, że zmiennym przypisane są zawsze konkretne typy, których należy się trzymać. Trochę później, gdy zajmujemy się już shaderami i programowalnym potokiem graficznym, okazuje się, że większość wartości jest tam tego samego typu (wektor trzech lub czterech floatów). Różnią się one jednak przypisaną im semantyką, czyli znaczeniem w opisie wierzchołka lub piksela (POSITION, NORMAL, COLOR, i tak dalej).
Jednak sama semantyka nie jest jedyną cechą charakterystyczną danego wektora. Nawet mając do czynienia z dwoma wektorami “geometrycznymi” (czyli opisującymi pozycję lub normalną, a nie np. kolor), nie zawsze możemy wykonywać na nich łączne operacje. Należy bowiem zadbać o to, by wektory te znajdowały się w tej samej przestrzeni. W przeciwnym razie konieczne jest odpowiednie przekształcenie, co sprowadza się do pomnożenia przez jakąś macierz.

Aby łatwiej zorientować się, z którą przestrzenią mamy do czynienia, można stosować odpowiednie nazewnictwo, na przykład w postaci sufiksów. Przyrostki te mogą być przyporządkowane choćby następująco:

  • _o (np. vPos_o) niech odpowiada przestrzeni obiektu (object space), związanej z układem lokalnym konkretnej instancji modelu
  • _w (np. vPos_w) może oznaczać globalną przestrzeń świata (world space)
  • _v to z kolei przestrzeń widoku (view space), związana z pozycją obserwatora
  • _t możemy przyporządkować do tangent space przy obliczeniach związanych z oświetleniem
  • _l może w końcu być przyrostkiem wektorów w przestrzeni związanej z pozycją konkretnego światła

Oczywiście cały ten pomysł na kilometr śmierdzi sławetną notacją węgierską, jednak w tym przypadku “dekorowanie” nazw zmiennych ma znacznie głębszy sens. Błędów spowodowanych operacjami na wektorach z różnych przestrzeni nie wykryje nam bowiem żaden kompilator, a ich samodzielne wyśledzenie bywa bardzo trudne (podobnie jak większości innych błędów matematycznych). Dlatego należy zawsze zwracać baczną uwagę na to, z jaką przestrzenią aktualnie pracujemy, i stosować jeśli nie specjalne nazewnictwo, to chociaż szczegółowe i jednoznaczne komentarze.

Tags: ,
Author: Xion, posted under Programming »


4 comments for post “Wektory w różnych przestrzeniach”.
  1. Liosan:
    July 29th, 2008 o 9:23

    “Błędów spowodowanych operacjami na wektorach z różnych przestrzeni nie wykryje nam bowiem żaden kompilator…”

    Myślę, że mogę zaproponować pewne rozwiązanie (nasuwa mi się na myśl słowo “overkill”…). Można zaprząc do pracy mechanizm kontroli typów i template’y – włączyć do typu wektora składową mówiącą o przestrzeni, zablokować wszystkie rzutowania oprócz explicit, wszystkie operatory i funkcje deklarować szablonowo. Jest w boost przykład wykorzystania takiego mechanizmu do rozwiązania podobnego problemu: rozróżniania jednostek fizycznych (kg, m/s etc).

    Jak już mówiłem… overkill :)

  2. Charibo:
    July 29th, 2008 o 11:36

    A to wszystko w (bądź co bądź dość ogranicznym) Cg/HLSL/GLSL? :)

  3. Xion:
    July 29th, 2008 o 12:11

    Liosan: Tak, myślałem o czymś podobnym, chociaż w twoim rozwiązaniu nawet nie trzeba dodatkowej składowej (wystarczy zrobić enum z możliwymi przestrzeniami i szablon, który ten enum przyjmuje jako parametr. Jak jednak słusznie zauważyłeś, to całe mnóstwo roboty. I jak słusznie zauważył Charibo, nieszczególnie ta się to zrobić w Cg/itd. ;]

  4. Reg:
    August 3rd, 2008 o 15:27

    Z tymi przyrostkami to świetny pomysł!

Comments are disabled.
 


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