2016-05-02 14 views
0

OpenGLでマウスを使用してオブジェクトを選択するには、何が必要ですか?私は選択バッファのような何かを見つけたが、私はまた、それが減価償却された場所をいくつか読んだ。だから私は立ち往生して何を探すべきか分からない。また、私はこれを行うにはC + +を使用しています。マウスの選択に基づいてオブジェクトをドラッグするOpengl

+0

これはマウスピッキングと呼ばれ、複雑です。私はそれが働いているが、私はそれが働くまで私がこのサイトで見つけたものを使いこなした。そして私のものは3dではなく2dのためにしか働かない。 http://antongerdelan.net/opengl/raycasting.html基本的には、レンダリング時に画面の位置から自分の世界に戻って(あなたの世界からスクリーンまで)、あなたが行った方向から「後方に」光線を射しています。 。次に、それが交差するものを決定するために移動する際に、異なる「高さ」にある場所を把握します。私はこれを答えとして提出したいと思いますが、私はそのウェブサイトの近くにはどこにでも説明することができません。 – xaxxon

+0

私は出発場所を与えてくれてありがとう、主に2dでうまくいくように探していますそれはそこの唯一のものだと思われるので、例です。 –

+0

2dをやっているので、私は実際のコードを掲示しました。私はそれがどのように動作するかを正確にはわからないと認めています。もし問題があれば、私はそれらに答えることができないかもしれません。 – xaxxon

答えて

2

2Dについては、私が働いているコードは次のとおりです。少し修正する必要がありますが、うまくいけばそれはあなたにいくつかのアイデアを与えるでしょう。このコードは、ワールド座標を「0高さ」にします。何かが高さが0でない場合、パースペクティブによっては正しく選択されないことがあります。

// 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}; 
} 

かかわらずズームの、私は上記のコードの結果に基づいて、このコードを使用するのと同じ「画面単位」で世界をパンに:

camera_motionがどのようにちょうど乗数である
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; 

速く、前のフレームからの時間デルタと組み合わせて動きたいと思っています。基本的にはズームインするほど速くなり、毎秒スクロールします。ウィンドウの右端にあるピクセルは、ズームに関係なく左端に到達するまでに一定の時間がかかります。

+0

コードを悪くしてくれてありがとうございます。 –

関連する問題