マガジン

軌道ゲームで重力を2倍にしたら、どんな軌道が可能になるか

遊びを見つける

執筆にClaudeを使用しています。

紙の飛行機が、海辺の小さな街と山の上を飛んでいく絵。
記事のテーマをもとに制作したAI生成イメージ。実際のゲーム画面ではありません。

発射角度と初速を決めて、星の引力で曲がる軌道をゲートに通すゲームがあります。アソバースの公式作品「小さな軌道」もその一つです。星の重力が今の2倍になったら、ゲートに届く角度と初速の組み合わせは増えるのでしょうか。減るのでしょうか。それとも、初速の目盛りを読み替えるだけで同じ問題に戻るのでしょうか。 この記事は、その答えを読む前に自分の手で出すための実験の設計書です。重力の値だけを変えた簡易シミュレーターを短いコードで作り、「どの角度・どの初速ならゲートに入るか」を重力1倍と2倍で並べて比べます。結果は書きません。見るのは、到達できる場所がどう動くかという一点です。 なお、公式作品の内部の計算式や重力の値は、確認済みの情報にありません。そのためこの記事では作品本体には触れず、「引力で曲がる軌道」という同じ発想の自作版で実験します。自作版の結果が公式作品の挙動と同じとは限りません。公式作品との照らし合わせは、最後に作品を開いて行います。

この記事の目次
  1. 実験の前に立てる予想
  2. 準備するもの:50行足らずの簡易シミュレーター
  3. 手順と記録の取り方
  4. 結果の読み方
  5. 起こりやすい誤り
  6. 次の行動

実験の前に立てる予想

先に、物理から導ける予想を一つ立てておきます。これは結果ではなく、あとで自分の記録と突き合わせる仮説です。

ニュートンの万有引力では、星から距離 r の位置の加速度は G×M÷r² で決まります(G は重力の強さ、M は星の質量)。円軌道に乗る速さは √(GM÷r)、星から飛び去れる脱出速度は √(2GM÷r) です。どちらも G を2倍にすると約1.41倍(√2倍)になります。

ここから次の予想が立ちます。重力を2倍にして、初速も約1.41倍にすれば、軌道の形は元と同じになり、経過時間だけが約0.71倍(1÷√2)に縮むはずです。この予想が正しければ、重力2倍の世界は「初速の目盛りが√2倍に伸びただけ」の世界になります。

ただし、ゲームには初速の上限があります。同じ形の軌道を作るのに必要な初速が1.41倍になると、上限の中では届かなくなる軌道が出てくるはずです。逆に、上限の範囲に収まる範囲で見ると、遠回りの軌道や星に落ちやすい軌道の分布が変わるはずです。この「上限があるから形が同じでも到達できる範囲は変わる」という点が、実験の中心の問いです。

準備するもの:50行足らずの簡易シミュレーター

必要なのはブラウザとテキストエディタだけです。次のコードを orbit.html として保存し、ブラウザで開いてください。外部ライブラリもサーバーも使いません。

html
<pre id="out"></pre>
<script>
const M=1, start={x:-3,y:0}, gate={x:3,y:2,r:0.4};
const dt=0.01, tmax=30, starR=0.5;
// 1回の発射:ゲートに入れば1、それ以外は0
function fly(G,ang,v){
  let x=start.x, y=start.y;
  let vx=v*Math.cos(ang), vy=v*Math.sin(ang);
  for(let t=0;t<tmax;t+=dt){
    const r=Math.hypot(x,y);
    if(r<starR||r>20) return 0;      // 星に衝突、または遠く離れた
    const a=G*M/(r*r*r);
    vx-=a*x*dt; vy-=a*y*dt;
    x+=vx*dt; y+=vy*dt;
    if(Math.hypot(x-gate.x,y-gate.y)<gate.r) return 1;
  }
  return 0;
}
// 初速0.2〜2.0を縦、角度-180〜174度(6度刻み)を横に並べる
function grid(G){
  let rows=[], count=0;
  for(let i=10;i>=1;i--){
    const v=i*0.2;
    let row=v.toFixed(1).padStart(4)+" ";
    for(let a=-180;a<180;a+=6){
      const hit=fly(G,a*Math.PI/180,v);
      count+=hit; row+=hit?"#":".";
    }
    rows.push(row);
  }
  return rows.join("\n")+"\n到達数 "+count;
}
out.textContent="G=1\n"+grid(1)+"\n\nG=2\n"+grid(2);
// 予想の確認:G=2で初速を√2倍にすると、G=1と同じ結果か
let same=0,total=0;
for(let i=1;i<=10;i++)for(let a=-180;a<180;a+=6){
  const v=i*0.2, r=a*Math.PI/180;
  total++; if(fly(1,r,v)===fly(2,r,v*Math.SQRT2)) same++;
}
out.textContent+="\n\n相似の一致 "+same+"/"+total;
</script>

画面には、縦軸が初速、横軸が発射角度の文字の表が2つ出ます。# がゲートに入った組み合わせ、. が入らなかった組み合わせです。その下に、予想を確かめる一致数が出ます。

設定の意味は次のとおりです。

  • 星は原点にあり、発射位置は左(-3, 0)、ゲートは右上(3, 2)で半径0.4です。星とゲートを結ぶ直線は星から離れて通るので、直進に近い軌道でも星に当たりません。
  • 星の半径は0.5で、そこに入ったら衝突として失敗にします。
  • 初速は0.2〜2.0の10段階です。この上限(2.0)がゲームの「初速の上限」に相当します。

