[Unity]自動車の動力系一式をプログラムでシミュレートする方法
Posted: 2018年1月08日(月) 00:30
Unityで自動車の運転をしてあれこれするゲーム(ETSみたいな)を目指していろいろと試しているのですが、どうしても再現する方法がわからない部分があるのでどなたかお力添えをいただきたいです。
わからないのは、エンジンからタイヤまでの伝達系の再現で、それぞれの操作がお互いにどのように作用して…というところです。
再現したいのは、
・アクセル、ブレーキ、クラッチという入力(アナログ)
・エンジンの回転数と、アクセルを踏み込んだ量に応じた出力トルクの管理(厳密でなくてもある程度の値でOK。トルクカーブという機能を使って実装するつもり)
・クラッチ1またはニュートラルでアクセルを踏み込んだ時に、回転数が徐々に上がって徐々に落ちてくる(空ぶかし)の再現
・クラッチを徐々につないだ時にタイヤにトルクを伝えるだけでなく、エンジンにも負荷がかかり、ある程度回転数が落ちる(半クラッチ)
・半クラッチからつなぎすぎた時にエンジンが止まる
・ある程度の速度で走行時、アクセルを戻すとエンジンブレーキがかかる
など、主にMT車の動作に関係するところです。
「AT車でいいじゃないか」という意見、ごもっともですが、そこだけはどうしても譲れない部分といいますか…もはや意地というかロマンなんで突っ込まないでくださいm(_ _)m
現状ではWheelCollider(車体となるボディにくっつけることで車輪をシミュレートする。モータートルク、ブレーキトルク、ステアリングアングルを設定して使う)を使って、一応車として動作はします。
ただ限界なしにどこまでも加速してしまう状態です。(車速関係なしにトルク一定)
当たり判定の関係からWheelColliderではなくRigidBodyによる当たり判定(ヒンジジョイント、摩擦によるよりリアルな当たり判定が得られる)にしようかと思っています。
できることとしては
・車輪にトルクをかけて走行させる WheelColliderに駆動トルクを渡して、実際に車を走行させる(更新しなければずっとそのトルクで走り続ける)
・駆動輪の回転数を得られる WheelColliderであればRPMから直接回転数が所得できますし、RigidBodyでも角度から回転数を計算することはできます。
・コントローラからの入力をFloatで受け取れる 0から1の間で受け取れます。
くらいです。
走行抵抗をWheelColliderから直接受け取ることはできないです。
以上がUnityでの制約といったところです。
いろいろ考えたのですが、いまいち全部を再現できるようなプログラムが書けませんでした。
私は自動車整備を学んでいる身なので基本的な動作原理などに関しては、ある程度の専門用語でもわかります。
それでいても、こういう関係は整備には関係ないので全く知りません。
一応本屋に通って自動車工学の本を読んだり、ネットで調べたりしたのですが、関係する情報を見つけられませんでした。
おとなしく5000円ほどでそういったアセット(ライブラリ)を購入すれば簡単なのですが、遊び程度にそこまで払えないというのと、それ以前にバイトをしていないのでそんな金とてもじゃないですが出せないのと、せっかくならこういうところに関する知識もつけたいというのと、自分でプログラム書きたい(DIY)など、とにかく自分でやりたいです。ので「おとなしくアセットを買いましょう」というのはやめてください。
こういったことに関係する情報のページや、考え方など、なんでもいいので教えてほしいです。
お願いしますm(_ _)m
※この掲示板にこういうUnityのことを挙げてもいいのかわからないのですが、一応C言語なので許してください。
わからないのは、エンジンからタイヤまでの伝達系の再現で、それぞれの操作がお互いにどのように作用して…というところです。
再現したいのは、
・アクセル、ブレーキ、クラッチという入力(アナログ)
・エンジンの回転数と、アクセルを踏み込んだ量に応じた出力トルクの管理(厳密でなくてもある程度の値でOK。トルクカーブという機能を使って実装するつもり)
・クラッチ1またはニュートラルでアクセルを踏み込んだ時に、回転数が徐々に上がって徐々に落ちてくる(空ぶかし)の再現
・クラッチを徐々につないだ時にタイヤにトルクを伝えるだけでなく、エンジンにも負荷がかかり、ある程度回転数が落ちる(半クラッチ)
・半クラッチからつなぎすぎた時にエンジンが止まる
・ある程度の速度で走行時、アクセルを戻すとエンジンブレーキがかかる
など、主にMT車の動作に関係するところです。
「AT車でいいじゃないか」という意見、ごもっともですが、そこだけはどうしても譲れない部分といいますか…もはや意地というかロマンなんで突っ込まないでくださいm(_ _)m
現状ではWheelCollider(車体となるボディにくっつけることで車輪をシミュレートする。モータートルク、ブレーキトルク、ステアリングアングルを設定して使う)を使って、一応車として動作はします。
ただ限界なしにどこまでも加速してしまう状態です。(車速関係なしにトルク一定)
当たり判定の関係からWheelColliderではなくRigidBodyによる当たり判定(ヒンジジョイント、摩擦によるよりリアルな当たり判定が得られる)にしようかと思っています。
できることとしては
・車輪にトルクをかけて走行させる WheelColliderに駆動トルクを渡して、実際に車を走行させる(更新しなければずっとそのトルクで走り続ける)
・駆動輪の回転数を得られる WheelColliderであればRPMから直接回転数が所得できますし、RigidBodyでも角度から回転数を計算することはできます。
・コントローラからの入力をFloatで受け取れる 0から1の間で受け取れます。
くらいです。
走行抵抗をWheelColliderから直接受け取ることはできないです。
以上がUnityでの制約といったところです。
いろいろ考えたのですが、いまいち全部を再現できるようなプログラムが書けませんでした。
私は自動車整備を学んでいる身なので基本的な動作原理などに関しては、ある程度の専門用語でもわかります。
それでいても、こういう関係は整備には関係ないので全く知りません。
一応本屋に通って自動車工学の本を読んだり、ネットで調べたりしたのですが、関係する情報を見つけられませんでした。
おとなしく5000円ほどでそういったアセット(ライブラリ)を購入すれば簡単なのですが、遊び程度にそこまで払えないというのと、それ以前にバイトをしていないのでそんな金とてもじゃないですが出せないのと、せっかくならこういうところに関する知識もつけたいというのと、自分でプログラム書きたい(DIY)など、とにかく自分でやりたいです。ので「おとなしくアセットを買いましょう」というのはやめてください。
こういったことに関係する情報のページや、考え方など、なんでもいいので教えてほしいです。
お願いしますm(_ _)m
※この掲示板にこういうUnityのことを挙げてもいいのかわからないのですが、一応C言語なので許してください。