2013-02-19 14 views
3

我在做簡單的3D遊戲。在3D場景中檢測鼠標移動到物體上的最佳方式是什麼?如何檢測鼠標在OpenGL中的某個對象?

+0

閱讀有關的openGL選擇緩衝液來創建。 – 2013-02-19 08:47:08

+1

[OpenGL GL \ _SELECT或手動碰撞檢測的可能的重複?](http://stackoverflow.com/questions/4040616/opengl-gl-select-or-manual-collision-detection) – 2013-02-19 09:18:00

回答

2

其實,我會避免使用這些挑選方法,只是在數學上做。直接從鼠標光標位置創建一條直線到場景中,並與場景中每個對象的邊界球體相交。對於相交的每個邊界球,只需檢查哪個頂點與眼睛位置最接近即可。

直線可以分別使用該算法其中z設置爲0 1.

math::Vec3f windowToObjectf(const math::Vec3f& windowCoord) { 
    math::Matrix4f modelViewMatrix; 
    math::Matrix4f projectionMatrix; 
    std::array <GLint, 4> viewport; 
    glGetFloatv(GL_MODELVIEW_MATRIX, modelViewMatrix.data()); 
    glGetFloatv(GL_PROJECTION_MATRIX, projectionMatrix.data()); 
    glGetIntegerv(GL_VIEWPORT, &viewport.front()); 
    math::Vec3f ret(0, 0, 0); 
    auto succes = gluUnProject(windowCoord.x , windowCoord.y, windowCoord.z, modelViewMatrix.data(), projectionMatrix.data(), &viewport.front(), &ret.x, &ret.y, &ret.z); 
    RASSERT(succes == GL_TRUE); 
    GL_RASSERT(); 
    return ret; 
} 
+0

它對某些東西有什麼好處像顏色編碼實體ID? – 2013-02-19 09:18:45

+0

@BartekBanachewicz:你的意思是,除了顯然不需要重新渲染整個場景?而不是誘導GPU-> CPU回讀? – 2013-02-19 09:38:29

+0

我們正在閱讀4個字節的頂端,它真的很重要嗎?我不得不測量。 – 2013-02-19 09:47:32