MKOverlayView和OpenGL

时间:2012-01-07 00:29:09

标签: iphone opengl-es mkmapview

我目前有UIView使用OpenGL在MKMapView之上绘制雷达数据。由于雷达图像的细节水平,需要OpenGL(CoreGraphics不够快)。

我正在绘制的所有图像都保存在MKMapPoints中。我选择它们超过标准CLLocationCoordinate2D,因为它们的长度不依赖于纬度。绘图的基本方法是:

  1. GLView添加为MKMapView的子视图,并设置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的大小。

    < / LI>
  4. 使用glDrawArrays绘制。不确定这是否重要,但在抽奖期间GL_VERTEX_ARRAYGL_TEXTURE_COORD_ARRAY都已启用。
  5. 使用此方法,一切正常。绘图按照预期执行。唯一的问题是因为它是mapView的子视图(而不是叠加层),雷达图像绘制在任何其他MKAnnotationsMKOverlays之上。我需要在其他注释和叠加层下绘制此图层。

    我尝试做的是让glView成为自定义MKOverlayView的子视图,而不是mapView。我所做的是给MKOverlay boundingMapRect MKMapRectWorld glView并设置MKOverlayView的框架与设置投影的方式相同(因为{{1}的框架}由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仍然是点数的视图大小(应该是这样)。

    知道为什么这不起作用吗?

2 个答案:

答案 0 :(得分:0)

我已经离开iphone太长时间以至于无法真正完全扫描你的代码了,但我似乎记得从前一段时间我在iPhone上打开Open GL时,我发现有必要保持自己的z -Index并简单地按顺序绘制项目...每个绘制操作都在3d中正确旋转,但稍后绘制的内容始终位于之前绘制的内容之上。我的一个早期测试程序在表面上画了一个网格,然后导致整个事情翻转。我的期望是,当物体的背面朝向我时,网格会消失,但它仍然可见,因为它是在稍后的单独操作中绘制的(IIRC)

我可能做错了会导致这个问题,但我的解决方案是按z索引排序。

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

答案 1 :(得分:0)

我认为您应该在设置投影模式之前设置视口。