Когда у меня есть КВАД в определенной позиции, как я могу повернуть его таким образом, чтобы его нормальные точки указывали на данную точку? Представьте, что цветные блоки - это просто прямоугольные квадраты, тогда это изображение немного показывает, что я имею в виду. Все квады ориентированы таким образом, что они указывают на центр сферы.
альтернативный текст 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
Как видите, я почти на месте, хотя вращение четырехугольников все еще немного "странно". Если вы видите изображение ниже с цветными квадратами, вы четко видите разницу во вращении. Как я могу повернуть квад таким образом, чтобы получить тот же результат, что и цветная сфера ниже?