[Unity] Unity車:エンジン回転数とギアの実装

※いま作成しているプログラムから適当に抜粋しただけなので、
掲載しているプログラムが正しく動作する保証は無いです。暇があれば確認します・・・。


前提:マシンの性能
Rigidbody
-Mass:400
WheelCollider
-Mass:15
-Radius:0.3
-SuspensionDistance:0.35
-ForceAppPointDistance:0.06
-Spring:14000
-Danper:1800
他は初期設定?(center等除く)

WheelCollider(running)
-steerAngle=[-18,18]
-motorTorque[0,700/2](RWD駆動)
-brakeTorque[0,200](全輪ブレーキ)

設定前、車体が細かく振動し始めたのですが、Springを柔らかくしたら改善。

ファイナルギアは実装しません。リアルな数字が欲しいなら実装すべきでしょう



まずは、ギアを実装しない方。過不足あるので、適宜補ってください。

// using略
public class YourCarClassNameHere : MonoBehaviour {

public WheelCollider wheelFL;
public WheelCollider wheelFR;
public WheelCollider wheelRL;
public WheelCollider wheelRR;

private Rigidbody rb;

private float m_accel; // TODO:コントローラの実装
private float m_brake;
private float m_steer;

private const float MaxEngineRpm = 2700f;
private const float EnginePerTorque = 700f;

void Start () {
rb = GetComponent();

gearIndex = 1;
}

void Update () {

wheelFL.brakeTorque = 0f;
wheelFR.brakeTorque = 0f;
wheelRL.brakeTorque = 0f;
wheelRR.brakeTorque = 0f;

wheelFL.steerAngle = m_steer * 18f;
wheelFR.steerAngle = m_steer * 18f;

// タイヤの回転数からエンジン回転数を得る
float engineRpm=0f;
float engineTorque=0f;

engineRpm = rrpm;
engineTorque = m_accel * EnginePerTorque;

wheelRL.motorTorque = engineTorque * 0.5f;
wheelRR.motorTorque = engineTorque * 0.5f;
wheelRL.brakeTorque += wheelRL.rpm * 0.01f;
wheelRR.brakeTorque += wheelRR.rpm * 0.01f;

//engineSound.pitch = 1f + (engineRpm > 3800f ? 3800f : (engineRpm < 0f ? 0f : engineRpm)) / 3800f * 5f;

wheelFL.brakeTorque += m_brake * 200f;
wheelFR.brakeTorque += m_brake * 200f;
wheelRL.brakeTorque += m_brake * 200f;
wheelRR.brakeTorque += m_brake * 200f;
}
}


これだけでも十分に走ります。

Unityで動かす分にはギアなんて必要ないです。

上のプログラムでは、エンジン回転数はトルクなどのパラメータには何も作用させていないので、
人によっては気味悪いかもしれません。




ギアが必要になるのは、エンジン回転数に上限を設定したときです。
エンジン出力回転数に上限が無い車は、現実には殆ど無いわけですから。
        engineRpm = rrpm;
if (engineRpm < MaxEngineRpm)
engineTorque = m_accel * EnginePerTorque;

エンジン回転数が上限に達した時、タイヤに与えられるトルクが計算されません。

タイヤの回転速度は一定の速度を超えなくなってしまいます。

エンジン回転数を範囲内に収めたまま、タイヤの回転速度を上げるには?

そこで、このコードにギア比を導入してみます。
        engineRpm = rrpm * gearRate;
if (engineRpm < MaxEngineRpm)
engineTorque = m_accel * EnginePerTorque * gearRate;

gearRate > 1fならば、最高速度は低下しますが、トルクが上がります。
gearRate < 1fならば、最高速度は向上しますが、トルクが下がってしまいます。

ギアボックスのギア比を配列として保持し、ギアを選択させればおk。


public class YourCarClassNameHere : MonoBehaviour {

public WheelCollider wheelFL;
public WheelCollider wheelFR;
public WheelCollider wheelRL;
public WheelCollider wheelRR;

private Rigidbody rb;

private float m_accel; // TODO:コントローラの実装
private float m_brake;
private float m_steer;

private const float MaxEngineRpm = 2700f;
private const float EnginePerTorque = 700f; //800
private float[] gearRate = { -1f,1.3f, 0.8f , 0.6f , 0.5f };
private int gearIndex;

public void GearShiftUp() { gearIndex += (gearIndex+1) < gearRate.Length ? 1 : 0; }
public void GearShiftDown() { gearIndex -= gearIndex > 0 ? 1 : 0; }

void Start () {
rb = GetComponent<Rigidbody>();

gearIndex = 1;
}


void Update () {

wheelFL.brakeTorque = 0f;
wheelFR.brakeTorque = 0f;
wheelRL.brakeTorque = 0f;
wheelRR.brakeTorque = 0f;

wheelFL.steerAngle = m_steer * 18f;
wheelFR.steerAngle = m_steer * 18f;

// タイヤ回転数の和
float srpm, frpm, rrpm;
frpm = wheelFL.rpm + wheelFR.rpm + 1f;
rrpm = wheelRL.rpm + wheelRR.rpm + 1f;
srpm = frpm + rrpm;

// タイヤの回転数からエンジン回転数を得る
float engineRpm=0f;
float engineTorque=0f;

engineRpm = rrpm;
engineRpm *= gearRate[gearIndex];

if (engineRpm < MaxEngineRpm)
engineTorque = m_accel * EnginePerTorque * gearRate[gearIndex];


wheelRL.motorTorque = engineTorque * 0.5f;
wheelRR.motorTorque = engineTorque * 0.5f;
wheelRL.brakeTorque += wheelRL.rpm * 0.01f;
wheelRR.brakeTorque += wheelRR.rpm * 0.01f;

//engineSound.pitch = 1f + (engineRpm > 3800f ? 3800f : (engineRpm < 0f ? 0f : engineRpm)) / 3800f * 5f;

wheelFL.brakeTorque += m_brake * 200f;
wheelFR.brakeTorque += m_brake * 200f;
wheelRL.brakeTorque += m_brake * 200f;
wheelRR.brakeTorque += m_brake * 200f;
}
}


追記:アイドリングの概念が無いので、アイドリング時のエンジン回転数は1になってます。
そもそも、タイヤとエンジンを直結させたようなモデルなので、そうなりますぬ。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : Unity

コメントの投稿

非公開コメント

プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1253位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
219位
アクセスランキングを見る>>