Space Program #1 万有引力

そろそろ宇宙空間にも進出していこうと思います。昔からやってみたいと思ってはいたのですが、数学が難しそうという思い込みでなかなか始められず・・・。重い腰を上げたきっかけは少し前に読んだ探査機はやぶさ2の地球スイングバイの記事でした。宇宙船は基本的に燃料を節約するために慣性で飛んでいて、惑星の引力を利用して軌道や速度を変えたりしているのですが、記事を読んで、どのように軌道の計算をしているのか興味がわいてきました。

宇宙空間の物理法則はあまり理解していないので初歩的なところから始めてみました。惑星を配置して衛星を回すことが今回の目標です。

 

万有引力

universal_gravitation_20160215

まずは宇宙空間の環境をつくります。万有引力の公式を見ると重力の大きさは距離(半径)の二乗に反比例するという意味になっていますね。なぜそうなるのかはわかりませんが、逆二乗ということはおそらく重力は音のように球状で広がっていく力なのでしょう。

地球の質量5.972 x 10^24kg、半径6,371kmを使って計算すると

5.972 * 10^24 * 6.67 * 10^-11 / 6371000^2 = 9.819943

ご存知の重力加速度9.8m/s^2が導き出されます。

地上400kmを飛ぶ国際宇宙ステーションにかかる重力加速度は8.69m/s^2となり、月が地球から受ける重力加速度は距離が384,400 kmなので0.0026m/s^2になります。

 

衛星と第一宇宙速度

ISS(国際宇宙ステーション)が地球を回っているのはエンジンを噴かして飛んでいるわけではなく、地球に落ちない速度で動いているからです。このギリギリ落ちない速度を第一宇宙速度といい、円運動を理解することで計算できるようになります。

angular_velocity_20160215

はじめに角速度です。一定の半径で回り続ける場合、弧の長さは角度(ラジアン)×半径となります。この場合、弧の長さが速度になりますね。

 

centripetal_force_20160214b

つぎに向心力、つまり速度ベクトルが円運動をするために必要な加速度を求めます。この中心に働く加速度がないと速度ベクトルはまっすぐ進むことになります。ハンドルを切って横方向に力を加えるようなイメージをするといいかもしれません。求め方は微小時間で考えるとわかりやすくなります。

 

first_astronautical_velocity_20160214

重力加速度と向心力の式をまとめると円運動をするための速度、つまり第一宇宙速度の式になります。高度400kmのISSに必要な速度は7.642km/sになり、月が地球へ落ちないために必要な速度は、地球からの距離が384,400 kmなので1.018km/sになります。

 

実装

プログラムは極力シンプルな構成で始めることにしました。地球を原点に配置して地球が静止しているという状態にし、地球のまわりに衛星を飛ばします。物体の座標は毎秒速度ベクトルで移動し、この速度ベクトルに地球からの重力加速度が加算されるという仕組みです。

satellite_20160211115233

画面をクリックすることでカメラ位置から隕石を飛ばせるようにしました。地球を周回する軌道に乗せるのは意外と難しいです。

 

satellite_20160213163633

第一宇宙速度で飛ぶ衛星です。ISSと静止衛星、月を配置しました。静止衛星は地球の自転に合わせて回る衛星で、たとえば日本の気象衛星ひまわりはこの軌道を飛んで日本上空を観測し続けています。角速度を地球の自転角度に合わせることでこの軌道に必要な距離と速度を計算できます。

 

地球の重力を振り切るほどの速度がない衛星は地球の周りを楕円軌道で回り続けます。地球に近づくほど速度が増し、離れるほどゆっくりになります。ちょうど地上から真上に向かって物を投げる運動に似てますね。地面がないのでずっと回り続けるわけです。よくSF漫画や小説に出てくる「重力に囚われた」という表現はこういうことだったんですね。

つづく・・・

 

※動画は60~1800倍の速度で動かしています。

参考資料

「チャート式 新物理」 円運動と万有引力(155~162ページ)
http://www.amazon.co.jp/gp/product/4410118420

広告

Railway Map #2

前回から路線を拡大して京都から神戸まで広がりました。阪急の主要路線である神戸線、宝塚線、千里線を追加。阪急の路線図みたいになってきましたね。

 

座標単位

train_20160117001434

駅をきちんとした基準で配置したかったので座標には緯度と経度を使うことにしました。中心座標を経度135.6°、緯度34.9°として相対的に駅の座標を計算しています。ちなみに駅の座標はWikipedia等に載っています。グリッド1マスの幅は0.1度としました。

 

地図情報

train_qgis_kyoto

緯度と軽度で正しい座標に駅を配置したので実際の地図を重ねてみたくなりました。国土地理院が地図のデータを公開しているので利用してみることにしました。データを利用するには名前と住所を登録する必要があります。基盤地図情報ビューワもダウンロードして開くことが出来るようになりますが、データも膨大な上、若干扱いにくいツールなので、オープンソースのGISソフトのQGISを使いました。基盤地図情報ビューワからデータをエクスポートしてQGISで読み込むという流れで背景の地図画像を作成しました。

 

