GLScene ist dafür nicht die richtige Bibliothek
Ist aber vermutlich gerade die, die er benutzt.
pick := (GLSceneViewer1.Buffer.GetPickedObject(X, Y) as TGLCustomSceneObject);
Kann nicht gehen du hast nur 2 Koordinaten es fehlt die der Tiefe also Z..
Deine Abfrage ist also auf 2D nicht 3D ausgelegt.
Die Abfrage erwartet natürlich die Bildschirmkoordinaten des Rendering-Context und die sind halt nur 2D. Die Funktion macht daraus ein 3x3 Pixel großes Rechteck und listet alle Primitiven auf, die in diesem Rechteck gerendert werden, sortiert nach Z-Wert. Das vorderste Objekt wird dann zurückgegeben. Es gibt auch noch die Funktion GetPickedObjects, mit der man das Rechteck vorgibt und die gesamte Liste zurückbekommt.
Allerdings wird nur auf ganze Primitiven (Plane, Sphere, Cube, Mesh...) aufgelöst und nicht auf einzelne Teilflächen davon. Würde man den Cube durch 6 Planes darstellen, könnte man auch die korrekte Fläche erkennen. Es ist also kein Manko der Bibliothek, sondern eine Sache des Aufbaus der Szene durch Primitive. Wenn ich die Flächen eines Cubes unterscheiden will, dann darf ich eben keinen Cube nehmen, sondern muss die Flächen einzeln rendern.
Ach ja, GLScene bietet auch ein RayCastIntersect für seine Scene-Objects. Würde aber hier auch nichts helfen, da auch die objekt-basiert ist. Allerdings könnte man anhand der Koordinaten des Intersection-Points auf die getroffene Fläche schließen. Ist aber alles andere als trivial.