遊び方
- タイヤを描く:盤面の中央が車軸です。マス目をなぞると塗れます。中心のマスからつながっている部分だけがタイヤになり、離れた部分は取り除かれます(設計中は薄い網目で出ます)。
- 3本の点線を目印にする:内側の赤い点線は沼が沈める深さ(20cm)、まん中の黄色い点線は階段1段の高さ(26cm)、いちばん外の水色の点線はトンネルの天井(直径70cm)です。黄色の線に届かないタイヤは階段を登れません。外径の半分が赤の線あたりしかないタイヤは、沼で車軸まで潜って車体の腹をこすります。水色の線をはみ出すタイヤはトンネルの入口でつかえて止まります(そこで小さく描き直せば抜けられます)。内側2本が「これに届かないと通れない」下限、外の1本が「これを超えるとつかえる」上限です。
- レースを押す:車は全自動で全開のまま走ります。運転操作はありません。上手い下手ではなく、タイヤの形だけでタイムが決まります。
- 走りながら形を変える:走行中は盤面の右下に小さい格子が出ます。ここをなぞると走っている最中のタイヤがその場で変わります。トンネルでは直径70cm未満の小さい形、砂地と沼では接地の広い形、階段では軸から遠くまで届く形、くねくね道ではまるい形、ギザギザ道では歯のある形——というふうに、区間ごとに履き替えるのがいちばん速い走らせ方です。見本のタイヤのボタンも走行中に押せて、その場で履き替わります。
- つかえても走行は終わりません:進めなくなると盤面に「つかえています」と出るだけで、走行はそのまま続きます。天井につかえた、段を越えられない、沼に刺さった——どれも同じで、右下の格子で形を描き直せば必ず抜けられます。抜ける手のない行き止まりは作っていません。やめたいときだけギブアップを押してください。ギブアップした走行と、上限180秒を使い切った走行は、自己ベストにも全国ランキングにも残りません。
- 変速で力と回転を選ぶ:右の「変速」は力(トルク)と回転の上限を取り替えるボタンです。低い段は力が強いかわりに回転が上がらず、高い段は回転が伸びるかわりに力が出ません。原動機が持てる仕事の量は変わらないので、力を上げれば回転は落ちます。砂地・階段・ギザギザ道・高重力の上りは力、舗装路とくねくね道は回転が効きます。走行中も押せます。
- 区間タイムを見る:舗装路・トンネル・砂地・階段・くねくね道・ギザギザ道・沼・重力変化ゾーンの8区間それぞれの通過タイムが出ます。どの区間が遅かったかを見て、形を直してまた走らせてください。
8つの区間と、効くタイヤ
| 区間 | 道の性質 | 効くタイヤ |
|---|---|---|
| 舗装路 | 平らでよく食いつく | 外周がなめらかで大きいもの |
| トンネル | 高さ70cmの天井が3m続く。触れても終わらず、大きいタイヤは入口でつかえて止まる | 直径70cm未満。抜けたらまた大きく戻せる |
| 砂地 | やわらかいゆるい上り | 接地が長く、沈まないもの |
| 階段 | 26cmの段が6つ | 軸から遠くまで届く歯・十字 |
| くねくね道 | 波長1.12mの波が5つ続く | 外周が真円に近い、出っぱりの無いもの |
| ギザギザ道 | よく滑る鋸歯(1山30cm・高さ14cm)のゆるい上り | 谷まで届く歯・足があるもの |
| 沼 | 粒の集まり。最大20cm沈み、速いほど粘る | 接地が広くて浅くしか沈まないもの |
| 重力変化ゾーン | 前半0.42gの起伏、後半1.85gの上り | 前半は大径、後半は小径。ひとつでは兼ねられない |
同じくらいの外径で形だけ変えた実測が、いちばん分かりやすい証拠です(秒)。
| 形(外径) | 舗装路 | トンネル | 砂地 | 階段 | くねくね道 | ギザギザ道 | 沼 | 重力変化 | 合計 |
|---|---|---|---|---|---|---|---|---|---|
| わっか 65cm | 0.59 | 0.86 | 2.15 | 6.97 | 2.71 | 2.96 | 2.20 | 2.09 | 21.70 |
| 歯車12枚 63cm | 0.62 | 0.88 | 2.88 | 5.25 | 2.96 | 2.46 | 2.86 | 2.81 | 22.01 |
| 十字4本足 57cm | 0.99 | 1.44 | 6.56 | 6.19 | 3.53 | 3.15 | 3.41 | 3.85 | 30.65 |
| 大わっか 80cm(そのまま) | 0.60 | 7.3m 地点でトンネルの入口につかえます(終了ではありません) | — | ||||||
| 小わっか48cm → 12mで大わっか 80cm | 0.67 | 1.05 | 2.80 | 4.85 | 2.85 | 2.93 | 2.06 | 2.37 | 20.73 |
いちばん下の行が、このコースでいまのところいちばん速い走らせ方です。48cm で走り出してトンネルを抜け、抜けた 12m 地点で 80cm の大わっかへ描き替えます。わっか 65cm を1つで通すのに比べると、舗装路で 0.08秒、トンネルで 0.19秒、砂地で 0.65秒、重力変化で 0.28秒 を余分に払います。それでも階段だけで 2.12秒(6.97 → 4.85)を取り返すので、差し引き 0.97秒 速い。トンネルを「大きいタイヤがいちばん効く区間(階段)の手前」に置いてあるので、履き替えの往復に値打ちが出ます。
外径のほぼ同じわっか 65cm と歯車12枚 63cmを並べると、順番がはっきり分かれます。わっかは舗装路・トンネル・砂地・くねくね道・沼・重力変化の6区間で速く、歯車が勝つのは階段(1.72秒差)とギザギザ道(0.50秒差)だけです。そのかわり歯車は砂地で 0.73秒、沼で 0.66秒 損をします。歯は「噛む」ためのもので、噛む相手のいない道では接地を切っているだけだからです。
大きさの綱引きは、重力変化ゾーンの中で起きます。前半は 0.42g で、地面を押す力が足りずに接地が抜けます。ここは外径 80cm の大わっかが 0.85秒、外径 65cm のわっかが 0.92秒 で、大きいほうが速い。ところが 1.85g になる後半の上りでは、必要な力が 4倍以上に増えるのに車輪へ出せる力は 2τ / 外径の半分 しかないので、大わっかは 1.36秒、わっかは 1.16秒 と順番がひっくり返ります。同じ1区間の前半と後半で、速い形が入れ替わるようにしてあります(この2つの数字は、天井を外した走路で 80cm をそのまま走らせて測ったものです。天井のあるコースでは、80cm は先にトンネルでつかえます)。
沼はまた別のものを問います。支える力を 深さ^1.5 × 接地の幅 にしてあるので、同じ重さでも接地が広い形ほど浅く済みます。抵抗は沈んだ深さと速さの積なので、深く刺さる形は速く走ろうとするほど強く引き戻されます。細い歯で立つ十字は沼で 3.41秒(大わっかの 1.85秒 の約1.8倍)かかり、砂地とは違う理由で遅くなります。
トンネルは「大きさの上限」だけを問います。天井は路面から 70cm の水平な板1枚で、当たり判定はタイヤの輪郭の点そのものです。直径 69cm と 71cm はそのまま通り抜けますが、74cm は 8.4m 地点、80cm は 7.3m 地点で入口につかえて止まります。止まっても走行は終わりません。そこで小さく描き直せば抜けられ、抜けたあと大きく戻すこともできます。天井の下でわざと大きくすれば、こんどは中でつかえます(そのときも小さくすれば出られます)。
この計算でやっていること
- 1. 描いた絵を物理の形にする
- まず中心のマスから4方向につながっているマスだけを残します(つながっていない絵は軸に付いていないので落とします)。残った形を角度64方向に区切り、方向ごとに「内半径と外半径」を測って輪の集まりにします。多角形のまま扱うと角の本数だけ計算が増えるので、この畳み方にしました。中抜きの輪っかも、歯が飛び出た歯車も、この形式でそのまま表せます。
- 2. 当たり判定
- 外周(と、その内側6cmごと最大3点)に接地の見本点を置き、1点ずつ地面の高さ表と比べます。めり込んだ深さに比例したばねの力と、近づく速さに比例した減衰を加え、接線方向にはクーロン摩擦(滑り速度 0.35 m/s 以下は線形につないで震えを止める)をかけます。面の向きは、コースの折れ線のその区間の傾きをそのまま使います。高さ表の隣どうしの引き算で傾きを出していたころは段差のふちで向きがなまり、どんなタイヤにも前向きの力が生まれて「ただ乗り」できてしまいました。
- 3. 車輪と車体の分け方
- 接地の力は、車体には車軸の位置に効かせ、車軸まわりのモーメントだけを車輪の回転に渡します。こうしないと同じモーメントを二重に数えます。原動機のトルクは回転が上がるほど落ちる(
τ = τmax(1 − ω/ωmax))ので、大きいタイヤは最高速が伸びて出足が鈍ります。 - 4. 砂地
- やわらかい地面は、ばねを
F ∝ 深さ^1.5にして沈むようにしています。走行抵抗は接地圧(荷重÷接地の長さ)から出していて、同じ重さでも接地が長いタイヤほど軽く、細い歯で立っているタイヤほど深く潜って重くなります。この抵抗は「車輪が前へ進むこと」に逆らう力なので、接地点の速度(転がっていればほぼ0)ではなく車軸の速度で決めています。ここを接地点の速度にしていたころは、砂地がまったく効いていませんでした。 - 5. 沼(粒の集まり)
- 沼は砂よりさらに柔らかく、支える力を
F ∝ 深さ^1.5 × 接地の幅、沈める深さの上限を 20cm にしてあります(舗装・砂は 6cm)。走行抵抗はいちばん深く刺さっている点の深さ × 速さで、砂の「接地圧の平方根」とは効き方が逆向きです。砂は速さに関係なく重く、沼は速く走ろうとするほど強く引き戻します。画面に出ている粒は見た目だけで、力は一切返していません。粒に力を持たせると並びで結果が変わり、同じ形なのにタイムが揺れるからです。粒の数は240で頭打ちにし、毎フレーム触るのは車のまわり±5mだけにしてあります。 - 6. 重力が変わる区間
- 重力は定数ではなく、区間ごとの倍率を 0.30秒の時定数で追いかける値にしてあります。境目で急に切り替えると、接地している車輪が弾かれて結果が跳ねるためです。前半は 0.42g で地面を押す力が足りず、接地が抜けて跳ねます。後半は 1.85g の上りで、必要な力は重力ぶんだけ増えるのに車輪へ出せる力は
2τ / 外径の半分のままなので、大きいタイヤほど登れなくなります。同じ1区間の前半と後半で、速い形が入れ替わります。 - 7. トンネルの天井
- 天井は地面と同じ当て板で、路面から 70cm の高さに水平に1枚あります。触れたら終わり、ではありません。タイヤの輪郭の点が天井に潜り込んだら、いちばん浅く抜けられる向きへ押し返します。入口の縁までの距離のほうが浅ければ横(進行方向の逆)へ、天井そのものへの潜り込みのほうが浅ければ真下へ。だから背の高いタイヤは入口で押し返されて止まり、少しだけ高いタイヤは天井をこすりながら遅く進みます。以前のトンネルは「外径の最大値が天井を超えていたら即終了」だったので、その角度では触れていないのに終了することがありました(歯の1本だけが長い形など)。いまは当たっている点だけが力を受けるので、そのずれが起きません。車体の上面にも同じ当て板を1枚置いてあり、天井の下で大きく描き替えても車体が天井を突き抜けません。
- 8. 進めなくなったとき
- 前へ進めていない時間が 1.5秒 続くとつかえている状態になり、盤面に理由と抜け方が出ます。走行は終わりません。ここで終わらせてしまうと、直す機会そのものが無くなるからです。ひっくり返っても同じで、傾いたまま 0.8秒 が過ぎると運転手が体を振って起き上がろうとします(重心まわりに 450 N・m まで。車体を起こすのに要るのが約 250 N・m なので、跳ね回らない範囲で足ります)。傾きは一周ぶんを畳んだ値で見ています。畳まずに見ていたころは、一度でも宙返りすると「まだ前が浮いている」と誤解してアクセルが全閉のまま戻らず、そこが本物の行き止まりになっていました(実測で見つけて直しました)。走行が終わるのはゴール・上限180秒・ギブアップの3つだけで、後ろの2つは記録に残りません。
- 9. 運転手のふるまいは1つだけ
- 前が浮いたらアクセルを戻します。傾きと、傾きが増える速さの両方を見ています。これが無いと、車輪が段差につっかえた瞬間に原動機の反作用だけで車体が後ろへ一回転してしまい、タイヤの形の比べっこになりませんでした。同じ理由で、原動機の反作用トルクは車体に返していません。前が浮くのは、接地の力が重心より下で前へ押すぶんだけ起こります。
- 10. 決定論
- 物理の刻みは1/600秒で固定、乱数は一切使っていません。コースの形も決め打ちの数表から作ります。さらに三角関数(sin・cos)は自前の多項式に置き換えています。
Math.sinは IEEE754 で結果が決められておらず、実測すると Node と Chrome で最終桁が違い、段差で跳ねる場面ではその差が増幅されて同じタイヤなのに「登った/ひっくり返った」が入れ替わりました。四則演算とMath.floor/Math.sqrtはどの計算機でも答えが一意なので、これでどのブラウザでも1ビットまで同じタイムになります。
省いているのは、サスペンション(車輪は車体に直付けです)、タイヤのたわみ、砂が掘れて跡が残ること、横方向(3次元)の効果です。
設計のコツ
- まず見本を4つとも走らせる:丸・輪・十字・歯車で、区間タイムの並びががらりと入れ替わります。そこから自分の形を作るのがいちばん早道です。
- 外周は途切れさせない:舗装路と砂地は、接地が切れるたびに速度を失います。歯を伸ばすなら、歯と歯のあいだの輪も残してください。
- 階段は「届く長さ」:段の角を掴めるかどうかで決まります。外周のなめらかさは階段ではむしろ不利です。
- ギザギザ道は歯がないと登れない:路面がよく滑るので、なめらかな外周は山の上で空転します。谷まで届く歯や足を残してください。
- 沼は接地の広さ:細い歯だけで立つ形は同じ重さでも深く刺さります。歯を伸ばすなら、そのあいだの輪も残して接地を広げてください。
- トンネルは「小さく入って大きく出る」:直径70cmを超える形は入口でつかえます。つかえてから描き直しても抜けられますが、そのぶん 2〜3秒 損をします。最初から小さめで走り出し、12m地点で大きく描き替えるのがいまのところいちばん速い走らせ方です(20.73秒)。
- つかえたら形を変える。それでだめならギブアップ:走行は勝手に終わりません。どの区間にも必ず抜ける形があるので、まず描き替えてみてください。ギブアップした走行は記録に残らないので、粘っても損はしません。
- 材料は170マス:全部を中身の詰まった円盤に使うと外径が小さくなります。中を抜いて外周に回すと、同じ材料で大きなタイヤになります。ただし中抜きは重心から遠いぶん回りにくくなります(回転の慣性が増えます)。
よくある質問
- タイヤレースはどうやって遊びますか?
- 25×25のマス目にタイヤの断面を描きます。中心が車軸で、そこからつながっているマスだけがタイヤになります。描き終わってレースを押すと、その形がそのまま物理計算にかかり、車が全自動で走り出します。舗装路・トンネル・砂地・階段・くねくね道・ギザギザ道・沼・重力変化ゾーンの8区間の通過タイムと、ゴールまでの合計タイムが記録になります。
- 描いた形は本当に走りに効きますか?
- 効きます。描いたマス目から角度ごとの内半径と外半径を作り、その輪郭の点で地面と当たり判定をしています。同じ外径で形だけ変えて実測すると、なめらかな輪は舗装路 1.45秒・階段 6.97秒、同じ大きさの歯車は舗装路 1.50秒・階段 5.25秒でした。輪は平地で速く階段でいちばん遅く、歯は逆になります。
- どんなタイヤが速いですか?
- 区間ごとに違います。舗装路・砂地・くねくね道は、接地が途切れないなめらかな外周が有利です。トンネルは直径70cm未満でないと入口でつかえます。階段は外周のなめらかさより「軸からどこまで届くか」が効き、歯や十字が段の角を掴んで登ります。ギザギザ道はよく滑る細かい鋸歯なので、なめらかな外周は山の上で空転し、谷に届く歯だけが登れます。沼は接地の広さが効いて、細い歯で立つ形ほど深く沈みます。重力変化ゾーンは前半が0.42g・後半が1.85gの上りで、前半は大きいタイヤ、後半は小さいタイヤに有利が入れ替わります。ひとつの形で全部に寄せられないところが設計の中心です。
- 途中で走行が終わってしまうことはありますか?
- ありません。進めなくなっても、ひっくり返っても、走行は続きます。進めていないときは「つかえています」と出て、なぜ止まっているかと抜け方が同じ場所に出るだけです。走行が終わるのはゴールしたとき・上限の180秒を使い切ったとき・自分でギブアップを押したときの3つだけです。あとの2つは自己ベストにも全国ランキングにも残らないので、粘っても損はしません。
- つかえて抜けられなくなることはありませんか?
- ありません。どの区間にも必ず抜ける形があります。天井につかえたら小さく、段を越えられないなら軸から遠くまで届く形に、沼に刺さったら接地の広い形に描き替えてください。走行中に描き替えられるのは右下の小さい格子です。トンネルの天井の下でわざと大きくすれば中でつかえますが、そこでも小さくすれば出られます。抜ける手のない行き止まりが作られていないことは、8区間それぞれで「わざと不向きな形に替えて、つかえてから描き直す」自動プレイを走らせて確かめています。
- トンネルはどうすれば抜けられますか?
- 天井は路面から70cmです。直径70cm未満のタイヤはそのまま通り抜けます。それより大きいタイヤは入口でつかえて止まりますが、終了ではありません。実測では直径74cmが8.4m地点、80cmが7.3m地点で止まります。そこで小さく描き直せば抜けられ、抜けたあとまた大きく戻せます。その先の砂地・階段・沼・低重力は大きいタイヤが速いので、小さく入って大きく出るのがいちばん速い走らせ方です。
- 軸から離れた場所に描くとどうなりますか?
- 中心のマスからつながっていない部分は、タイヤとして成り立たないので取り除かれます。設計中は薄いグレーの網目で表示され、材料としても数えません。中心のマスが空のまま描くと、何も残らないので走り出せません。
- 同じタイヤなら毎回同じタイムになりますか?
- なります。物理の刻みは1/600秒で固定で、走りの計算に乱数は一切使っていません。コースの形も決め打ちの数表から作っているので毎回同じです。沼に見えている粒の置き場所だけは決め打ちの種から作った擬似乱数で決めていますが、粒は見た目だけで力を返していないので、タイムには1ミリも影響しません。同じ形を描けば、何度走らせても同じ結果になります。
- データは保存・送信されますか?
- 描いたタイヤと自己ベストを、お使いのブラウザのlocalStorageに保存します。閉じても続きから遊べます。計算はすべてブラウザ内で完結し、外部サーバーへの送信は一切行いません。