2013-02-05 5 views
4

여기에서 OpenGL ES를 처음 사용합니다. 다음 코드를 사용하여 GLKView (OpenGL ES 2.0)에서 탭한 부분을 감지합니다. 내 OpenGL 그려진 개체를 만진 경우 알고 싶습니다. 그것은 모두 2D입니다. 겉보기에 -1.0에서 1.0을 기준으로 OpenGL ES 2.0 좌표를 얻는 좌표를 어떻게 변환합니까? 이미 그렇게 할 수있는 기능이 내장되어 있습니까?iOS TouchBegan 좌표를 OpenGL ES 좌표로 변환

감사합니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGRect bounds = [self.view bounds]; 

    UITouch* touch = [[event touchesForView:self.view] anyObject]; 

    CGPoint location = [touch locationInView:self.view]; 

    NSLog(@"x: %f y: %f", location.x, location.y); 

} 
+2

나는 이것을 할 수있다 : * x = ((* x/(bounds.size.width)) * 2.0) - 1.0; * y = (((bounds.size.height- * y)/(bounds.size.height)) * 2.0) - 1.0; 하지만이 작업을 자주 보는 것은 내장 함수가 있습니까? – lppier

답변

2

-1은 클리핑 공간입니다. 화면에 표시 될 때 좌표 공간이 클리핑 공간에있는 경우 프로젝션 행렬을 사용하여 공간을 변환하는 것을 잊었다 고 말하고 싶습니다. GLKBaseEffect을 사용하는 경우 (나중에 메모리 누수가 발생하기 때문에 나중에 권장하지 않음) <baseEffect>.transform.projectionMatrix을 올바르게 변환해야합니다. 예를 들어,

GLKBaseEffect* effect = [[GLKBaseEffect alloc] init]; 
GLKMatrix4 projectionMatrix = GLKMatrix4MakeOrtho(0, <width>, 0, <height>, 0.0f, 1.0f); 
self.effect.transform.projectionMatrix = projectionMatrix; 

widthheight 장치의 화면/당신의 GLKView/등의 폭과 높이가 될 것입니다. 이 값은 전달 된 좌표에 자동으로 적용되어 x 축에 0에서 <width>, y 축에서 0에서 <height> 범위의 일반 좌표를 사용할 수 있으며, 원점은 화면의 왼쪽 하단에 있습니다.

내가 사용 유니폼으로 투영 행렬에 전달할 수 있습니다 후 나는 같은 사용자 정의 쉐이더를 사용하는 경우 : glUniformMatrix4fv(shaderLocations.projectionMatrix,1,0,projection.m)

projection 행렬과

shaderLocations.projectionMatrix가 균일 이름에 대한 식별자입니다, 그들은 말한다. 그런 다음 위치를 투영 행렬로 곱해야합니다.

수동으로 행렬을 전달하거나 GLKBaseEffect에 올바른 속성을 설정하여 클리핑 공간을 변환하면 OpenGL 공간과 UIKit 공간 간의 유일한 차이는 y 축이 뒤집혀 있다는 것입니다. 나는 touches 메서드와 제스처 인식기를 통해받은 터치를 이와 같이 변환합니다.

질문이 있지만 분명히 OpenGL을 처음 사용하는 사람이라면 명확히하기 위해 최선을 다할 것입니다. :)

+0

안녕하세요, 자세한 설명 주셔서 감사합니다. 위의 touchesBegan 코드 함수에서 projectionMatrix를 어떻게 사용합니까? 화면에서 OpenGL 그리기의 경계 내에서 터치가 발생했는지 확인하고 싶습니다. 또한 GLKBaseEffect에 대한 경고를 받으면 메모리 누수를 검사하기 위해 계측기를 실행했습니다. 얼마 지나지 않아서 애플이 아이폰 OS 6.1에서 수정했을 수도있다. – lppier

+0

@Ippier 'touchesBegan'에서 투영 행렬을 사용하지 않습니다. 위에 명시된 코드를 사용하여 기본 효과에 투영 행렬을 설정합니다. 보통 'viewDidLoad'처럼'GLKBaseEffect'를 만들 때마다 이것을합니다. 그것은 여러분이 클리핑 공간 좌표를 다루지 못하도록하고'GLKBaseEffect'가 렌더 할 때 화면 좌표를 클리핑 공간으로 변환하도록합니다. 예를 들어, 풍경 용 iPhone의 중심 객체는 기괴한 {0.0,0.0} 대신에 {240,180}의 위치를 ​​갖습니다. 또한 GLKBaseEffect에 관해서는, GLKBaseEffect를 수정했을 수도 있습니다. – Metabble

+0

제가보기에 - 이것은 스크린에서 그리기 위해, GLKBaseEffect에 projectionMatrix를 적용한 후에, 이제는 보통 좌표 {240, 180}을 사용한다는 것을 의미합니까? – lppier

관련 문제