スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | トラックバック(-) | コメント(-)

KMLコンテスト 

ひさしぶりです。いつものとおり放置気味でした。
あいかわらずいろいろとネタはためています。

さて、今回はGoogle社のKMLコンテストについて。こちらのページから情報が確認できますが、KMLを使ったアカデミックなネタのコンテストが開催されています。締め切りは12/1まで。優勝するとハンディーGPSやらiPodタッチやらがもらえるそうです。

せっかくなので今やってる研究に絡めて応募する予定です。 小型自律飛行機で収集した上空からの情報をGoogle Earhに統合するっていうデモ。作ったらブログでも公開する予定です。
[ 2008/11/09 18:12 ] Google Earth ネタ | TB(0) | CM(1)

Monster Milk Truck に地図とカメラをつけてみた 

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 に基づいています)

MilkTruck.jpg


実際のGoogle Earth APIのサンプルは以下から。別ウインドで開きます。(Google Earth Plug-inをインストールしている必要があります。IE7とFirefox3では一応動作を確認しました。動かないときはブラウザの更新ボタンを押してみて下さい。)

*******************************************
→→→→→Monster Milktruck(地図付)←←←←←
*******************************************

右上のGoogle MAPの中心にトラックの小さいアイコンが表示されて、トラックを操作すると(矢印キーで動きます)カーナビみたいな感じで地図が動きます。あと、地図の拡大・縮小は自由に出来ます。

地図があるとどこを走っているかわかるので、より一層ドライブしている感があるかも。
次の記事で色々と技術的なことを書いていこうと思います。
[ 2008/06/29 19:45 ] Google Earth Plug-in API | TB(0) | CM(1)

Google Earth API が Firefox3.0 に対応! 

以前から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!(ドライビングゲーム)をやってみたけど、そんなに差は感じなかった・・・。
[ 2008/06/23 12:06 ] Google Earth Plug-in API | TB(0) | CM(0)

Google Earth COM APIで自前のウインドに地球を表示する 

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フォーラムにもありました)

これを試してみたのが下の画像です。

GetGE.jpg

地球をこんな感じで組み込むことが出来ます。
まあ、Google Earth APIを使えば、複数GEを起動とか出来ちゃうからほんと今更だな〜。
[ 2008/06/21 21:31 ] Google Earth COM API | TB(0) | CM(0)

MATLABでGoogle Earthを使う 

今回はちょっとMATLABとGoogle Earthの話。
アルゴリズムを考えたり、画像処理やグラフを描いたりするのにMATLABはすごい便利でよく使ってます。で、このMATLABとGoogle Earthを連動して使いたいという要望に対して、以下のようなMATLABのサンプルがMATLAB Centralで公開されています。(余談ですがMATLAB Central は便利。MATLABコミュニティーサイトみたいなものですが、世界中の人が作ったサンプルやソースを公開しているので、意外と欲しい物が見つかる)

**************************************************************
1.MATLABでKMLファイルを作成する
Google Earth Toolbox
MATLABで描いたグラフや図をKMLファイルに書き出すことができる。写真のオーバーレイやタイムスケールなどほぼ何でも作れます。インターフェースが秀逸で、拡張も簡単です。これがあるとないのでは雲泥の差!すごい利用しています。


**************************************************************
2.MATLABからCOM API経由でGoogle Earthを操作する
Google Earth COM API (Example)
MATLABからGoogle Earth COM APIを使うサンプル。今まではC#でやることが多かったけど、MATLABから扱うのもありかなあ。視点の変更等のサンプルもあります。

以上、MATLABとGoogle Earthの話でした。
[ 2008/06/14 16:31 ] MATLAB | TB(0) | CM(0)

Google Earth APIで建物の高度情報をとってくる 

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を使ったけど、適当に書いても動く感じがイイ!
[ 2008/06/09 22:46 ] Google Earth Plug-in API | TB(0) | CM(0)

Google Earth API と Plug-in 

昨日のニュースでGoogleがGoogleEarthのウェブプラグインとGoogle Earth APIを公開しました。
これによってGoogle Mapみたいに簡単にWebブラウザ上にGEを組み込み使うことができるようになりました。詳しくはこちら。サンプルとかいっぱいあります。ただ対応しているのはWindows XPとVistaだけのようです。まずプラグインをインストールする必要があります。

このサンプルの中に今までのCOMAPIではできなかったような複数のGEのウインドウを描画するようなサンプルや、MONSTER MILKTRUCK!っていう名前のドライブシミュレータなんかもあって非常におもしろい。

plugin.jpg


ドライブシミュレータはちゃんと慣性が効いていて、山とか地形の変化でジャンプするなど非常に芸が細かい。あとこのトラックしゃべるし。
個人的にはGoogleさすがだなーというのと、やられたなーって感じです。ドライブシミュレータつくったのになあ・・・。

あと気になるのは、オフラインでこのGoogle Eart APIを使うことができないかということ。そうすれば今までCOM APIでできなかったことがいろいろとできるようになる。試してみたら、最初にGEを読み込んだ後に、ネットワークを切ればそのままオフラインで使えます。もちろん画像などの読み込みは行われないけど、普通のGEと同様にキャッシュに残っているところは表示されるし、 APIも利用できる。

さらにブログなどに貼り付けたいときはこんなページがありました。JavaScriptとかHTMLとか考えなくても、リンクを生成してくれます。↓こんな感じ(要プラグイン)



これを使ってネタを考えよう・・・。
[ 2008/05/29 16:01 ] Google Earth Plug-in API | TB(0) | CM(0)

GoogleEarthのモデルの座標系と回転順番 

