上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ]
スポンサー広告 |
トラックバック(-) |
コメント(-)
ひさしぶりです。いつものとおり放置気味でした。 あいかわらずいろいろとネタはためています。 さて、今回はGoogle社のKMLコンテストについて。 こちらのページから情報が確認できますが、KMLを使ったアカデミックなネタのコンテストが開催されています。締め切りは12/1まで。優勝するとハンディーGPSやらiPodタッチやらがもらえるそうです。 せっかくなので今やってる研究に絡めて応募する予定です。 小型自律飛行機で収集した上空からの情報をGoogle Earhに統合するっていうデモ。作ったらブログでも公開する予定です。
Google Earth APIを使ったドライブシミュレーションゲームのMonster Milk Truckですが、GoogleからApache License, Version 2.0に基づいてフリーで公開されています。そこで、Google Earth APIの サンプルページから、javascriptとHTMLのソースをダウンロードしてきて、ソースを改変してみました。具体的には以下の画像のようにGoogle Maps APIを使った地図と、車のバックミラーみたいな後ろ向きのカメラをつけてみました。 (以下のソースはApache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 に基づいています)  実際のGoogle Earth APIのサンプルは以下から。別ウインドで開きます。(Google Earth Plug-inをインストールしている必要があります。IE7とFirefox3では一応動作を確認しました。動かないときはブラウザの更新ボタンを押してみて下さい。) ******************************************* →→→→→ Monster Milktruck(地図付)←←←←← ******************************************* 右上のGoogle MAPの中心にトラックの小さいアイコンが表示されて、トラックを操作すると(矢印キーで動きます)カーナビみたいな感じで地図が動きます。あと、地図の拡大・縮小は自由に出来ます。 地図があるとどこを走っているかわかるので、より一層ドライブしている感があるかも。 次の記事で色々と技術的なことを書いていこうと思います。
以前からWebブラウザにはFirefoxを使っているのですが、先日リリースされたFirefox3.0にアップグレードしたところ、GoogleEarth APIが使えなくなってしまいました。Google Earth APIの ガイドには、近日中に対応すると書いてあったので、そのままダウングレードせずに待つことにしました。 と、思ったら本日ついに対応したようです。いままで自分のブログを開くだけで、プラグインのエラーが出ていたのに、出なくなっているのに気づきました。Firefox2.0の時にGoogle Earth Plug-in APIをインストールしたけど、何もしなくてもいきなり使えるようになった! いろんなページみてみると、Firefox3.0ではJavaScriptが高速化されたというのを良く聞くので、Google Earth APIも高速化されてるのかなあとちょっと思ったり。( この記事によると、Google Maps APIはかなり描画が速くなったようです!) 試しに、IE6.0とFirefox3.0で MONSTER MILKTRUCK!(ドライビングゲーム)をやってみたけど、そんなに差は感じなかった・・・。
Google Earth APIが出てしまったのであまり需要が無くなってしまった感のある、COM APIですが、今回はCOM APIを使ったGEのプログラムの話。自作でCOM APIを使ってGoogle Earthと連携するプログラムを作る場合に、自前のウインドとGEと二つ画面に表示しなければいけないのがめんどくさい場合があります。そこで、自前のプログラムのウインドの中に、GoogleEarthを描画する方法があります。 C#でのソースはこんな感じ。Win32APIとGoogle Earth COM APIの”GetMainHwnd()”、”GetRenderHwnd()”なんかをを使います。 /*---------------------------------------------------------------------------------------------*/ using System; using System.Windows.Forms; using System.Runtime.InteropServices; // for DllImport using EARTHLib; // for Google Earth COM API namespace GErenderhack { public partial class Form1 : Form { // Win32API [DllImport("user32.dll")] extern static bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] extern static int SetParent(int hwndChild, int hwndNewParent); [DllImport("user32.dll", CharSet = CharSet.Auto)] public extern static bool SetWindowPos(int hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); readonly IntPtr HWND_TOP = new IntPtr(0); readonly IntPtr HWND_BOTTOM = new IntPtr(1); static readonly UInt32 SWP_NOSIZE = 1; static readonly UInt32 SWP_SHOWWINDOW = 64; static readonly UInt32 SWP_HIDEWINDOW = 128; // GEコネクション IApplicationGE age = new ApplicationGE(); public Form1() { InitializeComponent(); /* // Ver.4.2 ********************************************************************** // レンダーハンドル取得・セット SetParent(age.GetRenderHwnd(), (int)this.Handle); // レンダーウインドサイズ設定 SetWindowPos(age.GetRenderHwnd(), HWND_TOP, 0, 0, this.Width, this.Height, SWP_SHOWWINDOW); // メインウインドサイズ設定 SetWindowPos(age.GetMainHwnd(), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE + WP_HIDEWINDOW); */ // Ver.4.3 ********************************************************************** // GEを最大化 SendKeys.SendWait("{F11}"); // メインハンドル取得・セット SetParent(age.GetMainHwnd(), (int)this.Handle); // メインウインドサイズ設定 SetWindowPos(age.GetMainHwnd(), HWND_TOP, 0, 0, this.Width, this.Height, SWP_SHOWWINDOW); } } } /*---------------------------------------------------------------------------------------------*/ 上のソースにあるようにGoogle Earthのバージョンが4.2までは、”GetRenderHwnd()”をつかって上手くいってたのに、4.3にバージョンアップされてからは、何故かレンダーウインドのサイズが合わなくなってしまう。それで4.3では”GetRenderHwnd()”を使用せずに、”GetMainHwnd()”を使い、”F11”キーをGEに送り無理やり最大化することで微妙だけど対応しています。(このへんの議論は COM APIフォーラムにもありました) これを試してみたのが下の画像です。  地球をこんな感じで組み込むことが出来ます。 まあ、Google Earth APIを使えば、複数GEを起動とか出来ちゃうからほんと今更だな〜。
今回はちょっとMATLABとGoogle Earthの話。 アルゴリズムを考えたり、画像処理やグラフを描いたりするのにMATLABはすごい便利でよく使ってます。で、このMATLABとGoogle Earthを連動して使いたいという要望に対して、以下のようなMATLABのサンプルが MATLAB Centralで公開されています。(余談ですがMATLAB Central は便利。MATLABコミュニティーサイトみたいなものですが、世界中の人が作ったサンプルやソースを公開しているので、意外と欲しい物が見つかる) ************************************************************** 1.MATLABでKMLファイルを作成する Google Earth ToolboxMATLABで描いたグラフや図をKMLファイルに書き出すことができる。写真のオーバーレイやタイムスケールなどほぼ何でも作れます。インターフェースが秀逸で、拡張も簡単です。これがあるとないのでは雲泥の差!すごい利用しています。 ************************************************************** 2.MATLABからCOM API経由でGoogle Earthを操作する Google Earth COM API (Example)MATLABからGoogle Earth COM APIを使うサンプル。今まではC#でやることが多かったけど、MATLABから扱うのもありかなあ。視点の変更等のサンプルもあります。 以上、MATLABとGoogle Earthの話でした。
Google Earth APIのサンプルとして公開されている Monster Milktruckというドライブシミュレータですが、これに建物の衝突判定を入れてみたくていろいろと調べてみました。 衝突判定を入れるには車のモデルの周りに建物があるかどうか、まず知る必要がある。これには車の四隅の緯度・経度を指定して、その位置の建物の高さを含めた高度を取得できれば判定できるなあと思って、Google Earth APIを使って取得できるか試してみました。(ちなみにGoogle Earth COM APIでは以前の記事に書いたように ”GetPointOnTerrainFromScreenCoords” を使うとできます) で作ってみたのが以下のものです。Googleのサンプルを改造したものなので、著作権とかついでに調べてみました。そしたらどうやら ”Apache License” というフリーのライセンスのようで、ちゃんと準拠すれば改造・再配布ができるらしい。というわけで公開しちゃいます。ソースを見たい人は こちら。”Visibility of 3D buildings” をチェックすると3D建物が表示されて、”Mouse down event” をチェックするとクリックしたところの緯度・経度・高度が表示されます。 ここのサンプルではGoogle Earth APIの二つの方法で高度をとっています。まず一つ目は KmlMouseEventのaltitudeを読む方法。もう一つは GEGlobeのgetGroundAltitudeメソッドを使う方法。 で結論的には、”KmlMouseEvent”では建物の高さはとれるけど”getGroundAltitude”では無理です。マウスをjavascriptで動かすのは無理なのでつまり障害物判定は無理ということに・・・。いろいろ方法を考えてみたけど、COM APIのように緯度・経度を指定してその場所の建物の高さをとってこれないと障害物判定は無理な気がします。 何とかなんないかな〜。 今回は以上です。余談ですが今回初めてjavascriptを使ったけど、適当に書いても動く感じがイイ!
昨日のニュースでGoogleがGoogleEarthのウェブプラグインとGoogle Earth APIを公開しました。 これによってGoogle Mapみたいに簡単にWebブラウザ上にGEを組み込み使うことができるようになりました。詳しくは こちら。サンプルとかいっぱいあります。ただ対応しているのはWindows XPとVistaだけのようです。まずプラグインをインストールする必要があります。 このサンプルの中に今までのCOMAPIではできなかったような複数のGEのウインドウを描画するようなサンプルや、MONSTER MILKTRUCK!っていう名前のドライブシミュレータなんかもあって非常におもしろい。  ドライブシミュレータはちゃんと慣性が効いていて、山とか地形の変化でジャンプするなど非常に芸が細かい。あとこのトラックしゃべるし。 個人的にはGoogleさすがだなーというのと、やられたなーって感じです。ドライブシミュレータつくったのになあ・・・。 あと気になるのは、オフラインでこのGoogle Eart APIを使うことができないかということ。そうすれば今までCOM APIでできなかったことがいろいろとできるようになる。試してみたら、最初にGEを読み込んだ後に、ネットワークを切ればそのままオフラインで使えます。もちろん画像などの読み込みは行われないけど、普通のGEと同様にキャッシュに残っているところは表示されるし、 APIも利用できる。 さらにブログなどに貼り付けたいときは こんなページがありました。JavaScriptとかHTMLとか考えなくても、リンクを生成してくれます。↓こんな感じ(要プラグイン) これを使ってネタを考えよう・・・。
今回はGoogleEarthのモデルの座標系の話です。 GoogleEarth(KMLファイル)はColladaモデルに対応していて、3DのモデルをGoogleEarthに表示したいときはGoogle Sketch UP等のソフトを使ってColladaモデルを作ることで、好きな3Dモデルを表示することができます。 さて、このColladaモデルの作り方に関してはひとまずおいておいて、このモデルをGoogleEarthに表示させたいときは、簡単にやるならGEのメニュー→追加→モデルでGUI的にモデルを設置できます。 けれどもドライブシミュレータやフライトシミュレータなんかでは、直接KMLファイルから作成したい場合もあります。その際にモデルの3軸の回転角度の指定が非常に重要になるわけです。 KML2.2 Reference のModelタグに詳しい説明が載っているんですが、回転順番や軸の話など混乱する部分が非常に多いのでここにまとめておこうと思います。 まずReferenceにあるように  角度を計測する基準の座標系は、Y軸が北方向を向いていて、Z軸方向が上空を向いている 右手系の座標系です。  次に回転する軸と名前の対応ですが、”Orientation”タグの ”heading”がZ軸、 ”tilt”がX軸、 ”roll”がY軸に対応しています。さらに回転方向ですが、ここが注意なのですが右手座標系なのに 左ねじの方向が正となっています。これはたぶん方位に合わせたにだろうけど間違えやすい・・・。 さらにもう一つ重要なのがどの軸周りにどういう順番で回転するかということです。ところがなぜかこの回転軸と回転順番の話がリファレンスにのっていない・・・。結論的には基準の座標系から Z(heading)→X(tilt)→Y(roll)の順番で、次々に新しい軸回りに左ねじ正の方向でまわしていくようです。 KMLの”model”タグ中の”Orientation”タグの入力では以上のような方式でheading、tilt、rollをdeg単位で書かなければならない。研究で行っているモデルでは別の座標系・回転順番で回転角度がでてくるため、このKML方式のheading、tilt、rollを計算するために、かなりめんどくさいことをやらなければなりませんでした。具体的には一度回転行列にしてからKML式heading、tilt、rollをそれぞれ解くという感じ。そもそも一意に角度決められないしなぁ。 あと検証用に以下のようなKMLモデルつくってみました。  拡張子をKMZ→ZIPにリネームして出てくるKMLファイルをいじると回転の検証ができます。 heading=0、tilt=0、roll=0でY軸が北を向いてZ軸が上を向くはず。 →→→ download←←← 以上、長くなりましたがまとめでした。今回のネタは需要があるんだろうか・・・。
お久しぶりです。 一年近く放置していましたが相変わらず研究を続けています。この一年間の間にGoogle Earth関係でもかなりネタがたまりました。ドライブシミュレータとか公開するっていっときながら公開してないし・・・。 暇をみてちょこちょこ更新していこうと思います。 さてGoogleEarthもいつのまにか4.3(beta)にアップデートされました。この更新でいろいろGUI的にも変わっているんですが、プログラム的に面白そうなところに言及しときます。僕が感じた技術的に大きな変化は、建物などの3次元モデルの高度データが取れるようになったことです。(下の画像参照)  こんな感じで3次元モデルの上に乗せると建物の色が変わったり、右クリックすると"建物を隠す"ってポップアップがでできます。さらに何よりもマウスを動かすと下の高度データがちゃんと変化します。あと右クリックズームの時に建物の壁をちゃんとつかめて視点を拡大したりまわったりできる。 実は3次元モデル(箱モデルも)を表示してる状態ならCOM APIでもこの建物の高さにアクセスできます。これはどういうことに応用できるか? まず一つは建物の衝突判定に使えそう。フライトシミュレーションやドライブシミュレーションで毎フレーム3Dモデルにアクセスすることで、今までは建物の中に潜ってたのがなんとかなりそう。 あとは今まではGoogle Earthをフリーの数値標高モデルDEM(Digital Elevation Model)ではなく数値表層モデルDSM(Digital Surface Model)として利用できるということもあるかもしれない。 さて、実際にCOM APIで建物データにアクセスしてみた例はまた次回の更新で・・・。
| HOME |
次ページ≫
|