2012-03-27 5 views
0

나는 내가 어떻게 처리 할 수 ​​있는지를 알지 못한다. 저는 약 20k 버텍스의 openGl 객체를 가지고 있으며, 사용자에게이 버텍스 중 하나를 선택할 수있는 가능성을 제공해야합니다 (가능한 한 작은 오차 범위로 말하자). 이제 여기에 내가하고 싶은 일이 있습니다 :OpenGL 사용자 정의 탐색/선택

개체의 3D 캔버스 옆에 평면 x = 0으로 완성 된 사용자 3 조각을 제공합니다. y = 0 및 z = 0이다. 구체에 대한 가장 단순한 예를 들면, 이들 중 하나를 '잘라내는'것에 해당하는 3 개의 원이라고합시다. 이제 예제의 목적을 위해 z = 0을 취해 봅시다. 사용자가 포인트 (x_circle, y_circle)를 클릭하면 그가 클릭 한 위치의 3d 표현에서 실제 포인트를 얻고 싶습니다. 물론 z는 0이 될 것이지만 x와 y를 얻을 수있는 방법을 찾을 수는 없습니다. 그 좌표에서 캔버스를 클릭 할 때와 같은 결과를 가져 오는 (x_circle, y_circle) -> (x_screen, y_screen)을 쉽게 번역 할 수 있지만 3D 뷰에서 좌표를 (x, y, 0) 좌표로 변환 할 방법을 찾아야합니다.

x = 0, y = 0으로 동일한 작업을 수행해야하지만 z = 0에 대한 방법을 이해하고 구현할 수 있다면 추가 된 회전을 사용하여 동일한 솔루션을 더 많이 또는 덜 적용 할 수 있다고 생각합니다. 어떤 것. 누군가가 예제/코드 또는 심지어 수학을 도울 수 있다면 현재 진행 방법을 잘 모르기 때문에 도움이 될 것입니다.

+0

장면의 좌표를 볼 수 있도록 화면 좌표를 비 계획화 한 다음 해당 점의 광선과 교차하는 (또는 임계 값 내에 가까운) 첫 번째 정점을 찾아야합니다. 그래서 Google에서 검색 할 키워드는 Picking, gluUnProject, Line과 Point 사이의 거리 등입니다. – Robinson

+0

입력 해 주셔서 감사합니다. 하지만 gluUnProject가 3d → 3d로 변하는 것을 볼 수 있습니다. 난 단지 2d -> 2d를 돌릴 필요가 있습니다. 왜냐하면 화면에는 x, y가 있고 OpenGL 좌표에서는 평면 z = 0에서 원하는 것을 이미 알고 있기 때문입니다. – Bogdan

+0

2D로 생각하고있는 것 같습니다. 화면은 가까운 Z 버퍼 값에서 평면입니다. 따라서 뷰 공간 Z = Zmin은 스크린 평면입니다. 그래서 x, y에서 화면상의 당신의 점은 3D에서 실제로 x, y, Zmin입니다. 이제 광선의 다른 끝, 즉 마우스 커서가 장면을 가리키는 x, y, Zmin 방향을 결정해야합니다. 뷰 행렬의 역함수를 적용하여이 작업을 수행 할 수 있습니다. – Robinson

답변

2

사용자가 클릭 할 때 각 정점의 인덱스를 RGBA로 렌더링하는 셰이더를 사용하여 오프 스크린 버퍼에 GL.POINTS (원하는 경우 특정 크기로)를 사용하여 정점을 렌더링 할 수 있습니다. 그런 다음 마우스 위치의 픽셀을 다시 읽고 색인이 어떤 것인지 확인합니다.

관련 문제