Pergunta

Dado um ponto, tal como (0, 0, 0) e um vector semelhante (x, y, z). O que é a forma mais fácil para alinhar o negativo do eixo Z centrado em (0, 0, 0) de modo a apontar na direcção deste vector? Exemplos usando OpenGL seria bem-vinda, mas não necessário.

Foi útil?

Solução

Há muitas maneiras diferentes para girar uma coordenada-frame para o ponto em uma determinada direção; todos eles vão deixar o eixo Z apontou na direção que você quer, mas com variações na forma como o xey eixos são orientados.

A seguir você recebe a rotação mais curto, que pode ou não pode ser o que quiser.

vec3 target_dir = normalise( vector );
float rot_angle = acos( dot_product(target_dir,z_axis) );
if( fabs(rot_angle) > a_very_small_number )
{
    vec3 rot_axis = normalise( cross_product(target_dir,z_axis) );
    glRotatef( rot_angle, rot_axis.x, rot_axis.y, rot_axis.z );
}

Outras dicas

Você provavelmente vai querer ter um olhar para artigo de Diana Gruber

Para responder a minha própria pergunta, a melhor resposta que eu vim acima com é o seguinte:

Dividir o vector acima em "componentes". O componente X é o deslocamento ao longo do eixo x. Se nos voltarmos para trigonometria, temos que cos (alfa) = x / vector_magnitude. Se calculamos a RHS, em seguida, podemos derivar alfa, que é o valor pelo qual teríamos de rotação em torno do eixo y.

Em seguida, o sistema de coordenadas pode ser alinhado com o vector por uma série de chamadas a glRotatef ()

Há muitos recursos lá fora sobre girando suas coordenadas (ou girar objetos, o que equivale à mesma coisa). Eu aprendi muito com neste site , tanto sobre como programa no várias dimensões e especialmente como manipular vectores

A página aqui tem uma seção "Transformações para mover um vector ao eixo Z" que parece ser o que você quer, ou talvez o inverso disso.

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