トラコン謎仕様を解明する(2) 戻しノッチ
前回、トラコンの謎仕様を修正するいくつかのスクリプトを紹介しました。その続きとして今回は、「戻しノッチの減速度が大きすぎる問題」を解決します。
言葉としての都合がいいので「戻しノッチ」という言葉を使いましたが、ふつうに通じる言葉ではないかもしれませんね。技術屋さんが使う時の意味とは異なりますが、ここでは、例えば、
「0km/hから70km/hまで5ノッチで加速した。その後2ノッチに戻した」
というようなときの2ノッチの方を戻しノッチと言っています。このとき、VRMのトラコンは惰性の時よりも明らかに強いブレーキ力がかかったような挙動になっています。
つまりここで問題にしているのは、
「加速側ノッチに入っていて、かつ、そのノッチの均衡速度以上の速度で走っているとき、想定よりも大きな減速力がかかっている」
状態です。VRM5(またはOnline)の環境がある方は試してみてください。
この問題の修正方法は、口で言うなら簡単です。
- 加速ノッチに入っている
- そのノッチの均衡速度以上で走っている
の両方を満たすとき、そのノッチの係数をSetNotchParamで操作して減速を抑えればよいのです。
少々難しいのは、
- その時々によって入っているノッチが何段か
- その時々の速度はどれだけか
- ノッチによって標準の係数(100*n/k)がバラバラである
- 再び加速するときには係数を元に戻さなくてはならない
点です。一つ一つをクリアする方法はそれほど難しくありませんが、これをプログラム的にコンパクトに組み立てなくてはいけません。(例えば、面倒だからif分岐は少なくしたいとか、走らせるイベントの数は少なくしたいとかいう要求をクリアして、かっこいい短いスクリプトにするのが望ましいということです。)
今回、実は「その時々によって入っているノッチが何段か」を調べるのが、案外厄介です。なぜなら、カーソルキーからの入力を直接捕まえられるSetEventTraconInputみたいな都合の良いイベントがないからです。
そのため、
- SetEventFrameTickか何かで常にノッチ段数を監視する
- ノッチ操作の入力をキーイベントで代替してカーソルキーは使わないようユーザーにお願いする
のいずれかの方法を取る必要があります。現行のakg/2.0規格の編成(とその前身のマスターコントローラ編成)(ちなみにViewWakashio氏のマスコン編成とは別物である)では2番めの方法を取っていますが、今回は1番目の常に監視する方法で書いてみましょう。
// // Settings // SetNotch 5 8 SetNotchSpeed 1 1 15 SetNotchSpeed 2 25 43 SetNotchSpeed 3 33 68 SetNotchSpeed 4 40 85 SetNotchSpeed 5 55 120 SetNotchParam -1 25 SetNotchParam -2 25 SetNotchParam -3 25 SetNotchParam -4 25 SetNotchParam -5 25 SetNotchParam -6 25 SetNotchParam -7 25 SetNotchParam -8 25 SetInputMode 1 // // Setup // Var VarCrtNotch Var EidNotchWatcher Var EidFcsIn Var EidFcsOut SetEventFocusIn MtdFcsIn EidFcsIn SetEventFocusOut MtdFcsOut EidFcsOut BeginFunc MtdFcsIn SetEventFrameTick this MtdNotchWatcher EidNotchWatcher EndFunc BeginFunc MtdFcsOut KillEvent EidNotchWatcher EndFunc BeginFunc MtdNotchWatcher Var a GetInputMode a if a Var crtspd GetCurrentNotch VarCrtNotch if> VarCrtNotch 0 GetNotchSpeed VarCrtNotch crtspd a // 定格は仮 GetCurrentSpeed crtspd if> crtspd a // 現在速度>均衡速度 SetNotchParam VarCrtNotch 6 else set a 500 // 500なのは、最大5ノッチだから div a VarCrtNotch SetNotchParam VarCrtNotch a endif endif // DEBUG DrawVar VarCrtNotch GetNotchParam VarCrtNotch a DrawVar a endif EndFunc
コピペして動作を確かめてみてください。編成の最高速度は110km/hの想定です。(そうでない場合は、Settingsのところを適当に変えてください。)戻しノッチ時の減速が改善されているはずです。(しかし依然として物理演算はしていないので、それっぽいものに近くなった、という感じです。)
詳しくコードを見てみます。MtdNotchWatcherが一連の制御の中心になります。(編成がActive=操作対象のときのみ、SetEventFrameTickで実行されるようになっています。編成がActiveでないときはノッチ操作は行われないからです。)
MtdNotchWatcherに注目してください。
現在速度>均衡速度のとき、NotchParamを定数6に設定して惰性の減速度と同じになるようにしました。この6という数字は観測的、実験的に得られたものです。ニュートラルのときの減速度と、デフォルトの加速ノッチの現在速度>均衡速度のときの減速度を計測して比較するとよいでしょう。
elseのあとは、加速時のノッチにかかる係数が100×最大ノッチ数÷現在ノッチになるような計算にしています。
※ほんとうは、MtdNotchWatcherの中身は、カーソルキーが押されてノッチが切り替わった瞬間にのみ実行すればよい。
:;;;:+*+:;;;:+*+:;;;:+*+:;;;:+*+:;;;:+*+
ニュートラルの減速度の計測をしている時に、トラコンのニュートラルに入っている時に停止する(0km/hになる)のはSetEventZeroSpeedで拾われないということに気がついた。仕様的にどうなのだろうか。
:;;;:+*+:;;;:+*+:;;;:+*+:;;;:+*+:;;;:+*+
ちなみに今回Set/GetSpeedFactorの存在はまったく無視しています。全ノッチの効き具合を一律で調整するもののようです。今回の例ではブレーキの各ノッチの効き具合の調整に使えますね。加速側は、各ノッチで載せるべき係数が違うのでなんの役にも立ちませんが。(1ノッチのParamを、300を超えて500相当にしたいとき使えるかもしれないが、どうしても必要か?)
ちなみに(2回め)、本稿では「マスコン」と「ノッチ」の用語の使い分けは非常に曖昧です。厳密には区別されるものですが、自覚して曖昧に使っていることをエクスキューズしておきます。
これで「トラコンの謎仕様を解明する」のたった2回の連載は終わりになります。
トラコン周りの謎仕様はかなり明らかになったのではないでしょうか。賢明な読者の方であれば、仕様上、どんなことができてどんなことができないのか、アイデアも思い浮かんでいることと思います。ぜひ、やってみてください。
(ノッチ戻し制御のない車両の挙動の再現とか、AE100型のような特殊なものも含む定速運転制御とか)
| 固定リンク
「VRM:研究」カテゴリの記事
- VRMNXの時間系イベントが使いにくいなあと思っているアナタへ(2019.12.24)
- [VRMNX] フレーム同期の話(2019.07.18)
- [Python] リスト型をベクトルに見立てて計算したい(2019.06.16)
- VRMNXのレイヤーベース地形を使ってみよう(前編)(2019.05.18)
- [VRMNX]自動踏切モジュール(2019.01.25)
この記事へのコメントは終了しました。


コメント