2012-01-07 4 views
4

私は現在、OpenGLを使用してMKMapViewの上にレーダーデータを描画するUIViewを持っています。レーダー画像の詳細レベルのため、OpenGLが必要です(CoreGraphicsは十分に高速ではありません)。MKOverlayViewとOpenGL

私が描いている画像はすべてMKMapPointsに保存されています。長さが緯度に依存しないので、私は標準CLLocationCoordinate2D以上でそれらを選択します。

  1. MKMapViewのサブビューとしてGLViewを追加し、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. backingWidthbackingHeightポイントにおけるmapViewの大きさglViewport(0, 0, backingWidth, backingHeight)を使用して、正しいサイズであることがビューポートを設定します。

  4. glDrawArraysを使用して描画します。これが重要かどうかは不明ですが、描画中にGL_VERTEX_ARRAYGL_TEXTURE_COORD_ARRAYが有効になっています。

この方法を使用すると、すべて正常に動作します。作図は想定通りに行われます。唯一の問題は、mapView(オーバーレイではない)のサブビューであるため、レーダー画像は他のMKAnnotationsMKOverlaysの上に描画されます。このレイヤーを他の注釈やオーバーレイの下に描画する必要があります。

この作業を行うために私が試みたのは、の代わりにMKOverlayViewというカスタムのサブビューをglViewにすることでした。私がしたことMKOverlayMKMapRectWorldboundingMapRectを与え、(MKOverlayViewのフレームはMKMapPointsなくCGPointsによって決定されるので)私は投影を設定glView同様のフレームを設定しました。もう一度、コードはここにあります。

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はまだポイントのビューのサイズです(そうする必要があります)。

これはなぜ機能しないのでしょうか?

+0

本当にレーダーをリアルタイムでレンダリングする必要がありますか?オプションではなく、プレレンダリング(すべてのフレームにPNGを含むものなど)ですか? –

+0

短い答え、いいえ。あらかじめレンダリングされたイメージが機能しない場合、データを使ってやっていることがいくつかあります。 –

答えて

0

私は、私は私自身を維持するために必要であることがわかった本当に完全にあなたのコードを完全に理解が、私は、私はいくつかの時間前にiPhone上のオープンGLで台無しときから思い出すように見えるには長すぎるためにiphoneから離れてきましたZインデックスと単純にその順序で項目を描画...各描画操作が正しく3dに回転しますが、後に描かれた何かが以前描か何かの上に常にだったが起こりました。私の初期のテストプログラムの1つは、表面にグリッドを描き、全体を反転させました。私の期待は、オブジェクトの背面が私に面していたときにグリッドが消えてしまうことでしたが、別の操作(IIRC)で後で描画されたために目に見えていました

問題を引き起こしたしかし、私の解決策は私のドローをazインデックスで注文することでした。

最初の方法で画像を最初に描画できますか?

+0

私はこれが問題だとは思わない。私は1つのことを描いているだけで、2D図面です。 –

+0

おそらく、あなたは2つのものを描く必要があります...恐らく、スクリーンのサイズの矩形にテクスチャ(レーダー付き)を置くことができますか? http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-part-6_25.html ...あなたが望む順序でそれらを描くことができます。 – Gus

+0

これは私が今やっていることです。私が問題を抱えている部分は、それをMKOverlayViewにカプセル化しています。 –

0

プロジェクションモードを設定する前に、ビューポートを設定する必要があると思います。

+0

それはどちらも機能していないようです。私はglLoadIdentity()の直前とglLoadIdentity()とglOrthof()の間でそれを試してみました。 –

関連する問題