2009-12-31 4 views
3

저는 gluUnProject를 사용하여 광선을 씬에 던지고 거기에 프리미티브를 추가하고 있습니다. 내가하려는 것은 기존의 프리미티브를 정확하게 선택하는 것입니다. 따라서 3 개의 구체가 있다면 그것을 삭제할 수 있습니다.OpenGL gluUnProject 객체 섹션

나는 솔루션이 어떻게 광선이 객체와 교차하는지 검사하고 주조 원점에 가장 가까운 객체인지 확인합니다. 난,

does the ray intersect with (object) 

또는

returnRayIntersections(ray); 

마지막 일을 : 내 솔루션은 지금까지 원시적이며 경계 큐브 모든 개체를 둘러싸고, 사용하는 말 구에 대해 정확히이 일을 단순히 어쨌든이 GLUT로 OpenGL을 사용합니다. OpenGL을 선택 모드를 사용

모두에게 감사, 로렌스

답변

1

또 다른 좋은 방법은 다음과 같이이다 :

당신이 선택하려는 각 원시의 고유 한 색상을 사용, 백 버퍼에 장면을 그립니다. 24 비트 모드를 사용하는 경우 색상은 # 000001, # 000002 등일 수 있습니다. 조명, 안개등을 끄면 지정한 색상이 픽셀이 가져올 정확한 색상이됩니다.

백 버퍼를 화면에 blit하지 마십시오 (glSwapBuffers를 사용하지 마십시오). 대신 glReadPixels를 사용하여 GL 백 버퍼를 메모리 버퍼로 읽습니다. 그런 다음 화면상의 마우스 위치에 해당하는 픽셀 값을 읽을 수있는 메모리 비트 맵이 있습니다. 여기서 읽은 색상 값은 (# 000001, # 000002 등이 될 것이므로) 원시 변수에 쉽게 매핑 될 수 있습니다.

다음은이 선택 스타일에 관한 정보입니다. more GL_SELECTION 모드보다 한 가지 이점이 있기 때문에 이것이 내가 좋아하는 것이다. 3D 장면이 변하지 않고 마우스가 그 위에 움직이는 경우, 백 버퍼의 복사본 하나를 가져 와서 메모리 비트 맵의 ​​적절한 픽셀을 참조함으로써 마우스 아래에있는 엔티티를 신속하게 추정 할 수 있습니다. 장면이 바뀔 때까지 GL 호출을 전혀 사용할 필요가 없습니다. 내 응용 프로그램은 3D 장면 위에 마우스를 많이 올려 놓고 마우스가 움직이는 엔티티를 빨리 알아야하기 때문에이 방법이 정말 빨라졌습니다.

+0

아하이 방법은 멋지다. 훌륭한 튜토리얼을 여기에서 발견 할 수있다 : http://www.lighthouse3d.com/opengl/picking/index.php3?color1 – Ljdawson

+0

약간의 후속 조치,이 기능은 훌륭하다! – Ljdawson

3

는 임의의 복잡한 렌더링이 아니라 구체를 처리 할 수 ​​있기 때문에,이 작업을 수행하는 가장 좋은 방법입니다. 이 많은 자습서를 볼 수 있지만 대략 : 당신은 선택 모드에서 GL를 설정하여 시작 : 조각의 이름을 캡처하는 선택 버퍼을 설정 한 후,

glRenderMode (GL_SELECT); 

는 그런 장면을 그려 그 당신은 렌더링 중입니다. 이 article이 시작됩니다.

Nehe의 tutorial은 길지만 아주 좋습니다. OpenGL을 따기 구현하는