matriz de rotação para o vector direccional
Pergunta
Eu tenho jogado com alguns algoritmos na internet por um tempo e eu não consigo levá-los para o trabalho, por isso estou jogando a questão aqui;
Eu estou tentando tornar uma linha vetor velocidade de um ponto. Desenhando a linha não é difícil, basta inserir uma linha com velocity.length
comprimento no gráfico. Isto coloca a linha centrada no ponto na direcção do eixo y. Precisamos levar isso agora na rotação adequada e tradução.
O vector de translação não é difícil de calcular: é metade do vetor velocidade. A matriz de rotação, no entanto, está sendo extremamente indescritível para mim. Dado um vetor <x, y, z>
direcional, o que é a necessidade da matriz I?
Editar 1: olhar; se você não entender a pergunta, você provavelmente não será capaz de me dar uma resposta.
Aqui está o que eu tenho atualmente:
Vector3f translation = new Vector3f(); translation.scale(1f/2f, body.velocity); Vector3f vec_z = (Vector3f) body.velocity.clone(); vec_z.normalize(); Vector3f vec_y; // reference vector, will correct later if (vec_z.x == 0 && vec_z.z == 0) { vec_y = new Vector3f(-vec_z.y, 0f, 0f); // could be optimized } else { vec_y = new Vector3f(0f, 1f, 0f); } Vector3f vec_x = new Vector3f(); vec_x.cross(vec_y, vec_z); vec_z.normalize(); vec_y.cross(vec_x, vec_z); vec_y.normalize(); vec_y.negate(); Matrix3f rotation = new Matrix3f( vec_z.z, vec_z.x, vec_z.y, vec_x.z, vec_x.x, vec_x.y, vec_y.z, vec_y.x, vec_y.y ); arrowTransform3D.set(rotation, translation, 1f);
este artigo . E sim, eu tentei a matriz de rotação standard (vec_x.x, vec_y.x, etc) e não funcionou. Eu estive girando as colunas e linhas para ver se há qualquer efeito.
Editar 2:
Desculpas sobre a redação rudes dos meus comentários.
Portanto, parece que houve uma combinação de dois erros; um dos quais House MD apontou (muito ruim de nomes de variáveis: vec_z
era realmente vec_y
, e assim por diante), eo outro era o que eu precisava para inverter a matriz antes de passá-lo para o motor de renderização (transposição foi por pouco!). Assim, o código modificado é:
Vector3f vec_y = (Vector3f) body.velocity.clone(); vec_y.normalize(); Vector3f vec_x; // reference vector, will correct later if (vec_y.x == 0 && vec_y.z == 0) { vec_x = new Vector3f(-vec_y.y, 0f, 0f); // could be optimized } else { vec_x = new Vector3f(0f, 1f, 0f); } Vector3f vec_z = new Vector3f(); vec_z.cross(vec_x, vec_y); vec_z.normalize(); vec_x.cross(vec_z, vec_y); vec_x.normalize(); vec_x.negate(); Matrix3f rotation = new Matrix3f( vec_x.x, vec_x.y, vec_x.z, vec_y.x, vec_y.y, vec_y.z, vec_z.x, vec_z.y, vec_z.z ); rotation.invert();
Solução
A questão não envolve a obtenção de uma rotação a um determinado eixo, enquanto que eu estou preocupado com a obtenção de uma matriz de rotação.
Gee, eu me pergunto se você pudesse transformar convertido um para o outro ?
BTW, sua solução atual de escolher um eixo y arbitrária e, em seguida, reorthogonalising deve funcionar bem; Parece escutas embora, ou pelo menos mal escrito. 'z_vec
' não é um bom variável de nome para o eixo y. O que é com a ordenação 'z, x, y', afinal?
Se ainda assim não funcionar, tente fazer mudanças aleatórias até ele -. Transpor a matriz, vetores negar até que você tenha um número par de erros de sinal, esse tipo de coisa
Também o seu tom de voz surge como espécie de rude, dado que você está pedindo estranhos de passar seu tempo ajudando-o.
Outras dicas
Este deve fazer você