2011-01-10 4 views
1

Ich zeichne eine Kugel mit OpenGL, die durch glRotate(), glScale(), glTranslate() transformiert wird. Wie kann ich die absolute Position des Objekts ermitteln, ohne alle Transformationen selbst zu berechnen?Kameraposition in OpenGL transformieren

Ich brauche die Koordinaten, um die Augenposition der Kamera auf diesen Punkt zu setzen.

Antwort

2

Wenn diese Transformationen verwenden, können Sie die modelviewmatrix manipulieren

An erhalten die aktuelle Sie (http://linux.die.net/man/3/glgetfloatv)

void glGetFloatv(
GLenum pname, 
GLfloat * params 
); 

beispielsweise verwendet werden:

float modelview[16]; 

// save the current modelview matrix 
glPushMatrix(); 

// get the current modelview matrix 
glGetFloatv(GL_MODELVIEW_MATRIX , modelview); 

sollten Sie die aktuelle Matrix erhalten, Multiplizieren der Ausgangsvektoren/Vertices/Koordinaten mit dieser Matrix wird Ihnen die absolute Weltkoordinaten.

EDIT: Wenn Sie eine Anwendung, dass Sie in der Regel die Kontrolle über die absoluten Koordinaten jedes Objekts wollen, manipulieren sie, und die opengl Transformationen, um sie zu ziehen, wo sie definiert sind.

1

Objekte modelliert werden oft in einem Koordinatensystem, dann skaliert, übersetzt und gedreht in die Welt, die Sie zu bauen. Weltkoordinaten resultieren aus der Transformation von Objektkoordinaten durch die in der ModelView-Matrix gespeicherten Modelltransformationen. OpenGL hat jedoch kein Konzept von Weltkoordinaten. Weltkoordinaten sind ein reines Anwendungskonstrukt.

Objektkoordinaten werden von der ModelView-Matrix transformiert, um Augenkoordinaten zu erzeugen.

Von opengl.org: 9.120 Wie finde ich die Koordinaten eines Eckpunkts, der nur von der ModelView-Matrix transformiert wird?

Es ist oft nützlich, den Augenkoordinatenraumwert eines Scheitelpunkts zu erhalten (d. H. Den Objektraumscheitelpunkt, der durch die ModelView-Matrix transformiert wurde). Sie können dies erhalten, indem Sie die aktuelle ModelView-Matrix abrufen und eine einfache Vektor-/Matrixmultiplikation durchführen.

Um die Matrix Verwendung so etwas wie dieses

float fvViewMatrix[ 16 ];

glGetFloatv(GL_MODELVIEW_MATRIX, fvViewMatrix);

Sie lesen können mehr über opengl Transformationen hier: http://www.opengl.org/resources/faq/technical/transformations.htm