2010-03-21 4 views

답변

1

제가 생각한 한 가지 생각은 gluProject를 호출 한 결과를 캐시하는 것이 었습니다. 이것은 고정 카메라를 다루는 경우에만 실용적 일 수 있습니다. 카메라 관점의 변화가 끝나면 나는이 "터치 가능"캐시를 재생성 할 수 있습니다.

이렇게하면 내가 만진 것에 반응하는 입력에 대해서만 테스트 할 수 있다는 이점이 있습니다.

이 방법에 대한 의견을 보내 주시면 감사하겠습니다.

1

완전히 렌더링하는 대상에 따라 다릅니다.

a) 안드로이드에서 느린 속도 인 것처럼 들리므로 픽업 방식을 사용해서는 안됩니다. b) 작은 물체의 경우 더 큰 '터치 영역'을 원할 수 있으므로 을 정확하게에 터치 할 필요가 없습니다. c) 올바른 질문에 실제로 대답하지 않습니다. "내가 만진 곳에서 정확히 렌더링 된 최상위 그래픽 항목은 무엇입니까?"라는 결과를 제공합니다. "사용자가 터치하거나 터치 한 게임 엔티티는 무엇입니까?"

내가 말했듯이, 그것은 완전히 당신의 게임에 달려있다. 2D 또는 거의 2D 게임 인 경우 간단합니다. 터치 좌표를 게임 모델에 입력하면됩니다. 3D 게임의 경우 방금 전에 찍은 간단한 알고리즘을 제안합니다.

  1. 터치했을 수있는 모든 터치 가능한 게임 개체의 목록을 만듭니다.
  2. 중심 좌표를 3D 화면 좌표로 변환합니다. (여기에 설명 된 2D 화면 좌표 : http://www.flipcode.com/archives/Plotting_A_3D_Point_On_A_2D_Screen.shtml)
  3. 각 개체에 대한 2D 거리를 찾고 터치 임계 값보다 큰 거리의 개체를 버립니다.
  4. 거리 메트릭에 따라 가장 가까운 개체를 찾습니다. 이 시점에서 다시 실험해야합니다. 게임의 특성에 따라 다릅니다.

정확한 결과를 위해 선 교차점을 사용할 수 있습니다. 저것을위한 산법 ("비행기 선 교차점 raycasting"를위한 수색)가있다.

+0

그러면 모든 물체의 모양이 동일하고 3D에서 카메라까지의 거리가 같다고 가정합니다. 나는 이것이 대부분의 경우에 유효한 가정이라고 생각하지 않는다. – mnemosyn

4

2D에서 3D 피킹을 수행하는 경우 행렬 및 벡터를 사용하여 피딩해야합니다. GlUnproject는 OpenGL ES 1.1 용으로 존재하지 않으므로 혼자서 수학을해야합니다.

레이 객체 교차로가 그 방법입니다. Timmmms 대답은 이미 그것의 일부를 다룬다. 그러나 더 많이있다. 아이디어는 2D 좌표에서 광선을 3D로 만드는 것입니다. 뷰 매트릭스와 프로젝션 매트릭스의 반전이 필요합니다. 일단 광선이 있으면 원하는 광선 - 교차 테스트를 사용할 수 있습니다. 물론 Timmmm 포인트 4와 같이 가장 가까운 오브젝트를 선택해야합니다. 경계 영역과 경계 상자는 구현하기 쉽고 인터넷에는 교차 테스트 자습서가 가득합니다.

This picking tutorial은 DirectX 용이지만 아이디어를 얻을 수 있습니다. 광선을 만드는 부분이 가장 중요합니다.

편집 Android는 자체적 인 gluUnproject 버전을 구현합니다. 원거리 및 원거리 평면 (0 및 1)에 대해 호출하고 원거리 평면 결과에서 가까운 평면 결과를 빼서 광선의 방향을 얻는 방법으로 광선을 생성하는 데 사용할 수 있습니다. 광선 원점은 뷰 위치입니다. here.

+0

gluUnProject()를 지원 한 것으로 나타났습니다. http://developer.android.com/reference/android/opengl/GLU.html –

+1

오. 실제로 Android는 자체 버전을 구현하는 것으로 보입니다. OpenGL ES 1.1의 일부가 아닙니다. 이 함수를 사용하여 두 번 호출하여 광선을 만들 수 있습니다. http://www.opengl.org/resources/faq/technical/selection.htm – Virne

+0

광선이 교차하고있는 대상을 계산하는 방법에 대한 제안이 있습니까? –

2

나는 대부분의 응용 프로그램에서 올바른 3D 접근법을 사용해야한다고 생각합니다. 레이 캐스팅.

사용자가 선택한 2D 화면 좌표로 위치를 가져 와서 월드 공간으로 투영합니다. 이렇게하면 카메라에서 시작하여 장면을 가리키는 3D 광선이 생깁니다. 이제 3D로 충돌 테스트를 수행해야합니다. 대부분의 경우 속도를 높이기 위해 타원체, 구 및 상자와 같은 간단한 형상 세트로 객체를 축소하여 수행 할 수 있습니다.

핸드 헬드 장치의 정밀도가 주어지면 이미 충분한 정밀도 여야합니다. 객체의 형식에 따라 하나 이상의 기본 프리미티브를 사용해야 할 수도 있습니다. 또한, 항상 동일한 프리미티브를 사용하는 것이 무의미합니다. 바운딩 구는 아주 긴 막대의 매우 나쁜 근사입니다.

+0

이 테스트를 수행하는 방법을 설명하는 자습서를 알고 계십니까? –

+1

불행히도. 여기 저기에 작은 조각이 있지만, 아직 간결한 구현을 찾지 못했습니다. 얼마나 빨리 필요합니까? 아마도 나는 무언가를 쓸 수 있었다. ... – mnemosyn

+0

나는 새로운 튜토리얼을 만들지 않을 것이다! 자바와 앤드류의 컨텍스트에서 완성 된 것을보고 싶습니다. –

관련 문제