我目前有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
的框架与设置投影的方式相同(因为{{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
的子视图的同一个地方),但图形不再正常工作。当图像出现时,它的大小不正确,而且位置不正确。我做了一次检查,backingWidth
和backingHeight
仍然是点数的视图大小(应该是这样)。
知道为什么这不起作用吗?
答案 0 :(得分:0)
我已经离开iphone太长时间以至于无法真正完全扫描你的代码了,但我似乎记得从前一段时间我在iPhone上打开Open GL时,我发现有必要保持自己的z -Index并简单地按顺序绘制项目...每个绘制操作都在3d中正确旋转,但稍后绘制的内容始终位于之前绘制的内容之上。我的一个早期测试程序在表面上画了一个网格,然后导致整个事情翻转。我的期望是,当物体的背面朝向我时,网格会消失,但它仍然可见,因为它是在稍后的单独操作中绘制的(IIRC)
我可能做错了会导致这个问题,但我的解决方案是按z索引排序。
您可以先使用第一种方法绘制图像吗?
答案 1 :(得分:0)
我认为您应该在设置投影模式之前设置视口。