2013-10-28 62 views
0

我在頂部導航欄和iOS應用程序窗口底部的工具欄之間有一個GLKView(OpenGL ES2.0)。我已經使用UIPinchGestureRecognizer實現了縮放縮放,但是當我縮小很大程度時,我的視圖會在頂部導航欄上運行。令人驚訝的是,這個視圖並沒有穿過底部的工具欄。不知道我做錯了什麼。GLKView放大導航欄

下面是我使用的視口設置:

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; 
} 
+0

您是否真的想要捏合手勢來轉換視圖 - 即繪製GL內容的矩形?還是希望它縮放視圖的內容? – rickster

+0

嗨@rickster,我只想放大視圖的內容。我沒有正確處理它嗎? – user1102412

回答

1

首先,GLKView繪圖時,你不需要調用glViewport到它的內置幀緩衝區 - 它在你調用你的繪圖方法之前自動爲你做(drawRect:GLKView子類,或glkView:drawInRect:,如果你正在從vi ew的代表)。這不是你的問題,但它只是冗餘的狀態設置(當你使用它們時,Instruments或Xcode Frame Debugger可能會告訴你)。

如果要放大視圖的內容而不是調整視圖的大小,則需要更改如何繪製這些內容。幸運的是,您已經設置好了,因爲您已經在您的update方法中調整了模型視圖和投影矩陣。這些控制頂點如何從模型轉換到屏幕空間 - 並且這種轉換的一部分包括一個「相機」的概念,您可以調整以影響場景中物體的近/遠距離。

在3D渲染(如在現實生活中),有兩種方法可以「放大」:

  • 移動相機,接近/遠離點它看着。您用於modelViewMatrix的翻譯矩陣是設置相機距離的參數(它是您當前已經修復的z參數-6.0)。如果您想以這種方式進行縮放,請在夾點識別器處理程序中跟蹤/更改距離,並在創建modelViewMatrix時使用它。

  • 更改相機的視角 - 這是在真實相機上調整變焦鏡頭時發生的情況。這是projectionMatrix(第一個參數,目前固定在65度)的一部分。如果要以這種方式進行縮放,請在夾點識別器處理程序中跟蹤/更改視場角並在創建projectionMatrix時使用它。