OpenGL ES 2.0 Pincer et zoomer

Dans OpenGL ES 1.1 sur iOS, j'avais l'habitude d'implémenter le pincement et le zoom en réglant le Field Of View en utilisant ce qui suit:

// Handles Touches Events - (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender { static float startFOV=0.0; CGFloat factor = [(UIPinchGestureRecognizer *)sender scale]; UIGestureRecognizerState state; state=sender.state; if(state==UIGestureRecognizerStateBegan) { startFOV=[self getFieldOfView]; } else if(state==UIGestureRecognizerStateChanged) { float minFOV=5.0; float maxFOV=12.0; float currentFOV; currentFOV=startFOV*factor; if((currentFOV>=minFOV) && (currentFOV<=maxFOV)) [self setFieldOfView:currentFOV]; } } 

En utilisant le geste de pincement, je ferais quelque chose comme ceci:

 // Set the fulstrum and our field of view for the window -(void)setClipping { // Near and far are the front and back walls // FOV is in degrees float aspectRatio; const float zNear = .1; const float zFar = 2000; GLfloat size; float scale; // Get the main screen and define the aspect ratio CGRect frame = [[UIScreen mainScreen] bounds]; aspectRatio=(float)frame.size.width/(float)frame.size.height; scale=[[UIScreen mainScreen]scale]; // Use the 2D projection masortingx to project our 3D into 2D glMasortingxMode(GL_PROJECTION); glLoadIdentity(); if (m_FieldOfView > 75.0) { m_FieldOfView = 75.0; } size = zNear * tanf(GLKMathDegreesToRadians (m_FieldOfView) / 2.0); // Define the pyramid of Giza (4 sided pyramid with top lopped off on its side) // ... this is how were viewing things glFrustumf(-size, size, -size/aspectRatio, size/aspectRatio, zNear, zFar); glViewport(0, 0, frame.size.width*scale, frame.size.height*scale); // To be safe go back to tranformational masortingx glMasortingxMode(GL_MODELVIEW); } 

J'ai fait une simple application OpenGL ES 2.0 et ma méthode de mise à jour ressemble (partiellement) à ceci:

 #pragma mark - GLKView and GLKViewController delegate methods - (void)update { // Set up the frustrum and projection masortingx float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height); GLKMasortingx4 projectionMasortingx = GLKMasortingx4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); self.effect.transform.projectionMasortingx = projectionMasortingx; 

J'ai parcouru le web pour savoir comment faire cela avec OpenGL ES 2.0 … mais en vain. Comment est-ce que je fais ceci dans 2.0?

Multipliez le premier terme de GLKMasortingx4MakePerspective par un facteur (une propriété ou une variable de class) et modifiez ce facteur dans le programme de reconnaissance des gestes – pas trop différent de ce que vous faites dans votre méthode 1.1.

Voici la méthode que j'appelle de mon GestureRecogniser. Les variables commençant par _ sont des variables de class. ZOOMTOUCHSENSITIVITY est un préprocesseur défini.

 -(void)Scale:(UITapGestureRecognizer*)sender { CGFloat scale = _lastScale + (1.0 - [(UIPinchGestureRecognizer*)sender scale])*ZOOMTOUCHSENSITIVITY; float newScale = MAX(0.1, MIN(scale, 3)); _projectionMasortingx = GLKMasortingx4MakePerspective(newScale*GLKMathDegreesToRadians(45.0f), (float)_screenWidth/(float)_screenHeight, 100.0f, 1000.0f); if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { _lastScale = newScale; return; } } 

Notez comment j'économise la dernière valeur d' scale une fois le geste arrêté, de sorte que le zoom ne soit pas 'réinitialisé' à chaque fois.

En fait, je viens de find ce site, a eu un bon exemple: http://netwalk.be/article/render-3d-objects-opengl-es