0

iOS アプリ ウィンドウの上部のナビゲーション バーと下部のツールバーの間に GLKView (OpenGL ES2.0) があります。UIPinchGestureRecognizer を使用してピンチ ズームを実装しましたが、かなりズームアウトすると、ビューが上部のナビゲーション バーを超えて表示されます。驚いたことに、ビューは下部のツールバーを超えていません。私が間違っているのだろうか。

私が使用しているビューポート設定は次のとおりです。

 glViewport(0, 0, self.frame.size.width, self.frame.size.height);

更新とピンチ ハンドラは次のとおりです。

-(void) update {    
       float aspect = fabsf(self.bounds.size.width / self.bounds.size.height);

    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f),aspect, 0.01f, 10.0f);
self.effect.transform.projectionMatrix = projectionMatrix;

    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -6.0f);
    modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, _rotMatrix);
    self.effect.transform.modelviewMatrix = modelViewMatrix;
}

-(IBAction) handlePinch: (UIPinchGestureRecognizer *)recognizer {
    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
    recognizer.scale = 1.0;
}
4

1 に答える 1

1

まず、組み込みのフレーム バッファを使用してglViewport描画するときに呼び出す必要はありません。描画メソッドを呼び出す前に (サブクラスで、またはビューのデリゲートから描画している場合) 、自動的に呼び出します。ただし、それはあなたの問題ではありません-それは単なる冗長な状態設定です(InstrumentsまたはXcode Frame Debuggerは、それらを使用するときにおそらく通知します)。GLKViewdrawRect:GLKViewglkView:drawInRect:

ビューのサイズを変更するのではなく、ビューのコンテンツを拡大したい場合は、それらのコンテンツの描画方法を変更する必要があります。幸いなことに、メソッド内で ModelView マトリックスと Projection マトリックスを既に調整しているため、これを行うための準備はすでに整っていますupdate。これらは、頂点がモデルからスクリーン空間に変換される方法を制御します。その変換の一部には、シーン内のオブジェクトがどれだけ近く/遠くに表示されるかに影響を与えるために調整できる「カメラ」の概念が含まれています。

3D レンダリング (実生活と同様) では、「ズーム」する方法が 2 つあります。

  • 見ているポイントにカメラを近づけたり遠ざけたりします。に使用している変換行列modelViewMatrixは、カメラの距離を設定するものです (これは、z現在固定しているパラメーターです-6.0)。ピンチ認識ハンドラーで距離を追跡/変更し、modelViewMatrixこの方法でズームする場合は作成時に使用します。

  • カメラの視野角を変更します。これは、実際のカメラでズーム レンズを調整したときに起こることです。これはprojectionMatrix(最初のパラメータで、現在は 65 度に固定されています) の一部です。ピンチ認識ハンドラーで視野角を追跡/変更し、projectionMatrixこの方法でズームする場合は作成時に使用します。

于 2013-10-31T17:05:54.617 に答える