ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】電車の車輪が脱線しない仕組みを視覚化する。

成果物

www.youtube.com
コルクを二つくっつけたような形のものを正確に物理演算できれば問題ないのですが、かなりの精度が必要となるため、実際にはうまくできません。そこで、数学的に、計算することで解決しました。
なぜこの形だと脱線しないのかについては、こちらの実験などをご覧ください。
電車にはハンドルがないのになぜカーブを曲がれるのか 東京大学で勉強してきた - ITmedia NEWS

仕組み

※ここでは単純化して説明しています。
 \begin{array}{l}
※車輪は両端の半径が0、真ん中の半径がrです。\\
車輪が接しているところの半径Lr,Rrは車輪の両端からの距離dstL,R、車輪の長さwlから求められます。\\
Lr\ =\ dstL/wl*r*2;\\
Rr\ =\ dstR/wl*r*2;\\
車輪は円軌道を描きます。またその円の中心とそれに近い方の車輪の接点の距離xは\\
\ x\ =\ wl*Rr/( Lr-Rr)\\
atan2で車輪の角度を求めます。\\
float\ theta\ =\ atan2( B.y-A.y,\ B.x-A.x)\\
円軌道上で移動する角度を定数speedを使って求めます。\\
float\ dtheta\ =\ -speed/x;\\
※LrとRrのどちらが大きいかで場合分けします。詳しくはこちらをコードをご覧ください。\\
円軌道の中心aor、aorと車輪の近い端の距離dstB\_aorは\\
aor\ =\ PVector.add( interR,\ PVector.fromAngle( theta) .mult( x))\\
dstB\_aor\ =\ PVector.dist( B,\ aor)\\
円軌道にそって、新しい位置を求めます。これを繰り返すと結果が得られます。\\
newB=aor+PVector.fromAngle( theta+dtheta) \cdotp ( -dstB\_aor))\\
newA=aor+PVector.fromAngle( theta+dtheta) \cdotp ( -dstB\_aor-wl))
\end{array}

コード

Mechanism of train wheel という名前で追加しています。
github.com