Ich arbeite an einer OpenGL ES1-Anwendung, die ein 2D-Gitter anzeigt und ermöglicht es Benutzern, zu navigieren und skalieren/drehen. Ich muss die genaue Übersetzung von Ansicht-Touch-Koordinaten in meine OpenGL-Welt und Gitterzelle wissen. Gibt es irgendwelche Helfer, um die letzten Transformationen, die ich für die Navigation mache, umzukehren? oder ich sollte das Matrixmaterial von Hand berechnen und machen?iPhone OpenGL ES - Wie man wählt
Antwort
Der Auswahlmodus ist in openGL ES nicht verfügbar. Aber es ist einfach, die Bildschirmkoordinate eines beliebigen 3D-Punktes zu berechnen, indem die aus dem aktuellen openGL-Zustand abgerufene Projektionsmatrix verwendet wird. Hier ist, wie ich es tun (IMPoint2D und IMPoint3D basisch sind (x, y) und (x, y, z) Strukturen)
+ (IMPoint2D) getScreenCoorOfPoint:(IMPoint3D)_point3D
{
GLfloat p[16]; // Where The 16 Doubles Of The Projection Matrix Are To Be Stored
glGetFloatv(GL_PROJECTION_MATRIX, p); // Retrieve The Projection Matrix
/*
Multiply M * point
*/
GLfloat _p[] = {p[0]*_point3D.x +p[4]*_point3D.y +p[8]*_point3D.z + p[12],
p[1]*_point3D.x +p[5]*_point3D.y +p[9]*_point3D.z + p[13],
p[2]*_point3D.x +p[6]*_point3D.y +p[10]*_point3D.z+ p[14],
p[3]*_point3D.x +p[7]*_point3D.y +p[11]*_point3D.z+ p[15]};
/*
divide by scale factor
*/
IMPoint2D _p2D = {_p[0]/_p[3], _p[1]/_p[3]};
/*
get result in screen coordinates. In this case I'm in landscape mode
*/
return (IMPoint2D) {_p2D.x*240.0f + 240.0f, (1.0f - _p2D.y) *160.0f};
}
Klingt wie, was Sie suchen für eine unproject Methode. Die Glutbibliothek kommt mit einem, aber es ist nicht auf OpenGL ES verfügbar. Es ist möglich, rewrite the glut code yourself to be iphone compatible Sie könnten auch Ihren eigenen Code schreiben, um zu unproject, was erfordern würde, den Touchpoint zu Ihrem Ansichtsfenster zu skalieren, multiplizieren Sie es mit der Umkehrung Ihrer Projektion * Modelview Matrizen, und dividieren durch w, um einen 3D-Vektor zu erhalten.
Könnte dies mit GL_MODELVIEW_MATRIX möglich sein? oder GL_MODLVIEW, ich ändere nicht die Ansichtsposition, nur Modellansicht. ich mache dies:
glMatrixMode(GL_MODELVIEW);
// Setup model view matrix
glLoadIdentity();
[gAccel GetAccelerometerMatrix:(GLfloat *) matrix headingX:headx headingY: heady headingZ:headz];
// Finally load matrix
glLoadMatrixf((GLfloat*)matrix);
glPushMatrix();
glRotatef(-90, 1, 0, 0);
glScalef(0.0005, 0.0005, 0.0005);
glTranslatef(x, 0.0, z);
dank
ich die Funktion hinzugefügt - (CGPoint) getScreenCoorOfPoint: (IMPoint3D) _point3D, die mir meine Artikel Position in der Welt zu geben scheint, aber das Bit Ich bin jetzt stecken on ist: * I-Objekte haben, die eine Position haben * ich meine Position in der Welt (gluLookAt Auge [0], Auge [1], Auge [2]) haben * und dann habe ich hab da wo ich auf die s geklopft habe creen Wie schließe ich all dies zusammen, es ist das letzte, was ich auf dem Weg zur Archivierung Größe !!!! – Burf2000