OpenGL의 Picking mechanism

  업도 몇개 안듣고 남는 시간에 용돈이나 좀 벌어볼 요량으로 C++ 코딩 알바를 구했다.
전체적인 틀은 MFC 형태라 하나하나 분석하면 큰 어려움이 없을거라 생각했는데...
그래픽 출력 부분에서 난관에 봉착했다. 단순히 Device context에 출력하는게 아니라 OpenGL을 사용했을 줄이야..

  어쩔수 없이 부랴부랴 도서관에서 관련서적 2권을 빌려서 훝어보기를 했다.
행렬 조작부분같은 건 쉽사리 이해할수는 없었고, 간단히 예제를 응용해서 화면 출력은 해 보았다.

  화면에 출력된 Object를 다시 마우스로 클릭하여 그 Object가 무엇인지 감지하는 과정을 Picking 이라고 하는데
이것 또한 만만치 않았다.


다음은 본인이 대략적으로 이해한 내용을 정리한 것으로 틀린 정보일 수 있음을 밝혀둔다.

Picking mechanism은 이런식으로 동작한다.

  예를 들어 위와 같이 삼각형과 사각형이 화면에 그려져 있을 때 마우스로 빨간 점이 있는 부분을 클릭했다고
해보자. OpenGL은 gluPickMatrix로 설정한 영역(녹색 박스)과 겹치는 Object가 있는지 검사하여 hit record
라는 자료를 생성해 준다. 여기선 오른쪽 사각형에 대한 hit record 가 생성된다. 최종적으로 이 hit record
가져와서 이후 처리 작업을 해주면 된다. ( 간단하게는 Object 이름을 출력한다든지... )

  클릭한 Object를 구분하기 위해 name stack 을 사용해야 한다. 처음에는 이 name stack 을 잘못이해했는데..
구분하고 싶은 Object의 이름들을 전부 때려박으면(!) 되는 줄 알았다.

  하지만 name stack은 이렇게 동작하는게 아니고 다음과 같이 동작한다. SELECT MODE에서

    glPushName(161);
    glBegin(GL_POINTS);
        glColor3d(0.0, 0.0, 0.0);
        glVertex3d(100.0, 100.0, 1.0);
    glEnd();
    glPopName();

이렇게 코딩을 했다고 해보자.
  hit recordname stack에 조작을 할 때 사용자가 지정한 Select buffer에 저장된다.
처음 glPushName(161) 함수에서는 name stack을 조작하기는 하지만 아직 hit record가 생성되지 않아서
Select buffer에 저장되지 않는다.

  화면에 점(vertex)를 그리면 hit record를 발생하고 마지막에 glPopName() 에서 비로서 Select buffer
저장되게 된다. 이렇게 저장되는 Select buffer 의 구조는 다음과 같다.



[name stack의 깊이] [깊이 정보] [깊이 정보] [Object name]

  만약 name stack의 깊이 값이 2 라면(SelectBu[0]이 2라면..) SelectBuf[4]에 2번째 name이 들어 가게 된다.
다시 말해서 hit record가 생성될 때 name stack에 들어있는 모든 이름들이 Select buffer에 저장되게 된다.

References

Picking_Tutorial.htm
http://www.glprogramming.com/red/chapter13.html
http://www.gisdeveloper.co.kr/435?category=4

by 빛의탑 | 2006/11/01 08:17 | CS - 컴퓨터그래픽스 | 트랙백 | 덧글(6)

트랙백 주소 : http://lsujang.egloos.com/tb/504022
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by object at 2006/11/01 08:42
OpenGL에서는 일단 그리기 모드를 셀렉트/피드백으로 바꾸고, 힛 테스팅 하고 싶은 부분 만큼을 새로 그리면 힛팅 정보가 넘어오는 구조로 되어있습니다.

http://rush3d.com/reference/opengl-redbook-1.1/

OpenGL의 바이블이라고 불리는 레드북의 온라인 버전입니다. 12장의 Selection/Feedback 참고하시면 될 겁니다.

혹시나 3차원 상황에서 작업하신다면, gluUnProject라는 함수도 꽤 유용하게 쓰일데가 있을겁니다 :-)
Commented by 빛의탑 at 2006/11/01 10:27
주먹구구식으로 버티는데... 이러다가 알바 언제 짤릴지 모르겠네요..;;;

네.. 도서관에서 그책 4판(1.4 버전용)이 있더라구요. 그거 빌려왔습니다.


아직 이 게시물 내용이 다 채우지 않았지만 대충 제가 이해는 잘한거 같네요...ㅋㅋ
Commented by 미영 at 2009/06/23 16:42
흠.. 네이버에서 검색하다가,
클릭해서 들어왔는데.
글 읽다가..이름을 봤는데. 어디서 많이 본 이름.....쿨럭...ㅋㅋ

잘지내시죠.??ㅋㅋ

암튼, 글을 정말 이해하기 쉽게 너무 잘 쓰셨네요..ㅎㅎ
잘보고 가요~ㅎㅎ
Commented by 빛의탑 at 2009/06/23 23:28
우아~ 정말 오랜만이군..ㅎㅎ 너두 잘 지내지??

그래픽 수업 듣나?? 나도 석사때 들을게 없어서 들었었는데 밤새 코딩하느라 너무 힘들었다..;;;

블로그에 포스팅 하는 목적은 나중에 내가 참고할라고 쓴건데 나름 도움이 되었다면 다행이야~~.^^
Commented by 미영 at 2009/06/29 12:00
ㅎㅎ그래픽 섭을 듣는건 아니구요..
프로젝트 관련해서 opengl을 써야해서요..ㅠ_ㅠㅋㅋ
수원에서 다니는거예요?
회사는 좋아요?ㅎㅎ
Commented by 빛의탑 at 2009/06/30 23:15
요즘은 지방 출장이 너무 많아서 좀 힘들다.. 적당한 시기에 좀 더 좋은 곳으로 옮겨야지..ㅎㅎ

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