我目前有一個UIView
,使用OpenGL在MKMapView
的頂部繪製雷達數據。由於雷達圖像的細節水平,OpenGL是必需的(CoreGraphics速度不夠快)。MKOverlayView和OpenGL
我正在繪製的所有圖像都保存在MKMapPoints
中。我通過標準CLLocationCoordinate2D
選擇它們,因爲它們的長度不取決於緯度。繪圖的基本方法是這樣的:
- 添加
GLView
爲MKMapView
的子視圖並設置GLView.frame = MKMapView.frame
。 使用
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);
將視口是使用
glViewport(0, 0, backingWidth, backingHeight)
其中backingWidth
和backingHeight
是點mapView
的大小合適的尺寸。- 使用
glDrawArrays
繪製。不確定這是否重要,但GL_VERTEX_ARRAY
和GL_TEXTURE_COORD_ARRAY
都在抽獎期間啓用。
使用這種方法,一切工作正常。繪圖按照它應該執行的方式執行。唯一的問題是因爲它是mapView
的子視圖(而不是覆蓋圖),雷達圖像繪製在任何其他MKAnnotations
和MKOverlays
之上。我需要在其他註釋和疊加層下繪製該圖層。
我試圖做的這個工作是使glView
自定義MKOverlayView
子視圖而不是mapView
。我所做的是給MKOverlay
boundingMapRect
MKMapRectWorld
並設置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
的子視圖相同的地方),但繪圖不再正常工作。當圖像出現時,它的尺寸不正確,而且不在正確的位置。我做了一個支票,並且backingWidth
和backingHeight
仍然是以點爲單位的大小(因爲它們應該是這樣)。
任何想法,爲什麼這不工作?
你確定你需要實時渲染雷達嗎?預渲染(例如,每幀包含一個PNG)不是一種選擇? – 2012-01-07 02:55:40
簡短的回答,沒有。有一些事情我正在做的數據(和更多的計劃在做更新),其中預渲染的圖像將無法正常工作。 – 2012-01-07 05:41:13