MKOverlayView и OpenGL - PullRequest
       1

MKOverlayView и OpenGL

4 голосов
/ 07 января 2012

В настоящее время у меня есть UIView, который рисует радиолокационные данные поверх MKMapView с использованием OpenGL. Из-за уровня детализации изображения радара требуется 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), где backingWidth и backingHeight - это размер mapView в точках.

  4. Нарисуйте, используя glDrawArrays. Не уверен, что это имеет значение, но GL_VERTEX_ARRAY и GL_TEXTURE_COORD_ARRAY оба включены во время розыгрыша.

При использовании этого метода все работает нормально. Рисунок выполняется так, как и должно быть. Единственная проблема состоит в том, что, поскольку это подпредставление mapView (а не наложение), радиолокационное изображение рисуется поверх любых других MKAnnotations и MKOverlays. Мне нужно, чтобы этот слой был нарисован под другими аннотациями и наложениями.

Я попытался сделать так, чтобы glView было подпрограммой пользовательского MKOverlayView вместо mapView. Я дал MKOverlay a 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 по-прежнему имеют размер представления в точках (как и должно быть).

Есть идеи, почему это не работает?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

Я думаю, что вы должны просто установить область просмотра перед установкой режима проецирования.

0 голосов
/ 31 января 2012

Я слишком долго был вдали от iphone, чтобы по-настоящему ухватить ваш код, но, похоже, я вспоминаю, что когда я некоторое время назад связывался с Open GL на iPhone, я обнаружил, что необходимо поддерживать свой собственный z -Индексировать и просто рисовать элементы в таком порядке ... Каждая операция рисования происходила повернутой в 3d правильно, но что-то нарисованное позже всегда было поверх чего-то нарисованного ранее. Одна из моих ранних программ тестирования нарисовала сетку на поверхности, а затем заставила все это перевернуться. Я ожидал, что сетка исчезнет, ​​когда задняя часть объекта будет обращена ко мне, но она осталась видимой, потому что была нарисована позже в отдельной операции (IIRC)

Возможно, я делал что-то не так, что вызвало эту проблему, но я решил упорядочить мои розыгрыши по z-индексу.

Можете ли вы нарисовать изображение первым, используя ваш первый метод?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...