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

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

車輪のモデル

Unityでは、物理シミュレーションできるオブジェクトの当たり判定メッシュとして凸なものしか使えないようだ。なので、レールとの当たり判定を車体全体でやるのは無理がある。そもそも、車輪ですら踏面とフランジのせいで凹み部あるし。

じゃあ、どうすればうまく当たり判定させつつ物理シミュレーションできるんだろう?踏面とフランジを別部品で作ってそれぞれに当たり判定をつけ、両者を結合させればいいのだろうか?まずはその方向で行くことにしよう。

フランジと踏面の結合方法

ある2つの物体をくっつけるには、親子関係を使う方法と、Fixed Jointを使う方法があるようだ。今回の例だと、

  • 親子関係:車輪というGame Objectの中に、踏面とフランジ、車軸をぶち込む。それぞれの関係は固定されており、ゲーム中に変化しない。
  • Fixed Joint:フランジにJointコンポーネントを追加し、踏面に対するFixed Jointを作成する。一定以上の力が加わったときに接続が切れたりしてほしいときなどに使う。

となるのかな。ゲーム中に接続状態を変える必要がないので、親子関係で作ればよさそう。

踏面のCollisionモデルをどうするか

鉄道用車輪の踏面は、自動車のタイヤ(円筒形)とは異なり円錐形である。しかし、Unityには円錐用のCollisionモデルは無い。では、これとレールとの衝突判定はどのようにすればよいだろうか?

例えば、踏面のMeshを作り、これとレールのMeshを衝突判定させる手がある。しかし、踏面のMeshはMeshゆえに表面の曲線を多数の直線で近似しており、表面がでこぼこしてしまう。そのため、これが回転するとガタガタ上下動すると思われる。これは良くないので、他に手段がない場合にのみ使うことにする。

他には、Wheel Colliderも使えるかもしれない。これは車輪を円盤に見立てて、舵角や回転力等を与えると回転量や車輪の位置を計算してくれる。サスペンションの効果や静・動摩擦力まで考慮してくれるスグレモノだ。しかし、である。これは自動車のタイヤを円盤に近似しており、踏面には直接適用できない。レールと踏面の相対位置から円盤の半径を計算して適宜変更するようにすれば行けるのかもしれないが。惜しいので、この方式は次善の策とする。

あとは、円錐を、十分に半径の大きな球の表面の一部とみなす手もある。この場合の問題は、おそらく巨大となるCollision球同士の当たり判定を避けられるか?という点と、踏面の半径と球の半径が整合しない場合、回転量の計算などをどうするのか?という点である。これらの問題は、踏面の半径とCollision球の半径を等しくすれば解決できるので、まずは踏面の半径とCollision球の半径を等しくしてもよいか確認するところから始めれば良さそう。