2016-05-02 12 views
0

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

+0

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

+0

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. –

+0

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

Antwort

2

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.

+0

Danke für den Code krank zu spielen damit herum und sehen, was ich schätze, schätzen Sie Ihre Hilfe. –

Verwandte Themen