Przekształcenie wektora przez macierz

Uwaga! Informacje na tej stronie mają ponad 5 lat. Nadal je udostępniam, ale prawdopodobnie nie odzwierciedlają one mojej aktualnej wiedzy ani przekonań.

Thu
20
Mar 2008

Transformację w 3D opisuje macierz 4x4. Pełne przekształcenie punktu (x,y,z) przez taką macierz polega na pomnożeniu (x,y,z,1) przez tą macierz, a potem podzieleniu trzech pierwszych składowych przez składową czwartą w. Używamy tu tzw. współrzędnych jednorodnych (ang. Homogeneous Coordinates). W D3DX dokonuje tego funkcja D3DXVec3TransformCoord.

Przekształcenie wektora wskazującego kierunek (w przeciwieństwie do punktu opisującego położenie) musi nie brać pod uwagę translacji, czyli czwartego wiersza macierzy. Dlatego przekształcenie wektora polega zwykle na pomnożeniu (x,y,z) przez podmacierz 3x3 tej macierzy. W D3DX dokonuje tego funkcja D3DXVec3TransformNormal.

Jeśli ten wektor jest wektorem normalnym wierzchołka siatki, teoretycznie należy go przekształcić przez odwrotność transpozycji (lub transpozycję odwrotności - to bez różnicy) tej macierzy, której używamy do przekształcania pozycji wierzchołków. W praktyce jednak, jeśli podmacierz 3x3 tej macierzy zawiera tylko rotację (i ewentualnie skalowanie proporcjonalne), a nie zawiera skalowania nieproporcjonalnego ani ścinania, wektory bazowe w tej macierzy są ortogonalne, więc jej odwrotność jest równa jej transpozycji i te przekształcenia się znoszą. Dlatego wystarczy przekształcić wektor wprost przez daną macierz, bez odwracania i transponowania (a wynik ewentualnie znormalizować, jeśli było skalowanie).

W swojej bibliotece matematycznej mam jeszcze jedną funkcję, nazwaną po prostu Transform. Przekształca ona punkt (x,y,z,1) przez podmacierz 4x3 podanej macierzy, nie wyliczając współczynnika w i nie dzieląc przez niego. To znacznie przyspiesza obliczenia względem funkcji TransformCoord i wystarcza wszędzie tam, gdzie macierz nie zawiera przekształcenia perspektywicznego, bo jej czwarta kolumna jest wtedy zawsze równa (0,0,0,1).

Za wszelkie uproszczenia przepraszam. Możnaby o tym dużo pisać. Chciałem tu tylko pokazać, że teoretyczne "pomnożyć wektor przez macierz" przybiera w praktyce różne formy i trzeba umieć prawidłowo je stosować.

Comments | #math #directx Share

Comments

[Download] [Dropbox] [pub] [Mirror] [Privacy policy]
Copyright © 2004-2019