個人開発2026年11月5日約5分
実在の 名所の 空を 飛ぶ ゲームを、 公開データで 作る

戦闘機ゲーム「Dogfight」では、富士山やハロン湾、グランドキャニオンなど、実在の60か所の空を飛べます。地形はすべて、無料で公開されている標高データと衛星写真から作りました。データの選び方、つまずいた所、軽くする工夫、出典の決まりを順に書きます。
なぜ実在の場所にしたか
最初はブラウザで試作品を作りましたが、操作も背景も機体も「現実感がない」と感じました。そこでゲームエンジンを Godot(無料で使えるゲーム作りの道具)に変え、地形は富士山と駿河湾まわりの実在の地形から作り始めました。
ストーリーは世界一周にしました。60ステージそれぞれが国の中の具体的な場所で、地図の上の地点も地名と同じ緯度・経度に置いています。紛争地や国境の近くは避けました。3D の地形は、どの場所も中心から48km 四方です。
標高データから地形を作る
最初は国土地理院の標高と空中写真を使いました。ところが調べると、測量法の使用承認の申請が必要になる可能性が高いと分かりました。2026年10月15日に国土地理院のデータをすべてやめ、世界中で同じ作り方ができるデータに切り替えました。
標高は Terrain Tiles(AWS Open Data)です。地図を小さな正方形の画像に分けた「タイル」で配られていて、画素の色に高さが入っています。色から高さ(m)に戻す計算は次の1行です。
# 赤・緑・青の値から標高(m)に戻す(terrarium 形式)
h = R * 256 + G + B / 256 - 32768
ズーム14のタイルを集めて48km 四方に切り出し、PC 用は4096画素四方(約12m 間隔)にしました。あとから足した地域は3072画素四方(約16m)です。元データの多くは25〜30m 間隔なので、これで足りると判断しました。
データには傷がありました。
- カッパドキアでは、タイルの一部に高さの欠けがありました。1〜4段粗いタイルを拡大して埋めています。
- 桂林では、北緯25度の線に沿って細い筋が数百m 落ち込んでいました。まわりの中央値で置き換えました。
- 富士山の北西には、まわりより150m 以上低い点の穴がありました。これも中央値で埋めています。
海も手間がかかりました。標高0.5m 以下を海とし、海岸線は衛星写真の水の色に合わせます。小さな島は標高データでは形が粗いので、写真で植物の緑に見える所を島として持ち上げました。釜山では工場の青い屋根が海の穴になり、明るい所は水にしない決まりを足しました。ノルウェーのフィヨルドは水面の標高が0〜2m の段になっていて、海とみなす高さを地域ごとに変えています。
できた標高は0.25m 刻みの整数にして、赤と緑の2色に分けた可逆 WebP(劣化しない圧縮の画像)で保存します。富士山のデータ上の最高点は3759.6m でした。
衛星写真を貼る
地面の色は衛星写真です。国土地理院の空中写真だけだと、撮影時期ごとに色がつぎはぎになりました。そこで EOX の Sentinel-2 cloudless 2016(雲を除いてつなぎ合わせた衛星写真)を使いました。この写真は2017年以降の版が非商用のライセンスなので、商用でも使える2016年版だけを使っています。
富士山は、Copernicus Sentinel-2 の2020年5月2日の1回の撮影に差し替えました。雪をかぶった富士山がはっきり写った晴れの日です。晴れた日は、撮影の一覧を雲の割合で絞り込んで探しました。一部の地域も同じように晴れた日の撮影を使っています。
貼るまでにした手直しは次のとおりです。
- 区画ごとの明るさの段をそろえる。撮影に入らない所は2016年版で埋める。
- 桂林のように薄い雲やもやが広く残る写真は、近くの晴れた所の色で埋める。
- 砂漠や雪が白く飛ぶ地域は、赤・緑・青の帯を別々に読んで色を作り直す。
- 衛星写真は青く霞みやすいので、明るさと彩度を地域ごとにそろえる。
ブラウザでも軽く動かす
PC 版、iPhone 版のほかにブラウザ版も出しています。ブラウザでは、最初の読み込みの重さがそのまま遊びやすさに出ます。
まず地形データを分けました。ブラウザとスマホ用は標高を2048画素四方にし、写真は WebP にしています。あとから足した地域は、PC 用を1地域9MB、ブラウザとスマホ用を2.5MB 以内に収める目標で、大きさと画質を地域ごとに決めました。
次に、地域を後から読むようにしました。最初のデータには富士山の地形だけを入れ、ほかの地域は初めてそこへ行くときに落とします。機体を選んでいる間に読み込み、一度落とした地域は端末に残します。失敗したときは富士山で代わりに飛べるようにしました。これで最初の転送は約37MB から約23MB になり、地域を増やしても最初の転送は増えません。
描く量も減らしました。
- 3D の部分だけ、描く画素数に上限を設けました。Retina の画面では2880×1800画素を描いていました。計器や文字は元の細かさのままです。
- 地形の格子(地面を細かい三角形に分けた網)を一辺352分割から256分割に減らし、三角形は約24.8万から約13.1万になりました。
翌日には、機体の3Dモデルとメニューの音楽も、使うときに落とす形にしました。最初に読むデータは20.5MB から8.8MB になりました。iPhone 版もブラウザ版と同じ軽いデータを使い、約181MB から約23MB になっています。
名所・橋・街並みの当たり判定
地形だけだと、街も橋も写真の模様でしかありません。そこで60か所すべてに、名所・街のビル・橋・港のクレーン・停泊中の船・送電の鉄塔・灯台・風車・ダムなど約17.7万個を置き、全部に当たり判定(ぶつかったかを調べる仕組み)を付けました。
置く位置は緯度・経度で書き、衛星写真と見比べて橋や岸壁の位置を合わせました。たとえば東京湾では、レインボーブリッジを吊り橋として、両端の緯度・経度と橋桁の高さで置いています。模型は Python で三角形を組んで作りました。形を単純にし、色は頂点に付けるだけで、商標は入れていません。
決まりは次のとおりです。
- ぶつかると機体は墜落し、画面に「衝突」と出ます。
- 橋は橋桁・塔・橋脚だけに判定があり、下をくぐれます。
- 撃っても壊れません。弾は当たって消え、ミサイルはその場で爆発します。
- 敵の AI は3秒先を読み、建物に近づくと上へ逃げます。
斜面に置くと、模型が浮いたり埋まったりします。全部の地面の物に地下の土台を足し、浮いた物は0個になりました。
重さも測りました。置く物のデータは60地域で合計約7.3MB です。ブラウザ版はこれを地域のデータに一緒に入れ、最初の読み込みはほぼ増えていません(9.71MB→9.74MB)。PC では重いステージでも、毎秒55〜56コマのままでした。
使うときの決まり(出典とライセンス)
公開データは無料ですが、決まりがあります。
Terrain Tiles は、場所ごとに元になったデータの出典を書く必要があります。このゲームで使っているのは次のとおりです。
- 標高:Terrain Tiles(AWS Open Data)を加工。SRTM・GMTED2010・3DEP(USGS)、ETOPO1(NOAA)、EU-DEM(Copernicus)。ノルウェーは Kartverket。
- 衛星写真:Copernicus Sentinel-2(出典を書けば商用でも使える)。Sentinel-2 cloudless by EOX(CC BY 4.0)。
出典は最初タイトル画面に出していました。小さい文字が邪魔だったので、設定の「ライセンス」画面に移しています。ストアの説明文の最後にも書いています。
実在の企業・軍とは関係ないことも、ストアの説明文に書いています。機体は型式番号だけで、愛称やメーカー名は出しません。実在の国籍マークも使わず、国ごとに色を変えた架空の円い記章にしました。
まとめ
60か所の地形は、無料の標高データと衛星写真から作れました。 データの傷や海岸線の手直しは、地域ごとに必要でした。 出典とライセンスは、使い始める前に確かめておくと、後で作り直さずに済みます。