C ++ / openGL: вращение квадрата к точке с использованием кватернионов - PullRequest
9 голосов
/ 08 июля 2010

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

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

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

Я использую openGL / C ++ (и Eigen 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 Уважаемый читатель,

Просто немного продвинулся с вращением четырехугольников. Я размещаю пару квадов случайным образом, а затем поворачиваю их к 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();
}

Результат выглядит так: альтернативный текст http://img688.imageshack.us/img688/711/3drotatedquads.png

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

Ответы [ 3 ]

2 голосов
/ 08 июля 2010

Возможно, вы уже нашли это - http://gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation - но я нашел это полезным, когда в последний раз изучал эту тему.

1 голос
/ 08 июля 2010

Ось вращения = нормализация (перекрестный продукт (currentNormal, требуемыйNormal))

Угол вращения = acos (dotproduct (normalize (currentNormal), нормализация (требуемыйNormal)).

Вы можете построить любой поворотматрица или кватернион от оси и угла. Точную формулу можно найти в любом ресурсе о кватернионах.

Вам может потребоваться перевернуть угол или ось в зависимости от того, поворачиваете ли вы нормально вокруг его «основания или вокруг» его кончика.

Также ЭТОГО ресурса, похоже, достаточно для информации о кватернионах, вращениях и трехмерном пространстве в целом.

0 голосов
/ 08 июля 2010

Если «в определенной позиции» означает, что вы знаете текущую норму, то вот что:

  1. Точечное произведение старой и новой нормалей - косинус угла между ними.
  2. Их поперечное произведение представляет собой ось, вокруг которой вы должны выполнить желаемое вращение
  3. Построение кватерниона вращения от заданной оси и угла хорошо документировано и является основной особенностью.
  4. Вращение самого квада довольно сложно и зависит от того, как именно вы хотите, чтобы он вращался.
...