Hi,
ich such ne Möglichkeit, Picking in 3D zu realisieren.
Leider finde ich kaum eine Anleitung im Netz dazu, mit der ich klar komme.
Soweit ich weis, ist die Methode mit OpenGL (GL_SELECT) veraltet und wird nicht mehr unterstützt.
Da ich ein Objekt zu einem Schnittpunkt mit (erstmal) einer Ebene bewegen möchte, würde es sich anbieten einen Strahl zu berechnen und dann den Schnittpunkt mit der Ebene zu berechnen.
Der Strahl müsste dann ja von der Kamera durch die Maus gehen.
Und da scheiter ich momentan dran.
Ich hab zwar bereits einige Code Beispiele gefunden, steig aber noch nicht ganz durch, was was macht.
Hier mal ein Stück Code und dazu ein Paar fragen:
Bleibt also die Frage:
wie an die Koordinaten der Kamera kommen?
Und stimmt meine vermutung zu den Koordinaten der Maus?
Danke für eure Hilfe.
Gruß,
David
ich such ne Möglichkeit, Picking in 3D zu realisieren.
Leider finde ich kaum eine Anleitung im Netz dazu, mit der ich klar komme.
Soweit ich weis, ist die Methode mit OpenGL (GL_SELECT) veraltet und wird nicht mehr unterstützt.
Da ich ein Objekt zu einem Schnittpunkt mit (erstmal) einer Ebene bewegen möchte, würde es sich anbieten einen Strahl zu berechnen und dann den Schnittpunkt mit der Ebene zu berechnen.
Der Strahl müsste dann ja von der Kamera durch die Maus gehen.
Und da scheiter ich momentan dran.
Ich hab zwar bereits einige Code Beispiele gefunden, steig aber noch nicht ganz durch, was was macht.
Hier mal ein Stück Code und dazu ein Paar fragen:
Java:
public static Ray getScreenCenterRay() {
//Der Mittelpunkt des Fensters wird ermittelt
float winX = Display.getWidth() / 2, winY = Display.getHeight() / 2;
//hier werden dann irgendwelche matritzen ausgelsen und gespeichert. Aber was steht in denen drin? Was machen sie?
IntBuffer viewport = BufferUtils.createIntBuffer(16);
GL11.glGetInteger( GL11.GL_VIEWPORT, viewport );
FloatBuffer modelview = BufferUtils.createFloatBuffer(16);
GL11.glGetFloat( GL11.GL_MODELVIEW_MATRIX, modelview );
FloatBuffer projection = BufferUtils.createFloatBuffer(16);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection);
FloatBuffer positionNear = BufferUtils.createFloatBuffer(3);
FloatBuffer positionFar = BufferUtils.createFloatBuffer(3);
//und hier verstehe ich auch noch nicht, was genau vorgeht.
//wenn ich richtig verstanden habe, wird in der oberen Zeile die 3D Koordinaten
//für die fenstermitte an der stelle, die am Dichtesten an der Kamera ist berechnet.
//und in der Zeile dadrunter die koordinaten an der stelle, die am weitesten weg
//von der Kamera ist.
//das müsste dann ja mit Maus koordinaten ebenso funktionieren.
//bringt mich aber nicht weiter(?), weil ich den Vektor aus Kamera und Mausüosition brauche
//Also müsste ich hier
//GLU.gluUnProject(Mouse.getx(), Mouse.getY(), 0, modelview, projection, viewport, positionFar);
//nehmen, damit ich die Mauskoordinaten an der dichtesten Stelle der Kamera habe?
//und dann brauch ich noch die koorinaten der Kamera und kann einen Vektor aufstellen.
//dann gilt PosKamera + Vector * länge als glecihung für den Strahl?
//Aber wie komm ich an die Kamera position?
GLU.gluUnProject(winX, winY, 0, modelview, projection, viewport, positionNear);
GLU.gluUnProject(winX, winY, 1, modelview, projection, viewport, positionFar);
Vector3f nearVec = new Vector3f(positionNear.get(0), positionNear.get(1), positionNear.get(2));
Vector3f farVec = new Vector3f(positionFar.get(0), positionFar.get(1), positionFar.get(2));
return new Ray(nearVec, Vector3f.sub(farVec, nearVec, null).normalise(null));
Bleibt also die Frage:
wie an die Koordinaten der Kamera kommen?
Und stimmt meine vermutung zu den Koordinaten der Maus?
Danke für eure Hilfe.
Gruß,
David