train_20160103231155

基盤地図情報から取得したデータを重ねて、駅の位置が実際の地図と合っていることを確認して一安心。地図は縦横比が1:1になる正距円筒図法を使っています。日本は赤道より北に位置するので本当は横幅(経度)は縦幅(緯度)より若干短くなります。その辺は大目にみることにします。

 

インターフェイスデザイン

train_20160117004326

そろそろGUIに取り組んでいこうと思います。テキスト以外にもラインや矩形、アイコン等、UIに使われる要素を作っていきます。汎用性を考えてモデルではなくコードで頂点を生成してポリゴン描画する仕組みにしました。

 

icon_font

アイコンはフォントと同じ要領で画像をたくさん並べたテクスチャーシートを使っています。矩形のポリゴンを作って利用するアイコン画像のUV値を指定して表示させています。

 

train_20160117004340

ワイヤーフレームで表示するとこんな感じですね。これらのHUD要素のモデルは背景モデルを描画した後に別のカメラで上書きする形でレンダリングします。違う空間のものとして扱う感じですね。

 

train_20160117005214

背景と重ならないように、背景モデルを描画した後にガウスブラーをかけて、深度バッファーをクリアしてからHUD用モデルを描画します。

 

bokeh_hexa

最後に一工夫、メリハリをつけるためにレンズのボケ画像をポイントスプライトで描画してみました。

 

こちらは操作している様子を収めた動画です。

Railway Map

昔からあったらいいなと思っていた俯瞰で見た路線図を試作してみました。時刻表や乗り換えのアプリはたくさんありますが、シミュレーションゲームのように路線全体を視覚化したようなものは見たことがありません。次の電車やその次の電車が今どの辺にあるか把握できればタイミングよく会社を出てスムーズに電車に乗ることが出来るだろうなと思うことがよくあります。

現在京都に住んでいるので自分がよく利用する阪急京都本線、阪急嵐山線、地下鉄烏丸線を再現してみました。

 

Webスクレイピング

きっと時刻表のAPIやXMLはどこかに公開されているだろうと思っていたのですが、これが全然見つからず・・・。ネット上で同じようなことをやろうとしている方々の情報を見た限り、どうも時刻表のサイトからスクレイピングするしか方法がなさそうなので、PHPを使ってHTML構造から必要な情報を取ってきてXML形式に書き換えるコードを書いてみました。(PHPは大学生の頃にウェブデザインに使っていました。いろいろと言われている言語ですが、なんとなく書いたいい加減なコードでもなんとなく動くのでこういう時は便利です。)

いろんな時刻表サイトがありますが路線時刻表がある「えきから時刻表」を利用しました。(サーバー負荷を考えると罪悪感がありますが、スクレイピングするのは時刻表データを取得するための一度きりです!)

xml_format_20160102

こんな感じで止まる駅とその時刻をHTMLのテーブルから抜き出してXML形式に変換しました。京都本線の上りだけでも時刻だけで1万行近くのデータになったのでウェブサイト見ながら手打ちで時刻を入力するのは考えただけでも気が遠くなりますね。

 

プログラミング開始

駅の情報を配列にしたXMLデータとスクレイピングした路線時刻表を整理した車両のXMLデータを使って車両を路線上に配置します。

class_stations

駅クラスは名前や座標などの情報を格納してあります。

class_trains

電車クラスは止まる駅や通過する駅、その時刻などの情報を起動時に計算して格納してあります。通過時刻はさすがに時刻表からはわからないので、距離から補完した時刻を計算しました。

railway_20151223031238

時間のスライダーを動かしてその時刻通りの座標に電車が配置されるようにしてとりあえずの目標は達成です。電車の動きは駅と駅の間を線形補完して移動させていますが、サインカーブを使って停車している感じを出しています。

普通列車が待ち合わせして快速や急行に抜かされていく様は面白いし、よくスケジュールされているなと感心します。同一時刻の線路上に何本の電車が走っているか確認できただけでもなんだか嬉しくなりました。想像以上に短い間隔で電車は動かされているものなんですね。

つづく

クラメルの公式の図形的意味

交差判定の記事でクラメルの公式を扱いましたが公式については省いていたので解説してみようと思います。クラメルの公式が図形的にどんな仕組みになっているのかを視覚化してみます。

まずはクラメルの公式とは何かというと・・・

2x + y = 8
x + 3y = 9

といった連立方程式を代入や消去法を使わずに

x = (8*3 – 1*9) / (2*3 – 1*1) = 3
y = (8*1 – 2*9) / (1*1 – 2*3) = 2

と係数の四則演算だけで求めることが出来る便利な公式です。交差判定では三次元での計算を扱いましたが、今回はわかりやすさを考えて二次元で解説していきます。

cramer_2d_20151121

