我目前有一个UIView
,可使用OpenGL在MKMapView
上方绘制雷达数据。由于雷达图像中的细节级别,因此需要OpenGL(CoreGraphics不够快)。
我正在绘制的所有图像都保存在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
仍然是视图的大小(以磅为单位)。知道为什么这行不通吗?
最佳答案
我离开iphone的时间已经太久了,无法真正完全了解您的代码,但是我似乎回想起前一段时间在iPhone上使用Open GL时遇到的麻烦,我发现有必要维护自己的z-Index和只需按此顺序绘制项目...每个绘制操作都会在3d中正确旋转,但是稍后绘制的对象始终位于较早绘制的对象之上。我的一个早期测试程序之一在表面上绘制了一个网格,然后使整个事物翻转。我的期望是,当对象的背面面向我时,网格会消失,但是它仍然可见,因为稍后是在单独的操作(IIRC)中绘制的
我可能做错了什么导致了该问题,但我的解决方案是按z索引对绘制进行排序。
您可以先使用第一种方法绘制图像吗?