Cuando tengo un QUAD en una posición determinada, ¿cómo puedo rotarlo de manera que su punto normal sea hacia un punto dado? Imagina que los bloques de colores son solo cuatriciclos rectangulares, entonces esta imagen muestra un poco lo que quiero decir. Los cuádriceps están orientados de tal manera que apuntan hacia el centro de la esfera.C++/openGL: Girando un QUAD hacia un punto usando quaternions
alt text http://emrahgunduz.com/wp-content/uploads/2009/01/material_id_gui-600x364.jpg
Tal vez esta segunda imagen muestra un poco más de lo que estoy tratando de hacer: alt text http://img689.imageshack.us/img689/3130/screenshot20100708at555.png
estoy usando OpenGL/C++ (y de la librería Eigen). Y tengo el código para dibujar un quad simple:
#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();
}
actualización 17-07 Estimado lector,
acaba de recibir un poco más con la rotación de los quads. Estoy posicionar un par de quads al azar y luego girarlas hacia un look_at
Vector3f utilizando este código usando las descripciones de las respuestas siguientes:
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();
}
El resultado es el siguiente: alt text http://img688.imageshack.us/img688/711/3drotatedquads.png
Como puedo ver que estoy casi allí, aunque la rotación de los cuádriceps sigue siendo un poco "extraña". Si ves la imagen a continuación con los cuadrantes de colores, puedes ver claramente la diferencia en la rotación. ¿Cómo puedo rotar el quad de tal manera que obtenga el mismo resultado que la esfera de color de abajo?
+1: Porque me encantan las imágenes en 3D :) – ereOn
Estos enlaces a las imágenes están todos rotos. –