2012-07-15 7 views
0

나는 수천 줄의 3D 장면을 가지고 있습니다. 마우스 커서의 10 픽셀 근처에서 모든 3D 선을 선택할 수 있기를 원합니다 (원근 투영 사용). 고유 한 색상 기반 방법을 사용하려고했습니다. 그러나이 방법은 모든 라인을 선택할 수 없기 때문에 적합하지 않습니다. 가장 가까운 라인 만 선택할 수 있습니다. 문제가 해결 될만한 해결책이 있습니까? OpenGL 또는 DirectX - 중요하지 않습니다.3D 라인 마우스 피킹

답변

2

왜 그 라인과 해당 포인트 사이의 거리를 계산하지 않는 것이 좋을까요? 이것은 2D 직선 간 거리 계산입니다. 루아 인터 피터 (Lua interpeter)를 호출하는 Python 실행 파일을 호출하는 Perl 스크립트를 사용하여이를 구현할 수 있으며, 여전히 초당 10 만 개를 수행 할 수 있습니다.

이것은 터널 비전 중 하나입니다. "내가 갖고있는 모든 것이 망치 일 때 모든 문제는 손톱처럼 보입니다." 이 없기 때문에 렌더링을 사용하여 따기를 수행 할 수 있습니다.

+0

거리가 투영 거리에 있다고 화면에 표시하는 것이 가치 있다고 생각합니다. 따라서 먼저 선 끝의 화면 좌표를 찾고 거리 만 계산해야합니다. –

+0

@AlexeyFrunze 또는 화면 포인트로 이동하는 라인의 세계 좌표를 계산하고 세계 공간에서 라인 비교를 수행합니다. –

+0

@MartinBeckett하지만 두 번째 해결책은 분명히 멈출 것입니다. –

2

이전 OpenGL (< = 2.1)에서는 선택 모드를 사용하여 정확히 수행 할 수 있습니다. gluPickMatrix()을 사용하여 커서 위치 주변의 작은 영역을 선택하고 선택 버퍼를 초기화하고 선택 모드 (glRenderMode(GL_SELECT))로 들어가서 장면을 다시 그립니다. 그런 다음 선택 모드에서 다시 돌아 오면 선택 버퍼는 관심 영역에 나타나는 모든 그려진 객체의 전체 이름 (실제로 ID 번호)이됩니다. 렌더링하는 각 객체 주위에 이름 (glPushName(objIndex))을 밀거나 팝하기 위해 그리기 코드를 약간 수정해야합니다.

현대 그래픽 하드웨어를 가장 효율적으로 사용하는 것은 아니지만 항상 작동합니다.

1

아무 것도 그리지 않기 때문에 OpenGL도 DirectX도 작업을 수행하지 않습니다. 선택한 위치에 가장 가까운 점이 원하는 최대 거리보다 가까운 경우 장면의 모든 선을 화면에 투영하고 테스트합니다. Kd 트리 또는 유사한 구조와 같은 일부 공간 하위 구분 구조에있는 행을 유지하여이 기준을 충족시키지 못하는 모든 행을 신속하게 삭제하면이 작업을 가속화 할 수 있습니다.

관련 문제