나는 수천 줄의 3D 장면을 가지고 있습니다. 마우스 커서의 10 픽셀 근처에서 모든 3D 선을 선택할 수 있기를 원합니다 (원근 투영 사용). 고유 한 색상 기반 방법을 사용하려고했습니다. 그러나이 방법은 모든 라인을 선택할 수 없기 때문에 적합하지 않습니다. 가장 가까운 라인 만 선택할 수 있습니다. 문제가 해결 될만한 해결책이 있습니까? OpenGL 또는 DirectX - 중요하지 않습니다.3D 라인 마우스 피킹
답변
왜 그 라인과 해당 포인트 사이의 거리를 계산하지 않는 것이 좋을까요? 이것은 2D 직선 간 거리 계산입니다. 루아 인터 피터 (Lua interpeter)를 호출하는 Python 실행 파일을 호출하는 Perl 스크립트를 사용하여이를 구현할 수 있으며, 여전히 초당 10 만 개를 수행 할 수 있습니다.
이것은 터널 비전 중 하나입니다. "내가 갖고있는 모든 것이 망치 일 때 모든 문제는 손톱처럼 보입니다." 에이 없기 때문에 렌더링을 사용하여 따기를 수행 할 수 있습니다.
이전 OpenGL (< = 2.1)에서는 선택 모드를 사용하여 정확히 수행 할 수 있습니다. gluPickMatrix()
을 사용하여 커서 위치 주변의 작은 영역을 선택하고 선택 버퍼를 초기화하고 선택 모드 (glRenderMode(GL_SELECT)
)로 들어가서 장면을 다시 그립니다. 그런 다음 선택 모드에서 다시 돌아 오면 선택 버퍼는 관심 영역에 나타나는 모든 그려진 객체의 전체 이름 (실제로 ID 번호)이됩니다. 렌더링하는 각 객체 주위에 이름 (glPushName(objIndex)
)을 밀거나 팝하기 위해 그리기 코드를 약간 수정해야합니다.
현대 그래픽 하드웨어를 가장 효율적으로 사용하는 것은 아니지만 항상 작동합니다.
아무 것도 그리지 않기 때문에 OpenGL도 DirectX도 작업을 수행하지 않습니다. 선택한 위치에 가장 가까운 점이 원하는 최대 거리보다 가까운 경우 장면의 모든 선을 화면에 투영하고 테스트합니다. Kd 트리 또는 유사한 구조와 같은 일부 공간 하위 구분 구조에있는 행을 유지하여이 기준을 충족시키지 못하는 모든 행을 신속하게 삭제하면이 작업을 가속화 할 수 있습니다.
- 1. 수백만 개의 원시를위한 마우스 피킹 전략은 무엇입니까?
- 2. 플롯 3D 라인, matlab
- 3. WPF의 3d 폴리 라인
- 4. 라인 대 라인 교차점 3d 공간
- 5. 픽셀 좌표를 3D 라인 (opencv)
- 6. 커맨드 라인/터미널 3D 렌더링
- 7. wxPython에의하기 matplotlib - 3D 라인 플롯
- 8. OpenGL에서 색상 코드 피킹 문제
- 9. 레이 캐스팅으로 오브젝트 피킹
- 10. jfreechart의 차트 라인 위로 마우스
- 11. 카메라로 확장 가능 안드로이드 장치의 3d 라인
- 12. JVM 스택 인트로 피킹
- 13. 피킹 in java 2d
- 14. Windows에서 pyOpenGL 색상 피킹
- 15. Pyglet을 사용한 OpenGL 피킹
- 16. java3d 오브젝트 피킹
- 17. OpenGl ES에서 광선 피킹 코드
- 18. 마우스 클릭과 3D 메쉬의 교차점을 어떻게 찾습니까?
- 19. 마우스 X와 Y를 3D 모델 좌표로 변환
- 20. 마우스/키보드 이벤트 시뮬레이션 (gtk + HOOPS 3D)
- 21. Google지도 v3, 폴리 라인 마우스 이벤트
- 22. 피벗 테이블 스크립트 오류 피킹
- 23. glTranslate/glRotated 후에 OpenGL 피킹
- 24. python 스크립트로 전체 환경 피킹
- 25. 폴리 라인 세그먼트 (segment) 알고리즘에 대한 3d 점의 거리
- 26. 3D 모델을 SVG 라인 아트로 변환하는 방법은 무엇입니까?
- 27. Open GLES 라인 (3D)을 기본으로 사용 하시겠습니까?
- 28. Zend_Mail 및 = 0D = 0A = 3D = 3D = 3D = 3D = 3D
- 29. 마우스 클릭 이벤트에서 3D 회전식 캐로 셀을 멈추는 방법
- 30. 3D 응용 프로그램에서 마우스 입력에 불균일 한 프레임
거리가 투영 거리에 있다고 화면에 표시하는 것이 가치 있다고 생각합니다. 따라서 먼저 선 끝의 화면 좌표를 찾고 거리 만 계산해야합니다. –
@AlexeyFrunze 또는 화면 포인트로 이동하는 라인의 세계 좌표를 계산하고 세계 공간에서 라인 비교를 수행합니다. –
@MartinBeckett하지만 두 번째 해결책은 분명히 멈출 것입니다. –