ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

レールの曲率からFredoScale Radial Bendingで曲げる角度を計算する方法

毎回考えるのは面倒なのでメモ。

レールの曲率半径をR、レールの長さをdとし、これらからレールを曲げる角度βを求める。

このレールは円周:2πRの一部である。すなわち、円周長さを1としたとき、レール長さはd/2πRである。ゆえに、角度表記にすると、これは角度θ=360d/2πRの円弧である。

f:id:donadonasan:20190818230756p:plain

角度計算

Radial Bendingで使う角度は、もとの直線に対し何度曲げるか(上図のβ)なので、θからこれを求める。円弧と各直線は接しているので、円の中心から接点に伸ばした直線と接線のなす角度は90°。ゆえにαは180-θ。ゆえにβ=180-α=θ。シンプルである。

ゆえに、β=360d/2πR。

線路曲げメモ

SketchUp!で下記自作線路を曲げる際のメモ。

枕木は34本あるので、間の33箇所を曲げる。厳密にはペーシも曲げなきゃいけないけど、位置合わせが大変になりそうなので割愛する。

後の作業のため、真ん中に補助線を入れて全体をグループ化する。

その後、FredoScaleよりRadial Bendingを選択し、R=107ならば13.1°曲げる。TABキーで分割数を変更し忘れないように。

シングルスレッドで頑張りやがるため、数十分放置したら出来上がり。

自動連結器

今日は自動連結器づくり。できればすべて物理シミュレーションで動くようにしたいけど、さすがに無理かなあ。でもまずはチャレンジ。以下、メモ。

可動範囲

自動連結器は前後・左右方向に緩衝器がある。しかし、この可動範囲が分からない。日本大百科全書の図から、前後左右それぞれナックル1個分にしてみようか。

kotobank.jp

ロック(錠)

ロックピンは、ナックルの動きを邪魔したり開放したりすることでロック機能を実現する。これだけならUnityでシミュレーションできる気がするけど、並形自動連結器のロックピンはロック解除するとナックルが開くまでピンが解除位置に留まるという機能がある。

f:id:donadonasan:20190816154150p:plain

ロックピン端部の形状(https://www.youtube.com/watch?v=Z8gd4jh_V88より)

このへんの機構は、以下の動画がすごく勉強になりました。ありがとうございます。

www.youtube.com

でも、このへんをUnityの物理演算だけで実現しようとするとチューニングが大変なので、ここはC#で実現することにする。すなわち、ロックピンの状態として

  • Open (ロックピンはナックルの上に乗っておりナックルの動きを制限しない)
  • Close(ロックピンはナックルの横に落ちており動きを制限している)
  • ForcedOpen(ロックピンは端部突起に引っかかっておりナックルの動きを制限しない)

の3つを定義し、ロック解除時の状態遷移は下記とする。

  1. ロックピンを持ち上げる。(Open, Closeの判定は毎フレーム実施)
  2. ロックピンの状態がCloseからOpenとなったら、ForcedOpenに変更し、ロックピンの位置を固定する。
  3. ナックルがある程度開いたら、ForcedOpenからOpenに変更し、ロックピンの位置固定を解除する。

これでたぶん行ける。

今日の進捗

DE10が比較的滑らかにカーブを通過するようになった。

こいつのチューニングはきりがないので一旦やめて、次はレールの継ぎ目で音が出る仕掛けと、レールを簡単に繋げるための仕掛けを実装しよう。

UnityのConfigurable Jointでバネを設定する方法

UnityでConfigurable Jointを使って単一方向にのみ動くバネを作ろうとして、問題にぶつかったので回避策を含めメモ。

UnityでSpring Jointを使うと全方向に動くバネができる。しかし、これはサスペンションなどの用途には向かない。このような場合はConfigurable Jointを使えば可動軸を指定したSpringを実装できる。・・・はずだった。

しかし、なぜかバネとして動いていないように見える。さっそく簡単なSceneで検証してみたところ、本当に動いていなかった。そこでバネに関連しそうなパラメータを色々弄っていたところ、Linear Limit中のLimitが0より大きいときにバネとして動くことが判明。Unityのマニュアルを見ると、パラメータの説明には該当情報が無いが後半の「弾みとバネ」に、「Spring プロパティーで 0 を上回る値に設定すると」とこっそり書いてあった。そういう大事なことは、パラメータ説明にも書いてくれ。以下、検証動画。

鉄道車両の車輪をCapsleColliderで模擬してみる(カーブ通過編)

ふと、踏面だけでカーブを通過できるか試したくなってきたのでやってみた。

結果:いける。

課題:上下動がやはり目立つ。おそらく、カーブレールのポリゴンが原因。直線の組み合わせでできているため、理想の曲線から内外にはみ出る箇所があり、その結果CapsleColliderの球面に当たる場所が変わり上下動している。

課題の対策:サスペンションをつけるか、CapsleColliderを諦める。

対策どうしようかなあ。今、レールの継ぎ目を通過する音を、車輪の上下方向加速度をトリガーに鳴らしているんだけど、これとポリゴン起因の上下動を区別できないっぽいのよね。CapsleColliderによるカーブを諦めるのが最適解か?