Pergunta

Eu tenho um objeto projétil que está se movendo ao longo de um vetor de velocidade. Preciso para assegurar que o objecto está sempre virado para a direcção do vector de velocidade. Além disso, estou representando rotação do objeto usando quaternions, não matrizes.

Eu sei que o primeiro passo é encontrar uma base ortogonal:

forward = direction of velocity vector
up = vector.new(0, 1, 0)
right = cross(up, forward) 
up = cross(forward, right)

Como eu poderia converter a base em um quaternion rotação?

Solução

Note, eu gostaria de dar crédito a Noel Hughes para fornecer a resposta, mas quero esclarecer com as minhas próprias experiências. Pseudocódigo seguinte:

   vec3 vel = direction of velocity vector
   vec3 forward = (1, 0, 0)  // Depends on direction your model faces. See below.
   vec3 axis = cross(forward, vel)
   if (axis == 0) then quit // Already facing the right direction!
   axis = normalize(axis)
   float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
   quat result = (0, axis.y * sin(theta/2), axis.z * sin(theta/2), cos(theta/2)

O último elemento do quaternion é a parte escalar, os primeiros três elementos são as partes imaginárias. Além disso, o pseudocódigo acima assume que o seu objeto em pontos "espaço do modelo" para baixo o eixo x positivo. No meu caso, o objeto realmente apontou para o eixo y positivo, caso em que eu fiz as seguintes alterações:

   vec3 vel = direction of velocity vector
   vec3 forward = (0, 1, 0)  // Note that y-component is now 1
   vec3 axis = cross(forward, vel)
   if (axis == 0) then quit 
   axis = normalize(axis)
   float theta = acos(vel.x/sqrt(vel.x^2, vel.y^2, vel.z^2))
   quat result = (axis.x * sin(theta/2), 0, axis.z * sin(theta/2), cos(theta/2)
   // Note that SECOND component above is now 0
Foi útil?

Solução

Eu suponho que você não se preocupam com a orientação do seu projétil, além de ter o eixo longitudinal alinhado com o vetor de velocidade, e que o eixo longitudinal é o eixo x de (1, 0, 0).

Você está no caminho certo. Normalizar o vector de velocidade, (vx, vy, vz) / sqrt (vx ^ 2 + vy ^ 2 + VZ ^ 2) atravessar o eixo x com ele e normalizar o resultado - (0, yn, zn) - esta é a rotação eixo para o quatérnion. O ângulo de rotação é simplesmente teta = cosseno inversa de vx / sqrt (vx + vy ^ 2 ^ 2 + VZ ^ 2). O quaternion resultante é então

(0, yn, zn) SN (teta / 2) COS (teta / 2)

Deixe-me saber se você tiver quaisquer perguntas.

Noel Hughes nhughes1ster@gmail.com

Outras dicas

Eu tenho um olhar para o biblioteca vecmath (Java). Tem sido em torno de um longo período de tempo e nós usá-lo em nossa comunidade. É baseado em 4-tuplas e eu ficaria desapontado se não houvesse métodos simples para a transformação.

Eu também testes de unidade de gravação para os resultados esperados. É muito fácil para positivo confusão e negativo, quadros, e movinig / referência esquerdo e destro. Comece com os mais simples (por exemplo, XYZ) para se certificar de que você tem a resposta certa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top