2012-01-07 59 views
4

我目前有一個UIView,使用OpenGL在MKMapView的頂部繪製雷達數據。由於雷達圖像的細節水平,OpenGL是必需的(CoreGraphics速度不夠快)。MKOverlayView和OpenGL

我正在繪製的所有圖像都保存在MKMapPoints中。我通過標準CLLocationCoordinate2D選擇它們,因爲它們的長度不取決於緯度。繪圖的基本方法是這樣的:

  1. 添加GLViewMKMapView的子視圖並設置GLView.frame = MKMapView.frame
  2. 使用GLOrthof,將GLView的投影設置爲等於地圖的當前可見MKMapRect。這是執行此操作的代碼。

    CLLocationCoordinate2D coordinateTopLeft = 
        [mapView convertPoint:CGPointMake(0, 0) 
          toCoordinateFromView:mapView]; 
    MKMapPoint pointTopLeft = MKMapPointForCoordinate(coordinateTopLeft); 
    
    CLLocationCoordinate2D coordinateBottomRight = 
        [mapView convertPoint:CGPointMake(mapView.frame.size.width, 
                 mapView.frame.size.height) 
          toCoordinateFromView:mapView]; 
    MKMapPoint pointBottomRight = MKMapPointForCoordinate(coordinateBottomRight); 
    
    glLoadIdentity(); 
    glOrthof(pointTopLeft.x, pointBottomRight.x, 
         pointBottomRight.y, pointTopLeft.y, -1, 1); 
    
  3. 將視口是使用glViewport(0, 0, backingWidth, backingHeight)其中backingWidthbackingHeight是點mapView的大小合適的尺寸。

  4. 使用glDrawArrays繪製。不確定這是否重要,但GL_VERTEX_ARRAYGL_TEXTURE_COORD_ARRAY都在抽獎期間啓用。

使用這種方法,一切工作正常。繪圖按照它應該執行的方式執行。唯一的問題是因爲它是mapView的子視圖(而不是覆蓋圖),雷達圖像繪製在任何其他MKAnnotationsMKOverlays之上。我需要在其他註釋和疊加層下繪製該圖層。

我試圖做的這個工作是使glView自定義MKOverlayView子視圖而不是mapView。我所做的是給MKOverlayboundingMapRectMKMapRectWorld並設置glView的框架與我設置投影的相同方式(因爲MKOverlayView的框架由MKMapPoints而不是CGPoints確定)。再次,這裏是代碼。

CLLocationCoordinate2D coordinateTopLeft = 
    [mapView convertPoint:CGPointMake(0, 0) 
      toCoordinateFromView:mapView]; 
MKMapPoint pointTopLeft = MKMapPointForCoordinate(coordinateTopLeft); 

CLLocationCoordinate2D coordinateBottomRight = 
    [mapView convertPoint:CGPointMake(mapView.frame.size.width, 
             mapView.frame.size.height) 
      toCoordinateFromView:mapView]; 
MKMapPoint pointBottomRight = MKMapPointForCoordinate(coordinateBottomRight); 

glRadarView.frame = CGRectMake(pointTopLeft.x, pointTopLeft.y, 
           pointBottomRight.x - pointTopLeft.x, 
           pointBottomRight.y - pointTopLeft.y); 

當我做到這一點,glView正確定位的畫面(即是當它是mapView的子視圖相同的地方),但繪圖不再正常工作。當圖像出現時,它的尺寸不正確,而且不在正確的位置。我做了一個支票,並且backingWidthbackingHeight仍然是以點爲單位的大小(因爲它們應該是這樣)。

任何想法,爲什麼這不工作?

+0

你確定你需要實時渲染雷達嗎?預渲染(例如,每幀包含一個PNG)不是一種選擇? – 2012-01-07 02:55:40

+0

簡短的回答,沒有。有一些事情我正在做的數據(和更多的計劃在做更新),其中預渲染的圖像將無法正常工作。 – 2012-01-07 05:41:13

回答

0

我已經遠離iphone太長時間才能真正完全理解你的代碼,但是我似乎回想起前一段時間我在iPhone上與Open GL搞砸時,發現有必要維護我自己的z-Index並簡單地按照該順序繪製項目......每個繪製操作都是在3D中正確旋轉的,但稍後繪製的東西總是在先前繪製的東西之上。我的一個早期測試程序在表面畫了一個網格,然後導致整個事情翻轉。我的期望是,當物體的背面朝向我時,網格會消失,但它仍然可見,因爲它稍後在單獨的操作中被繪製(IIRC)

這可能是我做錯了導致這個問題的原因,但我的解決方案是通過az索引來繪製我的繪圖。

您可以先使用第一種方法繪製圖像嗎?

+0

我不認爲這是問題。我只繪製一件東西,它是2D繪圖。 – 2012-01-31 03:18:51

+0

所以也許你需要繪製2個東西......也許你可以把一個紋理(與雷達)放在一個矩形的屏幕上嗎? http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-part-6_25.html ...然後你可以按你想要的順序繪製它們。 – Gus 2012-01-31 18:32:26

+0

這就是我現在正在做的,它的工作原理。我遇到麻煩的部分是將其封裝到MKOverlayView中。 – 2012-02-01 18:03:46

0

我認爲你應該在設置投影模式之前設置視口。

+0

這似乎也沒有工作。我在glLoadIdentity()之前以及glLoadIdentity()和glOrthof()之間嘗試過。 – 2012-02-01 17:59:59