iOS の OpenGL ES 1.1 では、以下を使用して視野を設定することにより、ピンチとズームを実装していました。
// 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];
}
}
ピンチ ジェスチャを使用すると、次のようになります。
// 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 matrix to project our 3D into 2D
glMatrixMode(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 matrix
glMatrixMode(GL_MODELVIEW);
}
シンプルな OpenGL ES 2.0 アプリケーションを作成しました。更新メソッドは (部分的に) 次のようになります。
#pragma mark - GLKView and GLKViewController delegate methods
- (void)update
{
// Set up the frustrum and projection matrix
float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);
self.effect.transform.projectionMatrix = projectionMatrix;
OpenGL ES 2.0 でこれを行う方法について Web を精査してきましたが、役に立ちませんでした。2.0でこれを行うにはどうすればよいですか?