Curlで読み込んで理解するKMZ/KMLの中身3Dモデルの中をCurlで歩いてみよう(3)(2/2 ページ)

» 2009年06月12日 00時00分 公開
[尾松秀紀株式会社ベーシック]
前のページへ 1|2       

読み込んだKMLデータをCurlで扱うには?

 kmlファイルの情報は、そのままでは利用できない点があります。

  1. 座標情報が緯度・経度で出力されている
  2. SketchUpでは、くり抜いたポリゴンや凹型ポリゴンを作成できるが、Curlのポリゴン情報は、これらをサポートしていない

 これらについての「Curl 3D Gallery」でのアプローチについて説明します。

座標系の変換

 kmlファイルの座標系は、緯度、経度で出力されていますので、この値を平面座標に変換する必要があります。変換には、kmlファイルのDocumentOriginの原点座標を基準としています。変換式は、以下のようになっています。

くり抜きポリゴン

 まず、くり抜きポリゴンの具体例を説明します。SketchUpにて、図1のような直方体を作成し【1】、内部に境界線を引き【2】、押し出しを行う【3】と、直方体の内部をくり抜いた形状が作成できます。

図1 【1】〜【3】の順でくり抜く 図1 【1】〜【3】の順でくり抜く

 【3】の水色の面が、くり抜きポリゴンです。kmlファイルでは、外形線のポリゴン情報とくり抜かれたポリゴン内部の情報となります。

Curl 3D Galleryでは、凹型ポリゴンは三角形に分割して扱う

 次に、凹型ポリゴンの具体例を説明します。こちらは、単純な凹形状【1】なのですが、Curlで表現すると頂点同士を直線で結ばれてしまうので、【2】のような形状になってしまいます。

図2 Curlで表現すると、頂点同士を直線で結ばれてしまう 図2 Curlで表現すると、頂点同士を直線で結ばれてしまう

 これらの問題を解決するために、Curl 3D Galleryでは、kmlファイルのポリゴンを三角形に分割し、Curlに取り込むようにしています。

Curl 3D Galleryでは、くり抜きポリゴンは一筆書きにして扱う

 Curlでは、くり抜きポリゴンをそのままでは表現できません。Curl 3D Galleryでは、こちらも三角形に分割して、三角形の集合として表現しています。三角形分割に際して、いったん、くり抜きポリゴンの外形線とくり抜き部を結ぶ直線を求めて、一筆書きで表せるポリゴン(*4)にしてから、三角形に分割しています。

*4:厳密には、求めた分割線を共有するポリゴンとなります

 一筆書きにすることで、厳密には辺の重なりがありますが、閉図形となり先の三角形分割の処理を呼び出しています。一筆書きにせずとも、くり抜き部分を考慮して三角形に分割することもできるのですが、処理が複雑になってしまうので、「一筆書きにする→三角形に分割」というように、処理を明確に分けて、少しでも分かりやすいソースコードになるようにしています。

 一筆書きにする場合は、外形線の任意の頂点とくり抜きポリゴンの任意の頂点の直線を仮定し、その直線が、外形線やくり抜きポリゴンと交わらない組み合わせを求めます。実際の処理は、UTIL\Geom.scurlのnormalization-inner-coords-subメソッドで行っていますが、総当たりで求めています。

 またモデルによって、くり抜きが複数存在する場合もあり得ますので、くり抜きポリゴン1つ1つについて処理を繰り返します。

図3 一筆書きにできますか? 図3 一筆書きにできますか?

 これで、くり抜きポリゴンが1つのポリゴンなりました。

三角形の分割をアルゴリズムで

 三角形の分割は、ポリゴンの隣同士の3つの頂点で三角形を作り、この三角形がポリゴンのほかの辺と交わらないかを判断します。

 交わらなければ、その三角形部分を除いたポリゴンで同様の処理を繰り返していきます。交わりがある場合は、1つ先の隣同士の3頂点で判断します。開始した頂点により分割できない場合もあるので、その場合は、処理開始の位置をずらして、すべてが三角形として切り出るまでを繰り返します。

図4 三角形の分割をアルゴリズムで繰り返す 図4 三角形の分割をアルゴリズムで繰り返す

 先のくり抜きポリゴンの場合は、以下のようになります。

図5 一例だが、このように分割される 図5 一例だが、このように分割される

 ソースは、UTIL\Geom.scurlのcalc-triangulation-polygonメソッドになるのですが、内部は、繰り返し処理や交わりを判断する交点計算処理などがあり、かなり複雑なアルゴリズムとなっていますが、これまでの説明を念頭に見れば、何となく理解できるのではないでしょうか?

難しい場合はデバッグ情報を見てみよう

 これまでの連載と比べて、急に難しい領域に入ってしまいましたが、がんばって解読してみてください。また、UTIL\Geom.scurlには、デバッグ情報を出力する「is-debug-XXX」という定数がありますので、必要な定数を、Trueに設定すれば、デバッグ出力されるので、手掛かりとなるのではないでしょうか?

 今回は、ここまでとします。次回は、曲面をきれいに表現するための法線ベクトル処理と移動操作などを実現するイベント処理を考えます。次回も、よろしくお願いします。

@IT関連記事

Google 3Dを使って、1日でゲームグラフィックを制作!
一撃デザインの種明かし(3) たった1日で簡単にできる3D。Google 3Dギャラリーで、斜めにオブジェクトを配置し、立体的に見せる「クォータービュー」グラフィックを制作しよう
デザインハックリッチクライアント 2009/5/18

Curlで始めるリッチクライアント
本連載では、リッチクライアント製品「Curl」の試用版を使って、その開発スタイルやCurl言語の特性、開発ツール、 GUIコンポーネントなどを検証していく

Web3Dがインターネットをリアルにする
Java/XMLが変えるWebのリアリティ(前編) Webに3次元を実現し、リアリティあるショッピングや芸術を楽しむ手段を提供しようという試みがある。それがWeb3Dだ
Java Solution」フォーラム 2001/7/19

Web3Dのトレンドを探る
Java/XMLが変えるWebのリアリティ(後編) Webに3次元のリアリティを実現しようとするWeb3D。後編では、Web3D 2001 Conferenceからそのトレンドを紹介
Java Solution」フォーラム 2001/8/3

プロフィール

尾松 秀紀(おまつ ひでき)

株式会社ベーシック(独立系受託ソフトウェア開発)所属。

Curlの開発暦は足かけ4年。「ほかの言語とは一味違ったところがあり、かなり魅力のある言語仕様」とは本人の弁。管理の傍ら、自ら新しい技術の積極的な習得を心がけている。
最近では、Curl Apps GalleryのCurl 3D Galleryを株式会社カールと共同開発。SourceForge.netにオープンソースとして公開。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。