2013-11-26 2 views
0

У меня есть код ниже, который я использую для трассировки лучей. Код работает успешно на не-сетчатых iPads, однако не работает на сетчатке iPads. Прикосновение обнаружено, однако преобразованная точка выключена влево и внизу, где она должна быть. Может ли кто-нибудь предложить, как я могу обновить ниже, чтобы разместить экран сетчатки?Обновление OpenGL ES Touch Detection (Ray Tracing) для iPad Retina?

- (void)handleTap: (UITapGestureRecognizer *)recognizer 
{ 

    CGPoint tapLoc = [recognizer locationInView:self.view]; 

    bool testResult; 

    GLint viewport[4]; 
    glGetIntegerv(GL_VIEWPORT, viewport); 

    float uiKitOffset = 113; //Need to factor in the height of the nav bar + the height of the tab bar at the bottom in the storyboard. 

    GLKVector3 nearPt = GLKMathUnproject(GLKVector3Make(tapLoc.x, (tapLoc.y-1024+uiKitOffset)*-1, 0.0), modelViewMatrix, projectionMatrix, &viewport[0] , &testResult); 

    GLKVector3 farPt = GLKMathUnproject(GLKVector3Make(tapLoc.x, (tapLoc.y-1024+uiKitOffset)*-1, 1.0), modelViewMatrix, projectionMatrix, &viewport[0] , &testResult); 

    farPt = GLKVector3Subtract(farPt, nearPt); 

    for (Object * Object in self.objectArray) { 

     ... 

} 

ответ

2

Просто умножить й и у tapLoc на [UIScreen] В начале .scale и 1024 * [UIScreen В начале] .scale или заменить видовой [3]

Я думаю, что-то вроде:

- (void)handleTap: (UITapGestureRecognizer *)recognizer 
{ 

    CGPoint tapLoc = [recognizer locationInView:self.view]; 
    tapLoc.x *= [UIScreen mainScreen].scale; 
    tapLoc.y *= [UIScreen mainScreen].scale; 

    bool testResult; 

    GLint viewport[4]; 
    glGetIntegerv(GL_VIEWPORT, viewport); 

    float uiKitOffset = 113; //Need to factor in the height of the nav bar + the height of the tab bar at the bottom in the storyboard. 

    GLKVector3 nearPt = GLKMathUnproject(GLKVector3Make(tapLoc.x, (tapLoc.y-viewport[3]+uiKitOffset)*-1, 0.0), modelViewMatrix, projectionMatrix, &viewport[0] , &testResult); 

    GLKVector3 farPt = GLKMathUnproject(GLKVector3Make(tapLoc.x, (tapLoc.y-viewport[3]+uiKitOffset)*-1, 1.0), modelViewMatrix, projectionMatrix, &viewport[0] , &testResult); 

    farPt = GLKVector3Subtract(farPt, nearPt); 

    .... 
} 
+0

Спасибо, надеюсь, проведут для iPad Air. – GuybrushThreepwood

+0

@Ohnomycoco уверен, iPad 3/4 и iPad air и iPad mini retina имеют одинаковое разрешение экрана, этот код будет работать даже на iPhone без каких-либо проблем. Потому что я заменил ваш 1024 на видовом экране [3], в котором хранится высота GL-контекста. проверить glViewport http://www.opengl.org/sdk/docs/man/xhtml/glViewport.xml – SAKrisT