0 단계 : 가져 gluUnproject : 그것을 필요의
보고서는 사실이다. 그 기능은 당신에게 힘든 일을합니다. 나는 MESA 프로젝트가 수정없이 iOS에서 거의 완벽하게 작동하는 구현을했다는 것을 알고 있습니다. 아직도 사용할 수 있는지 확실하지 않습니다. 그것을 막론하고, 당신은 그것에 대한 약간의 연구를해야 할 것이고, 당신 자신의 것을 굴리거나 누군가 다른 사람의 것을 굴려 봐야 할 것입니다. 선형 대수학에서 약간 무거워 행운을 빈다.
1 단계 : 변환의 OpenGL 좌표에 UIKit 좌표에서 :이
이 일반적으로 두 가지를 포함한다 :
플립 Y 좌표, UIKit은 왼쪽 상단에 그 기원을 좋아하기 때문에, OpenGL은 왼쪽 하단에서 기원을 좋아합니다.
touchLocation.y = [[self view] bounds].size.height - touchLocation.y;
"화면 단위"에서 픽셀로 변환하십시오. 이렇게하면 표준 및 망막 디스플레이 장치간에 일관된 상태를 유지할 수 있습니다.
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));
이제 gluUnproject를 구현했습니다. 의사 코드에서 뷰포트 좌표는 1 단계 다음에 터치 된 화면 좌표입니까? 왜 먼거리에서 멀리 떨어진 곳에서 광선의 먼 지점이 계산됩니까? – Dave
@Dave 예, viewportcoord는 뷰포트의 탭 위치입니다. 나는 명확성을 위해 코드를 편집했다. 수학적으로 광선은 벡터 원점과 원점의 벡터 방향으로 정의됩니다. 따라서 "광선의 먼 점"은 절대 점이 아니며 가까운 점의 벡터이며 멀리있는 점을 가리키며 멀리있는 점으로 계산됩니다. –
내 솔루션이 완벽하지는 않지만 레이 좌표보다 내 레이 충돌 방정식과 관련이 있다고 생각합니다. 많은 도움을 준 make ray 부분을 설명해 주셔서 감사합니다. – Dave