これがクラメールの公式です。detという式を使っていますが、これはdeterminant(行列式)という意味になります。

 

行列式とは?

determinant

まずクラメルの公式に使われている行列式が何を意味しているのかですが、答えを先に書いてしまうとこれが意味するものは2つのベクトルが成す平行四辺形の面積です。

図形にして見てみます。

determinant_graph_20151122

ベクトルの成分同士を掛け合って引き算することで上手く平行四辺形の面積になっていることがわかると思います。クラメールの公式はこの考え方を基本に成り立っています。

 

連立方程式を図形化してみる

連立方程式はベクトルの形にしてみると、平行四辺形の関係になります。

cramer_parallel_20151127

ベクトルaをx倍して、ベクトルbをy倍したものがベクトルcという関係になることがわかると思います。連立方程式が表していることがちょうど平行四辺形になるんです。

 

クラメールの公式を分解していく

cramer_2d_20151121

クラメルの公式ではxやyを行列式を利用して求めます。公式を見るとxの値は「ベクトルcとベクトルbが成す平行四辺形」を「ベクトルaとベクトルbが成す平行四辺形」で割ることで求まることになります。

ではその様子を図形的に表してみます。

parallel_cramer_xy

ベクトルの方向に伸びた平行四辺形を基本となる平行四辺形で割った値がそれぞれxとyになるということがわかると思います。図にすると関係性がわかりやすくなりますよね。

 

cramer_3d

3次元でのクラメル式は計算量は多くなりますが、平行四辺形が平行六面体になるだけで概念は同じです。こうしてみるとエレガントな公式ですね。

 

参考資料

線形代数を学ぶならこの本がおすすめです。1章から3章までで行列式や内積、外積を視覚的に理解することができます。

「ゼロから学ぶ線形代数」 1章(26~36ページ)
http://www.amazon.co.jp/gp/product/4061546538

Modeling T-72 #2

t72_20151024025406

T-72のテクスチャーを描き始めました。相変わらずテクスチャーを描いているとテクセルが足りないことに気が付いてUV展開をやり直したりしています。

t72_20151024033649

反応装甲は不均一に並べると自然な感じに見えるようになりました。反応装甲のスペキュラーの反射具合で格好良く見せられそうです。テクスチャー作業は半分ぐらい終わったところ。

t72_20151024034106

ロシアなど特定の国ではなく、東欧のどこかの国のT-72戦車という設定で進めていきます。

つづく

反射ベクトル

ふとステルス戦闘機の記事を読んでいたらレーダー波を反射するビジュアルを作ってみたくなりました。

stealth_20150720175913

ステルスといえばこの機体、F-117Aをさくっとモデリングしてレーダー波を照射!前方から浴びせたらほぼすべてを後方に反らしました。

stealth_20150720175120

でもこんなふうに傾けるとレーダーの方向へ跳ね返してしまいます。つまりステルス戦闘機がステルス性を発揮するには常に水平飛行をしていないとならないわけですね。

stealth_20150720175408

レーダー波はモデルに当たると反射ベクトルで跳ね返ります。尾翼に当たった光線が機体から上空へと跳ね返っていく様子がわかると思います。念のため4回までバウンスするようにしてみました。

反射ベクトル

dot_parallel_20150726

以前壁に平行なベクトルについて書きました。進行方向のベクトル(F)を内積をつかって法線に投影してベクトルを求め(aN)、それらを足したベクトル(F + aN)が壁に平行なベクトル(P)となりました。

dot_reflect_20150726

反射ベクトル(R)は平行ベクトル(P)と進行ベクトルを法線に投影したベクトル(aN)を足すだけです。図の右側の三角形を見ればわかりやすいかと思います。反射ベクトルは関数を使えば簡単に求めることができますが、やっぱり仕組みは知っておきたいですよね。

というわけで、モデルのステルス性がどれだけあるのか調べられるツールが出来ました。あまり意味ないか。笑

Modeling T-72

もう戦車は作らない!と決めていましたがハードディスクの整理をしていたらモデリングが8割ぐらい出来上がっているT-72を発見しました。せっかくだし完成させようかと思います。じつはこれ2年前に10式戦車と同時に敵役としてモデリングしたものなんですよね。存在をほぼ忘れていました。

 

t72_20150621_02

いつもと同じように戦車だけを作っても面白くないので今回は模型でいう「情景」的なものを目指そうと思います。搭乗員を乗せてみたり。

 

t72_20150621_01

T-72の特徴といえば、やっぱりその悪そうな外見です。リアクティブアーマーも鎧みたいで格好いいです。悪役感を出せれば成功かな。

 

t72_20150625_01

T72は装備が戦車ごとにカスタマイズされていたりするので自分好みの組み合わせにしてみようと思います。スモークディスチャージャーなどを加え・・・

 

t72_20150711142612

ビューワにてレンダリングしてみました。

まだまだ作るものが多いですが気長に続けていく予定です。

つづく