2010-12-02 4 views
1

Ich habe ein Quad auf der y = -50-Ebene. Im Moment möchte ich nur die Koordinaten eines Mausklicks auf dem Quad erhalten. Ich habe es in begrenztem Umfang geschafft. Das Problem ist, dass die Transformationen, die ich beim Zeichnen des Quads anwendete, nicht berücksichtigt werden. Ich kann einige Konstanten hinzufügen und es funktionieren lassen, aber ich lasse den Benutzer die Szene um die x- und y-Achse mit glRotatef() drehen, so dass die Koordinaten durcheinander geraten, sobald eine Rotation stattfindet.Ray Kommissionierung mit gluUnProject()

Hier ist, was ich tue jetzt:

Ich nenne gluUnProject() zweimal, einmal mit z = 0 und einmal mit z = 1.

gluUnProject(mouseX, WINDOW_HEIGHT - mouseY, 0, modelView, projection, viewport, &x1, &y1, &z1); 
gluUnProject(mouseX, WINDOW_HEIGHT - mouseY, 1, modelView, projection, viewport, &x2, &y2, &z2); 

Normalized Strahlvektor:

x = x2 - x1; 
y = y2 - y1; 
z = z2 - z1; 
mag = sqrt(x*x + y*y + z*z); 
x /= mag; 
y /= mag; 
z /= mag; 

Parametric Gleichung:

float t = -(camY)/y; 
planeX = camX + t*x; 
planeY = camY + t*y; 
planeZ = camZ + t*z; 

Dabei wird (camX, camY, camZ) die Kameraposition an gluLookAt() übergeben.

Ich möchte planeX, planeY und planeZ die Koordinaten des Klicks auf das Quad, in dem gleichen Koordinatensystem, das ich verwendet habe, um das Quad zu zeichnen. Wie kann ich das erreichen?

+0

Wann greifen Sie die ModelView-Matrix? Vor oder nach dem 'glRotatef()'? – genpfault

Antwort

1

Sie dürfen keine explizite Z-Tiefe Ihrer Wahl eingeben. Um die Weltkoordinate zu finden, müssen Sie den Tiefenpufferwert an dieser bestimmten Mauskoordinate übergeben.

GLfloat depth; 
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); 

Wenn Sie das in Ihr gluUnProject übergeben, sollten Sie die Werte erhalten, nach denen Sie suchen. Plus, wie genpfault in seinem Kommentar sagte, stellen Sie sicher, dass Sie die Modellansicht Matrixdaten im richtigen Moment greifen. Ansonsten haben Sie die falsche Matrix.