今回はGoogleEarthのモデルの座標系の話です。
GoogleEarth(KMLファイル)はColladaモデルに対応していて、3DのモデルをGoogleEarthに表示したいときはGoogle Sketch UP等のソフトを使ってColladaモデルを作ることで、好きな3Dモデルを表示することができます。

さて、このColladaモデルの作り方に関してはひとまずおいておいて、このモデルをGoogleEarthに表示させたいときは、簡単にやるならGEのメニュー→追加→モデルでGUI的にモデルを設置できます。
けれどもドライブシミュレータやフライトシミュレータなんかでは、直接KMLファイルから作成したい場合もあります。その際にモデルの3軸の回転角度の指定が非常に重要になるわけです。

KML2.2 Reference のModelタグに詳しい説明が載っているんですが、回転順番や軸の話など混乱する部分が非常に多いのでここにまとめておこうと思います。

まずReferenceにあるように
model1


角度を計測する基準の座標系は、Y軸が北方向を向いていて、Z軸方向が上空を向いている右手系の座標系です。

model2

次に回転する軸と名前の対応ですが、”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モデルつくってみました。
ModelCoordinate.jpg

拡張子をKMZ→ZIPにリネームして出てくるKMLファイルをいじると回転の検証ができます。
heading=0、tilt=0、roll=0でY軸が北を向いてZ軸が上を向くはず。
→→→download←←←

以上、長くなりましたがまとめでした。今回のネタは需要があるんだろうか・・・。
[ 2008/05/17 16:23 ] Google Earth ネタ | TB(0) | CM(1)

Google Earthから3次元データをとってくる 

さて、Google Earthから3次元座標を取ってくるのにはCOM APIの
「GetPointOnTerrainFromScreenCoords」
を使います。C#での簡単な使い方はこんな感じ。

***********************************************************
// GEコネクション
IApplicationGE age = new ApplicationGE();

// データ格納用
IPointOnTerrainGE point;

// レンダリング画面上の点を取ってくる位置(中心は0,0)
double x = 0.0;
double y = 0.0;

// GEから座標を取得
point = age.GetPointOnTerrainFromScreenCoords(x, y);
***********************************************************

こんな感じでやるとpoint.Latitudeやpoint.Longitude、point.Altitudeにレンダリングスクリーン上の指定した位置の三次元データが入ります。上の例だと画面の中心の三次元データが取れます。詳しくはCOM API Documentをみてね。

ここから本題ですが、以上の方法を駆使してGoogle Earthから環境の三次元点群データを作成してみました。下の2つの動画を見てください。それぞれカラー三次元点群データになっています。CSV形式で出した点群をVRML形式にして動画をとってみました。

富士山カラー三次元点群データ

Video: Point Clouds from GE -FUJI-

新宿カラー三次元点群データ

Video: Point Clouds from GE -SHINJUKU-

作成手順は
1.レンダリング画面をめちゃ細かくメッシュ状に分割して、それぞれのメッシュの交点で三次元座標をひたすらとってくる
2.複数の方向から1の手順を行う
3.レンダリング画面をキャプチャして、画像を保存し、画像のカラーデータを点群に投影して色をつける
4.VRMLにして表示

こんな感じの手順を自動でおこなうプログラムを作ってみました。ただしここには色々めんどくさいことがあって、Google Earthは5000点くらい連続で「GetPointOnTerrainFromScreenCoords」を行うとなぜかフリーズしてしまうのです。たぶん2次利用できないように転送に制限を設けてると思うんだけど・・・。そこで4900回「GetPointOnTerrainFromScreenCoords」を繰り返したら、GEを再起動させるという荒業をプログラムに組み込んでみました。数百回のGEの再起動の結果が上の動画です。

うーん・・・面白いんだけど・・・いろんな意味でどうなんだろう。
[ 2008/05/13 22:16 ] Google Earth COM API | TB(0) | CM(0)

久しぶりに更新 

お久しぶりです。
一年近く放置していましたが相変わらず研究を続けています。この一年間の間にGoogle Earth関係でもかなりネタがたまりました。ドライブシミュレータとか公開するっていっときながら公開してないし・・・。
暇をみてちょこちょこ更新していこうと思います。

さてGoogleEarthもいつのまにか4.3(beta)にアップデートされました。この更新でいろいろGUI的にも変わっているんですが、プログラム的に面白そうなところに言及しときます。僕が感じた技術的に大きな変化は、建物などの3次元モデルの高度データが取れるようになったことです。(下の画像参照)

shinjuku

こんな感じで3次元モデルの上に乗せると建物の色が変わったり、右クリックすると"建物を隠す"ってポップアップがでできます。さらに何よりもマウスを動かすと下の高度データがちゃんと変化します。あと右クリックズームの時に建物の壁をちゃんとつかめて視点を拡大したりまわったりできる。

実は3次元モデル(箱モデルも)を表示してる状態ならCOM APIでもこの建物の高さにアクセスできます。これはどういうことに応用できるか?

まず一つは建物の衝突判定に使えそう。フライトシミュレーションやドライブシミュレーションで毎フレーム3Dモデルにアクセスすることで、今までは建物の中に潜ってたのがなんとかなりそう。
あとは今まではGoogle Earthをフリーの数値標高モデルDEM(Digital Elevation Model)ではなく数値表層モデルDSM(Digital Surface Model)として利用できるということもあるかもしれない。

さて、実際にCOM APIで建物データにアクセスしてみた例はまた次回の更新で・・・。
[ 2008/05/12 14:47 ] Google Earth ネタ | TB(0) | CM(0)