Eu tenho uma matriz de transformação 4x4 M e quero descobrir a forma de uma esfera quando transformada por M. (A esfera está na origem e tem o raio 1.)
Eu sei que posso encontrar o centro apenas multiplicando M por (0,0,0,1).
No entanto, o raio se torna um problema, pois M pode esmagar e girar a esfera. Como posso descobrir o (s) novo (s) raio (s) do elipsóide resultante? Existe alguma maneira de descobrir a orientação?
Mais especificamente, preciso saber o tamanho da esfera delimitadora que envolveria a esfera transformada. Em outras palavras, qual é o máximo de | M * V - M * (0,0,0,1) |, onde V é um vetor unitário (um ponto na esfera original).
mathematics
matrix
transformation
linear-algebra
CaptainCodeman
fonte
fonte
Respostas:
Matematicamente, a quantidade que você está perguntando é chamada de norma do operador . Infelizmente, não existe uma fórmula simples para isso. Se for uma transformação afim totalmente geral - por exemplo, se puder ter uma combinação arbitrária de rotações e escalas não uniformes, em qualquer ordem -, receio que não haja nada a não ser usar a decomposição de valores singular . Se você aplicar SVD à sua matriz, o maior valor singular será o raio máximo do elipsóide resultante. Os outros valores singulares também serão seus outros dois raios, e o procedimento SVD também pode extrair a orientação dos eixos para você.
A implementação de SVD não é para os fracos de coração, pois envolve a busca de valores próprios. Se tudo o que você deseja são os próprios valores singulares, elas são as raízes quadradas dos valores próprios de M ^ T * M. Portanto, se você tem um solucionador de valores próprios 3x3 à mão ou não se importa em escrever um, pode usá-lo. Se você deseja extrair também as orientações dos eixos, fica mais envolvido, pois você também precisa encontrar vetores próprios. Nesse artigo da Wikipedia, há uma lista de links para bibliotecas para fazer SVD, um dos quais você pode usar em seu projeto.
Se a forma da sua matriz for restrita de forma que a escala não uniforme aconteça no máximo uma vez e seja a primeira transformação aplicada, ou seja, seja a mais correta quando você estiver usando vetores de coluna, poderá simplificá-lo para apenas observar os comprimentos dos vetores de eixos transformados. Somente nesse caso - ou seja, uma única escala não uniforme seguida de qualquer sequência de rotações, reflexões e escalas uniformes - observar apenas os vetores dos eixos fornecerá a resposta certa.
fonte
Talvez extraia fatores de escala da matriz e use o valor máximo de seus componentes. Usando a matriz SRT (Scale-Rotation-Translation), você pode fazer o seguinte:
(baseado em http://wklej.org/id/950061/ - o nome é decomposeTRS e não decomposeSRT porque eu uso nomes na ordem em que as matrizes são multiplicadas no OpenGL).
Agora você pode multiplicar o raio da esfera original por scaleFactor e terá sua esfera delimitadora.
fonte