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

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

並形自動連結器の実装(今度こそ終わりVer.)

色々苦労したけれど、並形自動連結器の実装が終わったはずなので一旦まとめ。

目次

並形自動連結器の外観モデル

シーマ(仮)さんのワム80000 mmdモデルより拝借。一旦Blenderに部品単位で取り込み、それぞれfbx形式でエクスポートして作成。

f:id:donadonasan:20190905235335p:plain

並形自動連結器の外観


並形自動連結器は本体、ナックル、ロックピン(錠)の3部品から成る。それぞれ、以下のような形状。

f:id:donadonasan:20190905235443p:plain

並形自動連結器本体の外観

f:id:donadonasan:20190905235842p:plain

並形自動連結器のナックル外観

f:id:donadonasan:20190905235945p:plain

並形自動連結器のロックピン(錠)外観

並形自動連結器の動作原理

連結器が開放されている状態では、ロックピン(下図の青線で囲まれているもの)はナックル後部の平らなところに乗っている。この状態では、ナックルは自由に回転することができる。

f:id:donadonasan:20190906000507p:plain

連結器が開放されている状態

しかし、ナックルが回転して連結器が閉じた状態になると、ロックピンを支えていたナックルの平らな部分が居なくなってしまい、ロックピンは下に落ちる。こうなると、ナックルはもう開けなくなりロックされる。このように、閉じると自動的にロックがかかるため自動連結器と呼ばれるらしい。

f:id:donadonasan:20190906000710p:plain

連結器が閉じている状態

ナックルは、連結相手のナックル(下図の青線で囲まれているもの)がロックピンを支えていた平らな部分に当たることで回転する。よくできている。

f:id:donadonasan:20190906001611p:plain

ナックルがナックルを回転させる

そして、連結されるとこのように前後左右どちらに動いても外れないようにナックルと本体がうまく噛み合う。

f:id:donadonasan:20190906001854p:plain

並形自動連結器の連結状態

物理モデル

以上の挙動をUnityで実装するには、多くの課題がある。最大の課題は、モノとモノの衝突判定の制約だ。Unityでは凹みを持つ形状(メッシュ)の当たり判定ができない(動くことのない、Staticなものを除く)。そのため、ナックルや本体のような凹みだらけで凹みが大事なものの衝突判定をするには、これを複数の凹みを持たない当たり判定に分割する必要がある。今回は、必要最低限の当たり判定を、複数の長方形やカプセル型の判定で実現することにした。

最低限必要な当たり判定とは、以下を実現するものである。

  1. ロックピンを支える当たり判定
  2. ロックピンに当たり、ナックルの回転を妨げる当たり判定
  3. 相手のナックルに当たり、相手のナックルを回転させる当たり判定
  4. 相手のナックルに当たり、自分を回転させる当たり判定
  5. 連結状態にて前後左右の挙動を制約する当たり判定
  6. ロックピンがすっぽ抜けないようにする当たり判定

これらのうち、1, 2は兼用可能、また4, 5の一部にもできそうである。そこで、大きく以下の当たり判定を作ることにした。

  1. ナックル後部の平らな板
  2. ナックル前部~側面の相手ナックルに当たる部分
  3. 本体のうち相手ナックルに当たる部分
  4. 本体のうちロックピンを受け止める部分
  5. ロックピン自身の当たり判定

その結果、以下のようになった。緑の線が当たり判定である。

f:id:donadonasan:20190906003027p:plain

並形自動連結器 本体の当たり判定

f:id:donadonasan:20190906003112p:plain

ナックルの当たり判定

f:id:donadonasan:20190906003246p:plain

ロックピンの当たり判定

ロックピンの当たり判定や、ナックル後部の当たり判定は連結時のガタツキをへらすために若干見た目からずらしている。

また、当たり判定以外にも各部品の相対位置や角度をJointにより制約している。このモデルでは計3つのジョイントを使っている。

  1. ロックピン - 本体間のConfigurableJoint
    ロックピンが本体に対し上下方向にのみ自由に動けるように制約している。
  2. 本体 - ナックル間のHingeJoint
    本体とナックルがY軸を中心とした回転のみできるように制約している。また、ロックピンが上がっているときには自然に開くよう弱いバネで回転させ、ロックピンが下がっているときには物理演算を安定させるため閉まるよう強いバネで回転させる。これは、強い力が加わると当たり判定同士がめり込み始め、最後にはすり抜けるという現象を防ぐためである。ばね定数の切り替えは、ロックピンの位置やナックルの開度をトリガにC#スクリプトで制御している。
  3. 本体 - 車体間のConfigurableJoint
    並形自動連結器は、一般に前後方向の衝撃を吸収する緩衝器と、左右方向の回転を許容するスプリング付き回転軸を持つ。これを実現するため、ConfigurableJointを用いた。

実装結果

こんな感じに動きます。なお、ロックピンを上げるにはハンドルを動かします。これも実装していますが今回は紹介を省略。

youtu.be