遊び方
- タイヤを描く:盤面の中央が車軸です。マス目をなぞると塗れます。中心のマスからつながっている部分だけがタイヤになり、離れた部分は取り除かれます(設計中は薄い網目で出ます)。
- 2本の点線を目印にする:内側の点線は階段1段の高さ、外側の点線はトンネルの天井の高さの半分です。内側の線に届かないタイヤは階段を登れず、外側の線をはみ出すタイヤはトンネルを通れません。この2本のあいだが、どちらも越えられる大きさです。
- レースを押す:車は全自動で全開のまま走ります。運転操作はありません。上手い下手ではなく、タイヤの形だけでタイムが決まります。
- 走りながら形を変える:走行中は盤面の右下に小さい格子が出ます。ここをなぞると走っている最中のタイヤがその場で変わります。砂地では外周の長い形、階段では軸から遠くまで届く形、トンネルでは直径の小さい形——というふうに、区間ごとに履き替えるのがいちばん速い走らせ方です。見本のタイヤのボタンも走行中に押せて、その場で履き替わります。
- 変速で力と回転を選ぶ:右の「変速」は力(トルク)と回転の上限を取り替えるボタンです。低い段は力が強いかわりに回転が上がらず、高い段は回転が伸びるかわりに力が出ません。原動機が持てる仕事の量は変わらないので、力を上げれば回転は落ちます。砂地と階段は力、舗装路とトンネルは回転が効きます。走行中も押せます。
- 区間タイムを見る:舗装路・砂地・階段・トンネルの4区間それぞれの通過タイムが出ます。どの区間が遅かったかを見て、形を直してまた走らせてください。
4つの区間と、効くタイヤ
| 区間 | 道の性質 | 効くタイヤ |
|---|---|---|
| 舗装路 | 平らでよく食いつく | 外周がなめらかで大きいもの |
| 砂地 | やわらかいゆるい上り | 接地が長く、沈まないもの |
| 階段 | 26cmの段が6つ | 軸から遠くまで届く歯・十字 |
| トンネル | 天井が66cmしかない | 直径が66cm未満の小さいもの |
同じくらいの外径で形だけ変えた実測が、いちばん分かりやすい証拠です。
| 形(外径) | 舗装路 | 砂地 | 階段 | トンネル | 合計 |
|---|---|---|---|---|---|
| わっか 65cm | 1.45 | 2.15 | 6.97 | 1.87 | 13.60 |
| 歯車12枚 63cm | 1.50 | 2.88 | 5.24 | 1.92 | 12.83 |
| 歯車6枚 63cm | 2.04 | 5.16 | 5.98 | 2.74 | 17.45 |
| 8本足 59cm | 2.16 | 6.00 | 6.03 | 2.42 | 18.10 |
| 十字4本足 57cm | 2.44 | 6.56 | 6.17 | 2.71 | 19.41 |
わっかは舗装路・砂地・トンネルの3区間で最速なのに、階段だけは最下位です。歯や足を生やすとその順番がひっくり返ります。歯車12枚は階段でわっかより 1.73秒速く、そのぶん砂地で 0.73秒 損をします。歯を減らして粗くする(歯車6枚)と接地が途切れるので、平地も砂地も一気に落ちます。
そして階段とトンネルは正面からぶつかります。階段は大きいほど楽で、トンネルは大きいと通れません。実測では外径 65cm のわっかは階段 6.97秒でトンネルも 1.87秒で抜けられますが、外径 71cm まで太らせると階段は 5.99秒 まで縮む代わりに、トンネルの入口(28m 地点)で天井につかえて止まりました。「階段のために大きくしたい」「トンネルのために小さくしたい」の綱引きが、このゲームの設計の芯です。
この計算でやっていること
- 1. 描いた絵を物理の形にする
- まず中心のマスから4方向につながっているマスだけを残します(つながっていない絵は軸に付いていないので落とします)。残った形を角度64方向に区切り、方向ごとに「内半径と外半径」を測って輪の集まりにします。多角形のまま扱うと角の本数だけ計算が増えるので、この畳み方にしました。中抜きの輪っかも、歯が飛び出た歯車も、この形式でそのまま表せます。
- 2. 当たり判定
- 外周(と、その内側6cmごと最大3点)に接地の見本点を置き、1点ずつ地面の高さ表と比べます。めり込んだ深さに比例したばねの力と、近づく速さに比例した減衰を加え、接線方向にはクーロン摩擦(滑り速度 0.35 m/s 以下は線形につないで震えを止める)をかけます。面の向きは、コースの折れ線のその区間の傾きをそのまま使います。高さ表の隣どうしの引き算で傾きを出していたころは段差のふちで向きがなまり、どんなタイヤにも前向きの力が生まれて「ただ乗り」できてしまいました。
- 3. 車輪と車体の分け方
- 接地の力は、車体には車軸の位置に効かせ、車軸まわりのモーメントだけを車輪の回転に渡します。こうしないと同じモーメントを二重に数えます。原動機のトルクは回転が上がるほど落ちる(
τ = τmax(1 − ω/ωmax))ので、大きいタイヤは最高速が伸びて出足が鈍ります。 - 4. 砂地
- やわらかい地面は、ばねを
F ∝ 深さ^1.5にして沈むようにしています。走行抵抗は接地圧(荷重÷接地の長さ)から出していて、同じ重さでも接地が長いタイヤほど軽く、細い歯で立っているタイヤほど深く潜って重くなります。この抵抗は「車輪が前へ進むこと」に逆らう力なので、接地点の速度(転がっていればほぼ0)ではなく車軸の速度で決めています。ここを接地点の速度にしていたころは、砂地がまったく効いていませんでした。 - 5. 運転手のふるまいは1つだけ
- 前が浮いたらアクセルを戻します。傾きと、傾きが増える速さの両方を見ています。これが無いと、車輪が段差につっかえた瞬間に原動機の反作用だけで車体が後ろへ一回転してしまい、タイヤの形の比べっこになりませんでした。同じ理由で、原動機の反作用トルクは車体に返していません。前が浮くのは、接地の力が重心より下で前へ押すぶんだけ起こります。
- 6. 決定論
- 物理の刻みは1/600秒で固定、乱数は一切使っていません。コースの形も決め打ちの数表から作ります。さらに三角関数(sin・cos)は自前の多項式に置き換えています。
Math.sinは IEEE754 で結果が決められておらず、実測すると Node と Chrome で最終桁が違い、段差で跳ねる場面ではその差が増幅されて同じタイヤなのに「登った/ひっくり返った」が入れ替わりました。四則演算とMath.floor/Math.sqrtはどの計算機でも答えが一意なので、これでどのブラウザでも1ビットまで同じタイムになります。
省いているのは、サスペンション(車輪は車体に直付けです)、タイヤのたわみ、砂が掘れて跡が残ること、横方向(3次元)の効果です。
設計のコツ
- まず見本を4つとも走らせる:丸・輪・十字・歯車で、区間タイムの並びががらりと入れ替わります。そこから自分の形を作るのがいちばん早道です。
- 外周は途切れさせない:舗装路と砂地は、接地が切れるたびに速度を失います。歯を伸ばすなら、歯と歯のあいだの輪も残してください。
- 階段は「届く長さ」:段の角を掴めるかどうかで決まります。外周のなめらかさは階段ではむしろ不利です。
- トンネルの点線をはみ出さない:どんなに良い形でも、直径が66cmを超えたら止まります。まずこの線に収めてから中身を考えてください。
- 材料は170マス:全部を中身の詰まった円盤に使うと外径が小さくなります。中を抜いて外周に回すと、同じ材料で大きなタイヤになります。ただし中抜きは重心から遠いぶん回りにくくなります(回転の慣性が増えます)。
よくある質問
- タイヤレースはどうやって遊びますか?
- 25×25のマス目にタイヤの断面を描きます。中心が車軸で、そこからつながっているマスだけがタイヤになります。描き終わってレースを押すと、その形がそのまま物理計算にかかり、車が全自動で走り出します。舗装路・砂地・階段・低いトンネルの4区間の通過タイムと、ゴールまでの合計タイムが記録になります。
- 描いた形は本当に走りに効きますか?
- 効きます。描いたマス目から角度ごとの内半径と外半径を作り、その輪郭の点で地面と当たり判定をしています。同じ外径で形だけ変えて実測すると、なめらかな輪は舗装路 1.45秒・階段 6.97秒、同じ大きさの歯車は舗装路 1.50秒・階段 5.24秒でした。輪は平地で速く階段でいちばん遅く、歯は逆になります。
- どんなタイヤが速いですか?
- 区間ごとに違います。舗装路と砂地は、接地が途切れないなめらかな外周が有利です。階段は外周のなめらかさより「軸からどこまで届くか」が効き、歯や十字が段の角を掴んで登ります。低いトンネルは直径が天井を超えると通れないので、大きいタイヤが不利になります。階段は大きく、トンネルは小さく、という綱引きが設計の中心です。
- 軸から離れた場所に描くとどうなりますか?
- 中心のマスからつながっていない部分は、タイヤとして成り立たないので取り除かれます。設計中は薄いグレーの網目で表示され、材料としても数えません。中心のマスが空のまま描くと、何も残らないので走り出せません。
- 同じタイヤなら毎回同じタイムになりますか?
- なります。物理の刻みは1/600秒で固定、乱数は一切使っていません。コースの形も決め打ちの数表から作っているので毎回同じです。同じ形を描けば、何度走らせても同じ結果になります。
- データは保存・送信されますか?
- 描いたタイヤと自己ベストを、お使いのブラウザのlocalStorageに保存します。閉じても続きから遊べます。計算はすべてブラウザ内で完結し、外部サーバーへの送信は一切行いません。