2013-11-04 1 views
1

OpenGL에서 2D 개체를 선택하고 싶지만 어떻게해야할지 모릅니다. gluPickMatrix를 사용하여 3D로 표현하고 싶습니다.2D OpenGL을 선택하는 방법은 무엇입니까?

void initDraw2D(){ 
    GLuint buff[BUFSIZE];     
    GLint hits, view[4]; 
    glSelectBuffer(BUFSIZE, buff); 
    glGetIntegerv(GL_VIEWPORT, view); 
    glRenderMode(GL_SELECT); 
    glInitNames(); 
    glPushName(0); 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
     glLoadIdentity(); 
     gluPickMatrix(mouseX, view[3] - mouseY, 1.0, 1.0, view); 
     glMatrixMode(GL_MODELVIEW); 
     Draw(); 
     glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    hits = glRenderMode(GL_RENDER); 
    if (onSelect){ 
    processHits(hits, buff); 
    onSelect = false; 
    } 
    Draw(); 
    glutPostRedisplay(); 
} 

을하지만 난 그것을 클릭하면이 선택하지 않은 :이 내가 시도하는 것이다.

답변

1

하나 쉬운 방법은 다른 색으로 각 개체를 렌더링하는 것입니다. 3 차원 배열 (벡터)을 반환하는 함수를 작성하고 아직 선택하지 않은 경우 해당 색상을 개체의 선택 색상으로 선택하고 선택 색상 목록에 추가합니다. 이제 각 객체의 색상이 다르기 때문에 커서 위치에서 픽셀의 색상을 확인할 수 있습니다. 프레임 버퍼 또는 pbo-s를 사용하십시오. 그런 다음 선택 목록에서 조회하고 객체에 대한 포인터를 반환합니다 (또는 원하는대로 수행하십시오).

물론 화면에 렌더링 할 필요는 없습니다.

그것은 다음과 같다 : (의사)

object* object1 = new object(); 
object1->createSelectColor(); 
object1->addColorToList(); 
... 


objectRenderer->renderColoredObjects(/*to the fbo or texture for example*/); 
objectRenderer->pickColorAtCursorPos(); 
objectRenderer->lookUpColorInList(/*objectRenderer->selectedcolor*/); 
objectRenderer->setTarget(/*objectRenderer->selectedobject*/); 

이 구조에 독립적이다. R, G 및 B에서 0-255의 배율을 적용합니다. 255 * 255 * 255 = 16581375 가지 색상이 각 개체에 하나씩 적용됩니다.

색 룩업을위한 맵을 만들고, 개체와 색을 인덱싱하며, 룩업을 쉽게하는 영리한 색 피킹 기능을 생성 할 수 있습니다.

이 방법은 Chris Seddon - OpenGL 게임 개발에서 찾을 수 있습니다. 시작하는 것이 좋습니다.

1

마우스 커서가 경계 사각형 안에 있는지 그냥 확인할 수 없습니까? (심장, 테스트하지 쓴 =)

class Rectangle 
{ 
    int x, y, w, h; 

    bool IsPicked(Point mousePos) 
    { 
     return ((mousePos.x >= x) && (mousePos.x <= x + w)) 
       && 
       ((mousePos.y >= y) && (mousePos.y <= y + h)); 
    } 
}; 

)

+0

하지만 둥근 물체 라면요? – float

+0

@float 둥근 객체 인 경우 간단히'mouse.xy'와'round.xy' 사이의 거리를 계산 한 다음 거리가 둥근 객체의 반경보다 작 으면'isPicked == true' – Vallentin

+0

I 이걸 사용 하겠지만, 내가 원한 것은 아니야. – float