Hallo liebe Leute,
ich baue derzeit an meinem ersten kleinen 3D Spiel und habe meines Erachtens nach bereits Level 2 der 3D Fähigkeiten erlangt, allerdings fehlen immernoch einige Kenntnisse. Daher falls das Problem zu offensichtlich ist bitte nicht hauen
Ich habe ein online Tutorial so umgebaut, dass es meinen Anforderungen in etwa entspricht, allerdings ist ein Teil noch etwas nebulös:
in der Liste Objects werden momentan 2 Zielobjekte (Quads) gespeichert und dargestellt. Beide werden bei einem Klick darauf erkannt und es erfolgt eine Ausgabe, dass ein Objekt erkannt wurde. Leider fehlt an dieser Stelle noch die Unterscheidung zwischen beiden. Gleich auf welches Objekt man klickt wird zunächst immer das erste in der Liste ausgegeben (was vermutlich auf der Auswahl innerhalb der "Objekt gefunden" Abfrage basiert). Hier nun meine Frage:
Wie kann ich herausfinden, welches der beiden Objekte aus der Liste tatsächlich angesprochen wurde?
Falls noch Fragen / Daten offen sind die zur Lösung des Problems fehlen fragt bitte einfach nach!
Beste Grüße und Danke im Voraus!
ich baue derzeit an meinem ersten kleinen 3D Spiel und habe meines Erachtens nach bereits Level 2 der 3D Fähigkeiten erlangt, allerdings fehlen immernoch einige Kenntnisse. Daher falls das Problem zu offensichtlich ist bitte nicht hauen
Ich habe ein online Tutorial so umgebaut, dass es meinen Anforderungen in etwa entspricht, allerdings ist ein Teil noch etwas nebulös:
Java:
private void selection() { // This Is Where Selection Is Done
int buffer[] = new int[512]; // Set Up A Selection Buffer
int hits; // The Number Of Objects That We Selected
// The Size Of The Viewport. [0] Is <x>, [1] Is <y>, [2] Is <length>, [3] Is <width>
int viewport[] = new int[4];
// This Sets The Array <viewport> To The Size And Location Of The Screen Relative To The Window
IntBuffer temp = ByteBuffer.allocateDirect(64).order(ByteOrder.nativeOrder()).asIntBuffer();
temp.order();
GL11.glGetInteger(GL11.GL_VIEWPORT, temp);
temp.get(viewport);
temp = ByteBuffer.allocateDirect(2048).asIntBuffer();
GL11.glSelectBuffer(temp); // Tell OpenGL To Use Our Array For Selection
temp.get(buffer);
// Puts OpenGL In Selection Mode. Nothing Will Be Drawn. Object ID's and Extents Are Stored In The Buffer.
GL11.glRenderMode(GL11.GL_SELECT);
GL11.glInitNames(); // Initializes The Name Stack
GL11.glPushName(0); // Push 0 (At Least One Entry) Onto The Stack
GL11.glMatrixMode(GL11.GL_PROJECTION); // Selects The Projection Matrix
GL11.glPushMatrix(); // Push The Projection Matrix
GL11.glLoadIdentity(); // Resets The Matrix
// This Creates A Matrix That Will Zoom Up To A Small Portion Of The Screen, Where The Mouse Is.
GLU.gluPickMatrix((float) mouse_x, (float) (viewport[3] - mouse_y), 1.0f, 1.0f, IntBuffer.wrap(viewport));
// Apply The Perspective Matrix
GLU.gluPerspective(45.0f, (float) (viewport[2] - viewport[0]) / (float) (viewport[3] - viewport[1]), 0.1f, 100.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW); // Select The Modelview Matrix
drawTargets(); // Render The Targets To The Selection Buffer
GL11.glMatrixMode(GL11.GL_PROJECTION); // Select The Projection Matrix
GL11.glPopMatrix(); // Pop The Projection Matrix
GL11.glMatrixMode(GL11.GL_MODELVIEW); // Select The Modelview Matrix
hits = GL11.glRenderMode(GL11.GL_RENDER); // Switch To Render Mode, Find Out How Many
// Objects Were Drawn Where The Mouse Was
if(hits > 0) { // If There Were More Than 0 Hits
int choose = buffer[3]; // Make Our Selection The First Object
int depth = buffer[1]; // Store How Far Away It Is
for (int i = 1; i < hits; i++) { // Loop Through All The Detected Hits
// If This Object Is Closer To Us Than The One We Have Selected
if (buffer[i * 4 + 1] < (int)depth) {
choose = buffer[i * 4 + 3]; // Select The Closer Object
depth = buffer[i * 4 + 1]; // Store How Far Away It Is
}
}
if (!objects.get(choose).hit) { // If The Object Hasn't Already Been Hit
System.out.println(objects.get(choose).id);
}
}
}
in der Liste Objects werden momentan 2 Zielobjekte (Quads) gespeichert und dargestellt. Beide werden bei einem Klick darauf erkannt und es erfolgt eine Ausgabe, dass ein Objekt erkannt wurde. Leider fehlt an dieser Stelle noch die Unterscheidung zwischen beiden. Gleich auf welches Objekt man klickt wird zunächst immer das erste in der Liste ausgegeben (was vermutlich auf der Auswahl innerhalb der "Objekt gefunden" Abfrage basiert). Hier nun meine Frage:
Wie kann ich herausfinden, welches der beiden Objekte aus der Liste tatsächlich angesprochen wurde?
Falls noch Fragen / Daten offen sind die zur Lösung des Problems fehlen fragt bitte einfach nach!
Beste Grüße und Danke im Voraus!