C++ / openGL: Вращение ЧЕТВЕРКИ к точке с помощью кватернионов

Когда у меня есть ЧЕТВЕРКА в определенном положении, как я могу повернуть его таким способом который его нормальные точки к данной точке? Предположите, что цветные блоки являются просто прямоугольными четверками, затем это изображение показывает немного, что я имею в виду. Четверки все ориентированы таким путем, которым они указывают к центру сферы.

сопроводительный текст http://emrahgunduz.com/wp-content/uploads/2009/01/material_id_gui-600x364.jpg

Возможно, это второе изображение показывает немного больше, что я пытаюсь сделать: сопроводительный текст http://img689.imageshack.us/img689/3130/screenshot20100708at555.png

Я использую openGL / C++ (и Собственный lib). И у меня есть этот код для рисования простой четверки:

#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();
}

Обновите Дорогого читателя 17-07,

Просто добрался немного далее с вращением четверок. Я располагаю несколько четверок случайным образом, и затем я поворачиваю их к a look_at vector3f с помощью этого кода с помощью описаний от ответов ниже:

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();
}

Результат похож на это: alt text

Поскольку Вы видите, что я почти там, хотя вращение четверок является все еще немного "странным". Я Вы видите изображение ниже с цветными четверками Вы ясно, вижу различие попеременно. Как я могу повернуть четверку таким способом, которым я получаю тот же результат как цветная сфера ниже?

10
задан Nico Schlömer 12 November 2019 в 15:33
поделиться