羅針盤開発秘話 第3回

By akane
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

ポケット羅針盤制作秘話も第3回となりました。

今回は、自分が向いている方向の星空を端末上で再現できる
「星空機能」を実装した山田氏の開発の苦労の話をもとに
記事を作成しました。

——-

4つの機能を盛り込むこととなった「ポケット羅針盤」。
プロジェクトは機能ごとに開発者を分けて進めることとなった。

山田の担当は「星空機能」だったが、困ったことがあった。
星についての知識がまったくないのだ。

知っていることといえば
「星って確か回るよなー」ぐらいの
小学生と同程度の知識のみである。
このままでは、到底星空をプログラムに起こして
アプリ上で星空を再現することはできない。

山田はまず、
星についての知識を深めることから着手せねばならなかった。
星については、星空解説サイトや、
高校の天文学部のサイトを巡り学び、
数日後には星に関する
移動や座標を計算する方法を理解することはできた。

星の原理を理解した後、
次に取り組んだのは
学んだ星の原理をプログラム上で書き起こすことだ。

再現方法は二つあった。
3Dで実現するか2Dで実現するかだ。

山田は、まず3Dでの星空実現を試みた。

しかし、当時Androidのバージョンは1.0。
3Dに関する関数やAPIがあまりなかったため、
3D上で星のマッピングは出来るが、
画面上で再現された星の形は点しかなかった。
その上、星座を描くために必要な、
星と星をつなぐ線も直線でしか再現できなかったため、
大変味気ない図になってしまった。

3Dでは、求めている星空が創りだせない。
山田は3Dでの再現をあきらめ、
2Dでの星空再現に取り組むことにした。

しかし、ここでも問題があった。
3D座標から2D座標への書き換え式が上手くできなかったのだ。

迫る納期。
進まない現状をなんとか前進させるため、
山田は社内のQA
(社内サイト上で技術的に困っていることを社員全体に質問する場)を
利用して助けを求めた。

それからたったの19分後。
CTOの小林から返信があった。
そこには、3D座標から2D座標へ書きかえるための
考え方が提示されていた。

4時間後には、小林から具体的な計算式が提示された。
これが実際のやり取りである。
question

3D座標から2D座標への変換方法は以下の通りだ。

球面があってその中にスクリーンがある。
球面の表面に星が配置されており、
星と、球面の中心の原点を結んだときに
スクリーンと交わる点のx,y座標を求めることで
3D座標を2D座標へ変換が出来るのだ。

x,y座標を求めるためには三角関数を利用する。
3Dの座標と原点の座標から求めた角度、
xy平面の角度、
zy平面の角度、これら求めることで
その交点のななめの長さはわかるので、
その角度をもとにxy座標を求めている。

見ている向きを変える場合は、
スクリーンの位置をずらすのではなく、
球体を回転させて見える星空を変えた。

この式を足がかりにして、実装は急ピッチで進むようになった。

計算式の問題が解決したが、もうひとつ問題が浮上した。
3Dから2Dへ変換する計算量が膨大になり
JavaのMath関数を利用したプログラムでは
動作が重くなってしまったのだ。
この問題に対しYは、
早く動くアークタンジェントメソッドを作成し、
快適に動作するシステムを構築した。

こうして、山田は何度も壁にぶつかりながらも
Androidの中に美しい星空を作り出すことに成功したのである。
compass_star

——-
(次回 羅針盤開発秘話 第4回は5月14日(金)投稿予定です。
ランドマーク機能を実装した石田氏に話を伺います。)

関連する投稿