Curlで読み込んで理解するKMZ/KMLの中身:3Dモデルの中をCurlで歩いてみよう(3)(1/2 ページ)
3Dモデルを簡単に作れるGoogle SketchUpで家を建て、その中をCurl 3D Galleryで歩き、3Dプログラミングを学ぶ連載です
Google SketchUpをCurlアプリで読み込もう
もう、連載はなくなったのかと思わせるほどの間が空いてしまいましたが、連載の3回目をお送りします。前回の「3Dモデリング建築内を歩けるCurl 3D Galleryとは?」では、Curl開発環境のセットアップから、第1回の「3Dモデルを簡単に作れるGoogle SketchUp超入門」で作成したモデルデータを読み込んで、取りあえず、開発環境ができるところまでをお伝えしました。
今回からは「Curl 3D Gallery」の内部処理のお話に入っていきます。今回の内容は、Google SketchUp(以下、SketchUp)データの読み込みということで、次の2点についてお送りします。
- SketchUpファイル(XML形式ファイル)の読み込み
- 読み込んだモデルデータを扱いやすい内容に加工する
Curl自体の詳細を知りたい方は、記事「いまさら聞けない「Curl」入門(お菓子じゃない方)」を参照しておいてください。
SketchUpファイル(kmz)の中身はどうなっている?
前回では、さらりと流していましたが、今回取り扱うファイルは、SketchUpでエクスポートした「Google Earth(*.kmz)」(*1)という形式です。
*1:「Google Earth 4(*.kmz)」というエクスポート形式もありますが、こちらはバージョンが異なり内部構造もまったく違うので、間違えないようにお願いします
kmz形式のファイルは、ZIP形式で圧縮されたファイルとなっています。拡張子を.zipに変えて、お手持ちの解凍ツールで展開してみてください。「doc.kml」というファイルが展開されたと思います。このdoc.kmlファイルが、今回読み込む対象となるモデルデータになります。
kmlファイルの仕様については、グーグルのサイトで、リファレンスやチュートリアルを参照できます。今回のkmzファイルはkmlのバージョン2.0ですが、内容の把握には問題はありません。
「Curl 3D Gallery」にて取り扱う主要な部分の構造は、以下のようになっています。
今回のkmzファイルでは、座標情報、および、色情報のみで、SketchUpで張り付けたイメージファイルは、含まれていません(*2)。イメージ情報は、Placemarkタグ内のstyleUrlタグにポリゴン情報の色情報が格納されているのですが、そのstyleUrlのID名称がイメージファイル名となっています。
*2:「Google Earth 4(*.kmz)」では、doc.kmlは位置情報のみであり、モデル情報は「models\xxxxx.dae」というファイルに収められています。「COLLADA」という3Dモデルデータフォーマット形式で、イメージファイルも含まれ、より再現性の高い情報が提供されています
今回は、別途SketchUpからイメージ情報を取り出し、ファイル化して使用するようにしています(*3)。また、座標情報はkml形式であるため、緯度や経度で格納されています。後述するXYZ軸の直交座標系にするための変換処理が必要となります。
*3:イメージのファイル化に関しては、Curl Developer Centerの「Google SketchUpから Curl 3D Galleryへファイルを読み込む方法」記事の最後に、「もっときれいに再現するために」という部分に記述されています
styleUrlのID名称は、ファイル化されたイメージファイル名と一致しない場合があるので、その際はイメージファイル名をstyleUrlのID名称に変更する必要があります。なお、各タグの詳細やkmlの構造などについては、kmlのリファレンスを参照願います。
次は、CurlでのXMLファイルの扱い方を説明します。
CurlでXMLを扱うSAXインターフェイス
Curlには、標準でSAX(Simple API for XML)インターフェイスが実装されており、手軽にXMLパーサーを開発できます。CurlのSAX実装は、Java SAX 2.0 APIをCurl言語にマッピングしており、メソッド名こそ、Curl言語の命名規則となっていますが、クラス名はJava SAXのクラス名と同じです。Javaでのプログラミング経験があれば、抵抗なく理解できるでしょう。
なおSAXについては、以下の記事参照してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
それでは、「Curl 3D Gallery」での実装例に沿って、XMLデータの読み込み処理を説明していきます。スペースの都合上、詳細の処理は割愛しますが、実装ソースやキーワードとなる主な情報を記述しておくので、Curlヘルプドキュメントの「SAX XML インターフェイスの使用」「DefaultHandler(クラス)」や後述する参照URLなどの情報を参照すれば、より深く理解できます。
XMLデータの読み込みは、MODEL\ObjectManager.scurlファイルのread-model-from-fileメソッドで行っています。
XMLファイルの内部処理は、DefaultHandlerを継承したGeometryHandlerクラスで行っています。GeometryHandlerクラスは、KML\kml-parser.scurlに実装されています。GeometryHandlerクラスでは、以下の5つのXML構造分析イベントに対するメソッドを実装しています。
- start-document:ドキュメントの開始
- end-document:ドキュメントの終了
- start-element:タグ要素の開始
- end-element:タグ要素の終了
- characters:文字データ
ここで重要なのは、start-element(タグ要素の開始)、end-element(タグ要素の終了)、characters(文字データ)の3つのメソッドです。SAXではXML文書を解析しながら、タグ要素の開始、タグ要素の終了、文字データといったイベントを発生させ、実装したメソッドが呼び出されるようになっています。以下にメソッドの引数を説明します。
各メソッドでは、どの要素の開始なのか、どの要素の終了なのかなどを判断しながら、XML文章をデータ化し、GeometryHandlerクラスに蓄えていきます。各タグ要素情報のクラスは、KML\kml-objects.scurlに実装されています。
例えば、引数の内容のみをデバッグ表示するようなクラスを生成して実装してみると、どのようなタイミングでメソッドが呼び出されるのかを把握できると思います。
次ページでは、実際に読み込んだKMLデータをCurlで扱うためのコツを教えます。図形パズルが好きな方はぜひ読んでみてください。
Copyright © ITmedia, Inc. All Rights Reserved.