Was müsste ich tun, um ein Objekt mit der Maus in OpenGL auszuwählen? Ich habe so etwas wie Auswahlpuffer gefunden, aber ich habe auch gelesen, wo es abgeschrieben wurde. Ich stecke also fest und weiß nicht, wonach ich suchen soll. Auch benutze ich C++, um dies zu tun.Objekt basierend auf Mausauswahl ziehen Opengl
Antwort
Für 2D, hier ist der Code, den ich arbeite - Sie müssen es ein wenig ändern, aber hoffentlich gibt es Ihnen einige Ideen. Dieser Code gibt Ihnen die Weltkoordinaten bei "0 height" - wenn etwas nicht 0 height ist, kann es dies möglicherweise nicht richtig auswählen, abhängig von der Perspektive.
// for the current mouse position on the screen, where does that correspond to in the world?
glm::vec2 World::world_position_for_mouse(const glm::vec2 mouse_position,
const glm::mat4 projection_matrix,
const glm::mat4 view_matrix)
{
int window_width;
int window_height;
this->graphics.get_window_dimensions(window_width, window_height);
const int mouse_x = mouse_position[0];
const int mouse_y = mouse_position[1];
// normalize mouse position from window pixel space to between -1, 1
GLfloat normalized_mouse_x = (2.0f * mouse_x)/window_width - 1.0f;
float normalized_mouse_y = 1.0f - (2.0f * mouse_y)/window_height;
glm::vec3 normalized_mouse_vector = glm::vec3(normalized_mouse_x, normalized_mouse_y, 1.0f);
glm::vec4 ray_clip = glm::vec4(normalized_mouse_vector.xy(), -1.0, 1.0);
glm::vec4 ray_eye = glm::inverse(projection_matrix) * ray_clip;
ray_eye = glm::vec4(ray_eye.xy(), -1.0, 0.0);
glm::vec3 ray_world = (glm::inverse(view_matrix) * ray_eye).xyz();
ray_world = glm::normalize(ray_world);
float l = -(camera.z/ray_world.z);
return {camera.x + l * ray_world.x, camera.y + l * ray_world.y};
}
Um die Welt mit den gleichen „Bildschirm-Einheiten“, unabhängig von Zoom zu schwenken, verwende ich diese auf den Ergebnissen des Code-basierten Code oben:
float camera_motion = time.get_wall_clock_delta() * camera_motion_per_second;
auto x1 = this->world_position_for_mouse(glm::vec2(1,0), this->cached_projection_matrix, this->cached_view_matrix).x;
auto x2 = this->world_position_for_mouse(glm::vec2(0,0), this->cached_projection_matrix, this->cached_view_matrix).x;
auto camera_change = (x1 - x2) * camera_motion;
wo camera_motion
nur ein Multiplikator ist, wie Sie möchten, dass es sich in Kombination mit dem Zeitdelta aus dem vorherigen Frame bewegt. Grundsätzlich gilt: Je weiter herausgezoomt wird, desto schneller scrollt das pro Sekunde. Unabhängig davon, welcher Pixel sich am rechten Rand des Fensters befindet, wird unabhängig vom Zoom eine konstante Zeit benötigt, um zur linken Kante zu gelangen.
Danke für den Code krank zu spielen damit herum und sehen, was ich schätze, schätzen Sie Ihre Hilfe. –
- 1. Ziehen von Elementen basierend auf Prozentsatz auf Containment-Element
- 2. Hardwarebeschleunigte OpenVG-Implementierung auf dem Desktop basierend auf OpenGL ES
- 3. Wie Daten aus den Tags ziehen basierend auf anderen Tags
- 4. Zeichen aus String basierend auf festem Zeichen ziehen
- 5. Aktualisieren MKPointAnnotation Objekt beim Ziehen
- 6. Zeichenkettenwert aus JSON-Objekt ziehen
- 7. OpenGL + Verarbeitung: Drehen und bewegen basierend auf Richtung
- 8. 3ds max Objekt zu Opengl
- 9. Dynamisch Formulare basierend auf JSON-Objekt erstellen
- 10. Sortierung JSON-Objekt basierend auf Attribut
- 11. Filterarray basierend auf dem nächsten Objekt
- 12. ändern @RequestBody Objekt basierend auf @PathVariable
- 13. Constructing Objekt basierend auf Wahr/Falsch-Bedingungen
- 14. Zurückgegebenes Objekt basierend auf dem Eingabetyp
- 15. Sortieren Array basierend auf Objekt Attribut - Javascript
- 16. Erzielen eines Fade-Effekts auf einem Objekt - OpenGL ES - iPhone
- 17. Wie funktioniert die Mausauswahl im Raster? Monogame/XNA
- 18. Drehen eines 2D-Objekt mit OpenGL gezeichnet
- 19. OpenGL "Zoom": Objekt Clipping und Helligkeit
- 20. OpenGL 4.1: Vertex-Array-Objekt zieht nichts
- 21. Leinwand ziehen auf Mausbewegung
- 22. Wie auf UIView ziehen
- 23. Sortier JavaScript-Objekt basierend auf mehreren Eigenschaft basierend auf dort Priorität
- 24. Triangle Steigung auf OpenGL
- 25. Wie OpenCL-Kontext basierend auf dem OpenGL-Kontext auf Mac OS x
- 26. Objekt-Array basierend auf einem anderen Array von Schlüsseln sortieren
- 27. Array von Objekten Auswahl von Objekt basierend auf Attributwert
- 28. PHP sort Objekt mit usort basierend auf zwei Werten
- 29. Filter Leaflet Geojson-Objekt basierend auf Checkbox-Status
- 30. Javascript/AngularJS Auswahl Objekt basierend auf dem Ausdruck als Schlüssel
es heißt Maus pflücken und es ist kompliziert. Ich habe es funktioniert, aber ich habe nur mit dem, was ich auf dieser Seite gefunden habe, bis es funktionierte - und meins funktioniert nur für 2D, nicht 3D. http://antongerdelan.net/opengl/raycasting.html Im Grunde schießt du einen Strahl "rückwärts" aus der Richtung, die du beim Rendern machst - von einer Bildschirmposition zurück in deine Welt (vs von deiner Welt auf den Bildschirm) . Dann finden Sie heraus, wo es sich auf verschiedenen "Höhen" befindet, während es sich bewegt, um zu bestimmen, was es schneidet. Ich würde dies als Antwort einreichen, aber ich kann nicht annähernd so gut wie diese Website erklären ... – xaxxon
Alles klar, danke, dass du mir einen Startplatz gegeben hast und ich hauptsächlich darauf ausarbeite, dass es in 2d so schlecht läuft Beispiel, da es das einzige Ding da draußen zu sein scheint. –
Da du 2d machst, habe ich meinen eigentlichen Code gepostet. Ich gebe zu, ich weiß nicht genau, wie es funktioniert und wenn Sie Probleme haben, kann ich nicht in der Lage sein, sie zu beantworten – xaxxon