C ++ / openGL: Girando um QUAD em direção a um ponto usando quaternions

9

Quando eu tenho um QUAD em uma determinada posição, como posso rotacioná-lo de tal forma que seus pontos normais apontem para um determinado ponto? Imagine que os blocos coloridos são apenas quadras retangulares, então essa imagem mostra um pouco o que quero dizer. Os quadris são todos orientados de tal maneira que apontam para o centro da esfera.

texto alternativo http://emrahgunduz.com/wp-content/uploads/2009 /01/material_id_gui-600x364.jpg

Talvez essa segunda imagem mostre um pouco mais o que estou tentando fazer: texto alternativo http://img689.imageshack.us/img689/3130/screenshot20100708at555.png

Estou usando o openGL / C ++ (e a lib Eigen). E eu tenho esse código para desenhar um quad simples:

#include "ofMain.h"
#include "Quad.h"
Quad::Quad(Vector3f oPosition):position(oPosition) {
}

void Quad::update() {
}

void Quad::draw() {
    float size = 1.3;
    glColor3f(1.0f, 0.0f, 0.6f);
    glPushMatrix();
        glTranslatef(position.x(), position.y(), position.z());
        glScalef(size, size,size);
        glBegin(GL_QUADS);
            glVertex3f(0,0,0);
            glVertex3f(1,0,0);
            glVertex3f(1,1,0);
            glVertex3f(0,1,0);
        glEnd();
    glPopMatrix();
}

Atualização 17-07 Caro leitor,

Apenas fiquei um pouco mais longe com a rotação dos quadriciclos. Estou posicionando um par de quads aleatoriamente e depois os rotaciono em direção a look_at vector3f usando esse código usando as descrições das respostas abaixo:

void Quad::draw() {
    float size = 0.5;
    glColor3f(1.0f, 0.0f, 0.6f);
    glPushMatrix();
        Vector3f center = look_at - position;
        Vector3f center_norm = center.normalized();
        float r_angle   = acos(center_norm.dot(normal));
        Vector3f axis = normal.normalized().cross(center_norm);

        glPointSize(8);
        glLineWidth(4.0f);

        // draw the center point
        glColor3f(1.0f, 0.0f, 0.0f);
        glBegin(GL_POINTS); 
            glVertex3fv(look_at.data());
        glEnd();

        // draw the quad
        glColor4f(0.0f, 0.0f, 0.0f, 0.85f); 
        glTranslatef(position.x(), position.y(), position.z());
        glRotatef(r_angle * RAD_TO_DEG, axis.x(), axis.y(), axis.z());
        glScalef(size, size,size);
        glBegin(GL_QUADS);
            glVertex3f(-0.5,-0.5,0);
            glVertex3f(0.5,-0.5,0);
            glVertex3f(0.5,0.5,0);
            glVertex3f(-0.5,0.5,0);
        glEnd();

    glPopMatrix();
}

O resultado é assim: texto alternativo http://img688.imageshack.us/img688/711/3drotatedquads.png

Como você pode ver, eu estou quase lá, embora a rotação dos quadriciclos ainda seja um pouco "estranha". Eu vejo a imagem abaixo com os quadris coloridos você vê claramente a diferença na rotação. Como posso girar o quad de tal forma que recebo o mesmo resultado que a esfera colorida abaixo?

    
por pollux 08.07.2010 в 15:21
fonte

3 respostas

1

Eixo de rotação = normalizar (crossproduct (currentNormal, desiredNormal))

Ângulo de rotação = acos (dotproduct (normalizar (currentNormal), normalizar (desejadoNormal)).

Você pode criar matriz de rotação ou quaternion a partir do eixo e do ângulo. A fórmula exata pode ser encontrada em qualquer recurso sobre quaterniões.

Você pode precisar inverter o ângulo ou o eixo, dependendo de girar normalmente em torno de sua base ou ao redor de sua ponta.

Além disso, ESTE recurso parece ter informações suficientes sobre quaternions, rotações e espaço 3D em geral.

    
por SigTerm 08.07.2010 / 18:06
fonte
2

Você pode já ter encontrado este link - - mas achei útil quando procurei pela última vez este tópico.

    
por Michael Repucci 08.07.2010 / 15:54
fonte
0

Se "em uma determinada posição" significa que você sabe sua normal atual, então aqui está a coisa:

  1. O produto pontual de um normal antigo e novo é um cosseno de um ângulo entre eles.
  2. O produto cruzado é um eixo em torno do qual você deve executar a rotação desejada
  3. A construção de rotação de quatérnio a partir de um determinado eixo e ângulo é bem documentada e é uma característica básica.
  4. Girar a própria quadra é complicado e depende de como exatamente você deseja que ela seja girada.
por Dark 08.07.2010 / 18:11
fonte