Estou tentando escrever alguns testes de unidade e percebo que não sei como comparar quaterniões. Preciso saber se dois quaternions representam a mesma orientação (o objeto estaria voltado para o mesmo caminho). Com uma posição de vetor, eu simplesmente compararia as partes e verificaria se elas estão próximas o suficiente, mas para quaternions os valores podem ser muito diferentes.
Como posso comparar dois quaternions?
mathematics
edA-qa mort-ora-y
fonte
fonte
q
e-q
). A maneira ingênua (computacionalmente-wise) seria a de aplicar os dois quaternions para o mesmo vector e ver se os resultados do vetor são diferentes ..Respostas:
Se seus dois quaternions são
q1
eq2
, eles representam a mesma rotação se uma dessas duas condições for válida:q1
é componente sábio aproximadamente igual aq2
ORq1
é componente sábio aproximadamente igual a-q2
Sabendo disso, você pode escrever um testador de igualdade bastante simplista que atenda ao seu objetivo.
fonte
q
e-q
representam a mesma orientação (que estava sendo solicitada), mas não a mesma rotação. Isso é crucial ao interpolar.q
e-q
quando representado como um operador de rotação de eixo de ângulo. Portanto, tecnicamente, o efeito dessas rotações é o mesmo, embora os operadores não sejam. E, sim, quando SLERPING, é preciso ter certezaq1
eq2
estar no mesmo hemisfério da hiperesfera S3 para que o slerp siga o caminho mais curto.2pi-angle
, portanto, está girando o caminho longo em torno dos eixos negados. Às vezes é isso que você deseja; é apenas algo para estar ciente,q1 dot q2 > 0
resulta no turno curto,q1 dot q2 < 0
leva no turno longo.Só porque não foi mencionado. Como os quaternions usados para orientação espacial têm sempre o comprimento da unidade (ou deveriam ser), o seguinte também funcionará.
onde o EPS é um fator de correção para permitir pequenos erros devido à precisão limitada do ponto flutuante. Se (e somente se) os dois quaternions representam a mesma orientação
q1 = +- q2
, então e assimq1.dot(q2) = +- 1
. Se você deseja garantir que eles tenham a mesma rotação (em vez de apenas orientação), remova oabs
.fonte
Os quaternions são armazenados como 4 carros alegóricos ou duplos, geralmente chamados x, y, z e w, onde os três primeiros representam um eixo ew o grau de rotação em torno desse eixo.
Uma abordagem ingênua seria apenas comparar esses números de dois quaternions pela igualdade. No entanto, como os cálculos de ponto flutuante envolvem um erro, você deve pelo menos usar um erro, geralmente chamado eps (para epsilon) e comparar cada componente como
Um teste melhor seria calcular o produto escalar dos dois quaternions e testar se está próximo de 1,0. Você deve procurar a equação de quaternions com sin e cos e apenas pontuar dois quaternions, depois deve ver rapidamente por que isso funciona.
fonte
Com base em todas as sugestões para usar Dot e eps, descobri que usando (em unidade):
funcionou bem sem eu ter que tomar uma decisão pelo tamanho de eps.
fonte