2012-01-23 4 views
3

터치 스크린을 클릭하고 터치 할 지점을 터치하여 피킹에 사용되는 광선의 시작 좌표로 사용하고 싶습니다.터치 스크린 좌표를 3 차원으로 변환하기 iphone에서 OpenGL 세계 좌표

화면을 터치하지 않고 반환 된 포인트를 GL 세계 좌표에서 사용할 수있는 것으로 변환하려면 어떻게해야합니까?

검색을 통해 gluUnProject를 사용하여 지원되는지 여부와 이식 방법에 대한 많은 보고서를 포함하여 많은 혼란을 초래할 수 있습니다.

누군가 나를 똑바로 눕힐 수 있습니까?

Objective C, Xcode를 사용하고 있으며 아이폰 용으로 컴파일하고 있습니다.

답변

3

0 단계 : 가져 gluUnproject : 그것을 필요의

보고서는 사실이다. 그 기능은 당신에게 힘든 일을합니다. 나는 MESA 프로젝트가 수정없이 iOS에서 거의 완벽하게 작동하는 구현을했다는 것을 알고 있습니다. 아직도 사용할 수 있는지 확실하지 않습니다. 그것을 막론하고, 당신은 그것에 대한 약간의 연구를해야 할 것이고, 당신 자신의 것을 굴리거나 누군가 다른 사람의 것을 굴려 봐야 할 것입니다. 선형 대수학에서 약간 무거워 행운을 빈다.

1 단계 : 변환의 OpenGL 좌표에 UIKit 좌표에서 :

이 일반적으로 두 가지를 포함한다 :

  1. 플립 Y 좌표, UIKit은 왼쪽 상단에 그 기원을 좋아하기 때문에, OpenGL은 왼쪽 하단에서 기원을 좋아합니다.

    touchLocation.y = [[self view] bounds].size.height - touchLocation.y; 
    
  2. "화면 단위"에서 픽셀로 변환하십시오. 이렇게하면 표준 및 망막 디스플레이 장치간에 일관된 상태를 유지할 수 있습니다.

    CGFloat scale = [[UIScreen mainScreen] scale]; 
    touchLocation.y *= scale; 
    touchLocation.y *= scale; 
    

단계 3 : gluUnproject 당신의 변환에 좌표 :

gluUnproject() 기술적으로 세계 공간에서 3D 점에 창 공간에서 3 차원 점으로 변환합니다. 따라서 레이를 얻으려면 두 번 호출해야합니다. 한 번은 가까운 클리핑면, 다른 한 번은 먼 클리핑면입니다. 그러면 레이를 얻을 수있는 두 점이 생깁니다. gluUnproject()을 호출하려면 2D 뷰 좌표, 현재 OpenGL 뷰포트, 현재 OpenGL 모델 뷰 행렬 및 현재 OpenGL 프로젝션 행렬에 액세스해야합니다. 의사 코드 :

Vector3 near, far; 
gluUnProject(touchLocation.x, touchLocation.y, 0, _modelview, _projection, _viewport, &near.x, &near.y, &near.z); 
gluUnProject(touchLocation.x, touchLocation.y, 1, _modelview, _projection, _viewport, &far.x, &far.y, &far.z); 
return MakeRay(near, Vector3Subtract(far, near)); 
+0

이제 gluUnproject를 구현했습니다. 의사 코드에서 뷰포트 좌표는 1 단계 다음에 터치 된 화면 좌표입니까? 왜 먼거리에서 멀리 떨어진 곳에서 광선의 먼 지점이 계산됩니까? – Dave

+0

@Dave 예, viewportcoord는 뷰포트의 탭 위치입니다. 나는 명확성을 위해 코드를 편집했다. 수학적으로 광선은 벡터 원점과 원점의 벡터 방향으로 정의됩니다. 따라서 "광선의 먼 점"은 절대 점이 아니며 가까운 점의 벡터이며 멀리있는 점을 가리키며 멀리있는 점으로 계산됩니다. –

+0

내 솔루션이 완벽하지는 않지만 레이 좌표보다 내 레이 충돌 방정식과 관련이 있다고 생각합니다. 많은 도움을 준 make ray 부분을 설명해 주셔서 감사합니다. – Dave

관련 문제