我目前有一个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)将视口设置为正确的大小,其中backingWidthbackingHeightmapView的大小(以磅为单位)。
使用glDrawArrays绘制。不知道这是否重要,但是在绘制过程中同时启用了GL_VERTEX_ARRAYGL_TEXTURE_COORD_ARRAY


使用此方法,一切正常。绘图按预期执行。唯一的问题是,由于它是mapView的子视图(而不是覆盖图),因此雷达图像绘制在任何其他MKAnnotationsMKOverlays的顶部。我需要在其他注释和覆盖下绘制该层。

为了使此工作有效,我要做的是使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的子视图相同的位置),但是图形不再正常工作。当图像出现时,它的尺寸不合适,位置也不正确。我做了检查,backingWidthbackingHeight仍然是视图的大小(以磅为单位)。

知道为什么这行不通吗?

最佳答案

我离开iphone的时间已经太久了,无法真正完全了解您的代码,但是我似乎回想起前一段时间在iPhone上使用Open GL时遇到的麻烦,我发现有必要维护自己的z-Index和只需按此顺序绘制项目...每个绘制操作都会在3d中正确旋转,但是稍后绘制的对象始终位于较早绘制的对象之上。我的一个早期测试程序之一在表面上绘制了一个网格,然后使整个事物翻转。我的期望是,当对象的背面面向我时,网格会消失,但是它仍然可见,因为稍后是在单独的操作(IIRC)中绘制的

我可能做错了什么导致了该问题,但我的解决方案是按z索引对绘制进行排序。

您可以先使用第一种方法绘制图像吗?

10-07 19:48