Projeto Virtual Worlds

Computação Gráfica 3D em C

Arquivos Mensais: fevereiro 2014

Rotação em eixo arbitrário, SSE e Quaternions

Sem entrar em detalhes sobre a matemática dos quaternions (comece a ver aqui), eis a função de rotação de um vetor em torno de um eixo arbitrário (outro vetor), facilitada. Existe uma diferença com os códigos anteriores… agora uso SSE para lidar com os vetores. Os componentes do vetor são 4 floats: { x, y, z, w }:

__m128 vec4_rotateAroundAxis(__m128 v, __m128 axis, float angle)
{
  /* u = normalize(axis);
     vout = v*cos(angle) + (u x v)*sin(angle) + u*(u . v)*(1 - cos(angle)); */

  __m128 u;
  float c;

  c = cos(angle);
  u = vec4_normalize(axis);

  return _mm_add_ps(
    vec4_scale(v, c),
    _mm_add_ps(
      vec4_scale(vec4_cross(u, v), sin(angle)),
      vec4_scale(u, vec4_dot(u,v) * (1.0f * c))
    )
  );
}

As funções vec4_scale, vec4_cross, vec4_dot e vec4_normalize todas foram adaptadas das equivalentes vec3_*… Mas todas fazendo extensivo uso de SSE 4.1+. Em outro artigo coloco as funções aqui… Mas, você pode baixar o código com GIT:

$ git clone https://github.com/fredericopissarra/virtualworlds.git