Mam macierz transformacji 4x4 M i chcę znaleźć kształt kuli po transformacji przez M. (Kula jest na początku i ma promień 1).
Wiem, że mogę znaleźć środek, po prostu mnożąc M przez (0,0,0,1).
Jednak promień staje się problemem, ponieważ M może zgnieść i obrócić kulę. Jak mogę znaleźć nowy promień (-y) powstałej elipsoidy? Czy jest jakiś sposób, aby ustalić orientację?
Mówiąc dokładniej, muszę znać rozmiar kuli ograniczającej, która otaczałaby kulę transformowaną. Innymi słowy, jaka jest maksymalna wartość | M * V - M * (0,0,0,1) |, gdzie V jest wektorem jednostkowym (punkt na oryginalnej kuli).
mathematics
matrix
transformation
linear-algebra
CaptainCodeman
źródło
źródło
Odpowiedzi:
Matematycznie ilość, o którą pytasz, nazywa się normą operatora . Niestety nie ma na to prostej formuły. Jeśli jest to w pełni ogólna transformacja afiniczna - na przykład, jeśli mogłaby mieć dowolną kombinację rotacji i niejednorodnych skal, w dowolnej kolejności - obawiam się, że nie ma nic innego, jak tylko zastosować rozkład pojedynczej wartości . Jeśli zastosujesz SVD do swojej matrycy, największą wartością pojedynczą będzie maksymalny promień powstałej elipsoidy. Innymi wartościami osobliwymi będą również pozostałe dwa promienie, a procedura SVD może również wyodrębnić dla Ciebie orientację osi.
Wdrożenie SVD nie jest przeznaczone dla osób o słabym sercu, ponieważ polega na znalezieniu wartości własnych. Jeśli wszystko, czego chcesz, to same wartości osobliwe, są one pierwiastkami kwadratowymi wartości własnych M ^ T * M. Więc jeśli masz pod ręką solver wartości własnej 3x3 lub nie masz nic przeciwko napisaniu jednej, możesz tego użyć. Jeśli chcesz również wyodrębnić orientacje osi, to angażuje się bardziej, ponieważ musisz również znaleźć wektory własne. W tym artykule w Wikipedii znajduje się lista linków do bibliotek do wykonywania SVD, z których jeden możesz wykorzystać w swoim projekcie.
Jeśli forma macierzy jest ograniczona w taki sposób, że nierównomierna skala zachodzi co najwyżej raz i jest stosowana pierwsza transformacja, tj. Jest najdalsza po prawej, gdy używasz wektorów kolumnowych, możesz to uprościć, aby spojrzeć na długości transformowane wektory osi. Tylko w takim przypadku - tj. Pojedyncza niejednolita skala, po której następuje dowolna sekwencja obrotów, odbić i jednolite skale - patrząc tylko na wektory osi da właściwą odpowiedź.
źródło
Może wyodrębnij współczynniki skali z macierzy, a następnie użyj maksymalnej wartości jej składników. Za pomocą macierzy SRT (Scale-Rotation-Translation) możesz to zrobić w następujący sposób:
(na podstawie http://wklej.org/id/950061/ - nazwa to decomposeTRS, a nie decomposeSRT, ponieważ używam nazw zapisywanych w kolejności, które macierze są mnożone w OpenGL).
Teraz możesz pomnożyć oryginalny promień kuli przez scaleFactor i masz swoją kulę ograniczającą.
źródło