【问题标题】:MKOverlayView and OpenGLMKOverlayView 和 OpenGL
【发布时间】:2012-01-07 00:29:08
【问题描述】:

我目前有一个 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) 将视口设置为正确的大小,其中backingWidthbackingHeightmapView 的大小(以磅为单位)。

  4. 使用glDrawArrays 绘制。不确定这是否重要,但GL_VERTEX_ARRAYGL_TEXTURE_COORD_ARRAY 在抽奖期间都启用了。

使用此方法,一切正常。绘图按预期进行。唯一的问题是因为它是mapView 的子视图(而不是覆盖),雷达图像被绘制在任何其他MKAnnotationsMKOverlays 之上。我需要将此图层绘制在其他注释和叠加层下。

我试图做的是让glView 成为自定义MKOverlayView 的子视图,而不是mapView。我所做的是给MKOverlay 一个boundingMapRectMKMapRectWorld 并设置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 仍然是视图的大小(应该是)。

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

【问题讨论】:

  • 您确定需要实时渲染雷达吗?预渲染(例如,每一帧都包含一个 PNG)不是一种选择吗?
  • 简答,不。我正在对数据做一些事情(我计划在更新中做更多事情),而预渲染的图像将无法正常工作。

标签: iphone opengl-es mkmapview


【解决方案1】:

我已经离开 iphone 太久了,无法真正完全理解你的代码,但我似乎记得前段时间我在 iPhone 上搞砸 Open GL 时,我发现有必要维护我自己的 z - 索引并按该顺序简单地绘制项目......每个绘制操作都发生在 3d 中正确旋转,但后来绘制的东西总是在之前绘制的东西之上。我早期的一个测试程序在表面上画了一个网格,然后使整个物体翻转。我的期望是,当对象的背面面向我时,网格会消失,但它仍然可见,因为它是稍后在单独的操作中绘制的 (IIRC)

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

可以先用第一种方法画图吗?

【讨论】:

  • 我不认为这是问题所在。我只画一件事,它是一个 2D 绘图。
  • 所以也许你需要画两件东西……也许你可以把一个纹理(用雷达)放在一个屏幕大小的矩形上? iphonedevelopment.blogspot.com/2009/05/… ...然后你可以按照你想要的顺序来绘制它们。
  • 这就是我现在正在做的事情,并且有效。我遇到问题的部分是将其封装到 MKOverlayView 中。
【解决方案2】:

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

【讨论】:

  • 这似乎也不起作用。我之前尝试过直接在 glLoadIdentity() 之前以及 glLoadIdentity() 和 glOrthof() 之间使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多