数値の単位は、この試作の中で閉じた任意の単位です。現実の距離や速度とは対応しません。

手順と記録の取り方

実験は4段階で進めます。

  1. そのまま実行する。 G=1 と G=2 の表を見比べます。まず、# が増えたか減ったかだけを眺めます。ここでは解釈を急がず、目で見た印象を一行メモします。
  2. 数字で記録する。 次の項目を、G=1 と G=2 それぞれで書き出します。
  • 到達数(# の総数)
  • ゲートに入る最小の初速(# がある一番下の行の初速)
  • 初速ごとの # の個数(行ごとの数)
  • 連続する # の幅(ゲートを狙える角度の幅。6度刻みなので「何マス分」で数えます)
  1. 条件を一つずつ変える。 変える項目は1回に一つだけにします。次のとおり3種類を試します。
  • 星の位置はそのままで、G を 1、1.5、2、3 にして到達数を並べます。
  • ゲート位置を(3, 2)から別の場所に動かします。星の裏側(例:(3, -0.5)付近)のように、直進では星をまたぐ位置も入れます。
  • 角度の刻みを6度から3度に細かくします。刻みが粗いと、細い成功の帯を見逃します。
  1. 予想を確かめる。 最後に出る「相似の一致」を読みます。一致しなかった組み合わせは、どの初速・角度なのかを書き出します。

記録は、次のような表にまとめると比べやすくなります。

  • 1、到達数:、最小の初速:、最も狙いやすい行の # 数:、備考:
  • 2、到達数:、最小の初速:、最も狙いやすい行の # 数:、備考:

条件を変えるたびに行を足します。同じ設定を2回走らせて同じ数字になることも確かめてください。この試作は乱数を使わないので、同じ設定なら毎回同じ表になるはずです。違っていたら、コードの書き写しミスを疑います。

結果の読み方

出た表は、次の順で判断します。

到達数が増えたか。 増えたなら、重力が強いほど曲がり方が大きく、ゲートに向かう経路が広がったと読めます。減ったなら、星に落ちる軌道や曲がりすぎる軌道が増えた可能性があります。どちらの場合も、# と . の分布が表のどこにあるかを見て理由を考えます。

# の場所が表の上下にずれたか。 予想どおりなら、G=2 の # は G=1 より高い初速の側に動きます。脱出速度や円軌道の速さが約1.41倍になるからです。上限(2.0)の近くで # が途切れているなら、上限が境目になって届かない軌道があると読めます。

相似の一致がどうなったか。 一致数が全体に近ければ、「重力2倍=初速の目盛りが√2倍」という予想は、この試作の範囲で支持されます。一致しない組み合わせが残る場合は、次の2つを疑います。

  • 計算の刻み(dt)が粗いために誤差が出た。dt を 0.005 にして一致数が変わるかを見ます。
  • 打ち切り時間(tmax)の影響。同じ形の軌道は G=2 だと約0.71倍の時間で進むので、tmax が同じなら G=2 のほうが余分に長く飛ぶことになります。周回したあと、あとからゲートに入る場合は、一致しなくなることがあります。

dt を変えても一致数が変わらない組み合わせは、刻みの誤差ではなく、時間の打ち切りや形の違いが原因だと考えられます。逆に、刻みを細かくすると一致数が変わるなら、元の差は誤差の側に原因があります。

ゲート位置を変えたとき。 星の裏側にゲートを置くと、直進では届かず、星を回り込むような軌道が必要になります。このとき # が表のどこに現れるかを G=1 と G=2 で見ます。重力が強いほど回り込みが急になると予想できるので、必要な角度のずれが変わるかを確かめてください。

起こりやすい誤り

実験を壊しやすい点を挙げておきます。

  • 条件を同時に2つ変える。 G と初速上限を一緒に変えると、どちらの効果か分かりません。1回に変えるのは一つです。
  • 刻みの粗さを結果と取り違える。 角度6度刻みでは、細い成功の帯が見えないことがあります。到達数の増減が小さいときは、3度刻みでも確認してください。
  • dt を大きくしすぎる。 星のすぐ近くを通る軌道は、刻みが大きいと実際より大きくずれます。dt を半分にして結果が大きく変わるなら、その行は信頼しません。
  • 星の衝突判定を忘れる。 半径0.5より内側に入った軌道を失敗にしているので、この値を変えると到達数が大きく動きます。変えたら必ず記録に残します。
  • 相似の一致を完全一致だけで判断する。 刻みや時間の打ち切りの影響で、少数の不一致は起こりえます。数と場所の両方を見て判断します。
  • 自作版の結果を公式作品にそのまま当てはめる。 公式作品の計算式や仕様は、この記事では確認できません。自作版で見えたのは「この式のもとでの傾向」です。

次の行動

まず orbit.html を作り、G=1 と G=2 の表を並べて、到達数と最小の初速を記録してください。そのうえで、アソバースの「小さな軌道」を開き、3つの星系それぞれで点線の全軌道予測と前回の軌道を見比べます。ゲートに届く角度や初速の幅が星系ごとにどう違うかを観察すると、自作版の表の読み方が確かめやすくなります。予測の点線を消して挑んだときの「勘」と、試作の表を見比べるのも一つの方法です。