メインコンテンツまでスキップ

共著:rikkun2X

エンジン作成チュートリアル

このページでは、Stormworks のモジュラーエンジンを「必要な出力を保ちながら、空気と燃料を無駄にしない」制御へ近づける手順を説明します。測定値と計算に使う係数は エンジンデータ集 にまとめています。

1. まず測定環境を固定する​

エンジンの測定では、次の条件を固定します。

  • RPS と Stormworks Torque(以下 ST)を読み取る
  • フライホイール、ギア、発電機など、測定対象外の部品を接続しない
  • スロットルを一定値にして十分に平衡させる
  • スロットルを上げる測定と下げる測定を両方行い、平均を取る
  • tick ごとの差分を使う場合、dRPS = RPS(tick) - RPS(tick-1) と定義する

上昇時と下降時の差は、浮動小数点誤差だけでなく、物理演算のスリープ・丸め・サンプリングのタイミングでも発生します。単発の値ではなく、同じ条件の平均値を採用してください。

2. エンジンの構成を決める​

最初は、動力源・クランクシャフト・シリンダー・ベルト・負荷を分けて考えます。

  1. 動力源だけを接続し、スロットルと RPS の関係を測る。
  2. 動力源のサイズを変えず、クランクシャフトやベルトを追加して抵抗の増分を測る。
  3. ドリルや発電機などの負荷を追加し、RPS に対する抵抗曲線を測る。
  4. 最後に、実際に使う構成で再測定して近似式を検証する。

3. 空気・燃料制御の基本​

エンジンの必要スロットルは、次の考え方で求めます。

必要な動力 = 目標出力 + エンジン内部の抵抗 + 接続部品の抵抗 + 外部負荷
空気スロットル = 必要な動力 / RPS におけるエンジン出力
燃料スロットル = 空気スロットル × 燃料補正

実装では、必ず 0 から 1 の範囲にクランプします。低 RPS では分母が小さくなるため、分母に最小値を設けるか、RPS が一定値を下回ったときは始動用の固定値に切り替えると安定します。

V10 の例​

参考データとして、V10 の近似式は次のように書けます。x は RPS、y は目標出力、z は過給圧力です。

local x = rps
local y = targetOutput
local z = pressure

local power = -0.00962*x*x + 0.8885*x - 0.1547
local demand = y/60 + 0.05674*x

local air = math.min(demand / power, 1)
local fuel = math.min(demand / power * (1 + 0.01*z), 1) / 2

-0.00962*x^2 + 0.8885*x - 0.1547 は RPS ごとの出力を近似する2次式です。0.05674*x はエンジン内部抵抗を補う項、(1 + 0.01*z) は過給圧力による燃料補正です。実際の構成で負荷が変わる場合は、抵抗項を測定データから置き換えます。

4. マイコンへの組み込み​

入力は、少なくとも RPS、ST、目標出力、過給圧力を用意します。出力は空気スロットルと燃料スロットルです。

function clamp(x, low, high)
return math.max(low, math.min(high, x))
end

function onTick()
local rps = input.getNumber(1)
local target = input.getNumber(2)
local pressure = input.getNumber(3)

local power = -0.00962*rps*rps + 0.8885*rps - 0.1547
local demand = target/60 + 0.05674*rps
local ratio = demand / math.max(power, 0.001)

output.setNumber(1, clamp(ratio, 0, 1))
output.setNumber(2, clamp(ratio * (1 + pressure*0.01) / 2, 0, 1))
end

このコードは V10 の例です。任意の構成については、エンジン調整ツール に RPS、ST、エンジン出力係数、抵抗係数を入力すると、同じ形の式を生成できます。

5. 調整のチェックポイント​

  • スロットルを変えた直後ではなく、RPS が安定してから値を読む
  • 最大 RPS 付近では出力式の誤差が増えるため、測定点を増やす
  • 目標出力を上げても RPS が落ちる場合、外部負荷の抵抗を式に追加する
  • 燃料だけを増やしても出力が増えない領域では、空気側が上限に達している
  • 式の係数と測定条件(部品、クラッチ、ギア、ゲームバージョン)を必ず併記する

測定方法や係数が更新された場合は、データ集の「測定条件」と「データの信頼度」も一緒に更新してください。