OpenBVE 日本語リファレンス

アニメーションオブジェクトの制作

OpenBVEの大きな特徴として、「動くものを表現できる」というものがあります。
ここでは、OpenBVEの「The Animated Object」のページを元に、アニメーションをどのように作っていけばよいのか解説していきます。

1/11修正:オブジェクトの回転に使う値は度数でなくラジアンでした。お詫びして訂正します。
1/24追記:0.9.3.7の仕様変更に伴い、「使用できる変数」に、speed、speedometer、distance、trackdistance、leftdoors等の定義を追加
2/04追記:0.9.5の仕様変更に伴い、「使用できる変数」にleftdoorstargetなどを追加
2/06追記:変数一覧の一部表現を分かりやすく訂正

アニメーションオブジェクトの概要

アニメーションの概要
OpenBVEのアニメーションオブジェクト(以下動的オブジェクトとします)は、CSVやXといった新しいオブジェクトを定義するわけではなく、
既存のフォーマットに動作情報ファイルを付け加えることで、アニメーションを実現するよう考案されています。
動的オブジェクトはRail,Wall,Dike,FreeObjのみで使用することが可能で、FormCLやCrackRといった設置方法ではアニメーションしません。
また、OpenBVEに動的オブジェクトとして認識させるには、ファイル拡張子を.animatedとする必要があります。
なお、路線データ上でロードされたオブジェクトは、その後従来の静的オブジェクトと同様にRailtype構文やFreeobj構文で設置・使用が可能です。
つまり、基本的なアニメーションの定義方法としては、
  1. アニメーションさせたい部分別にcsvやb3dファイルを作成
  2. .animatedファイルにて各部品を読み込んで合成
  3. .animatedファイルを路線ファイル上で読み込む
ということになります。
逆に、一つのcsvファイルに複数の動きを作ること(csv内の二つの部品が別方向に動くなど)は出来ませんので注意してください。
例えば、複数のCreateMeshBuilder(CSVの場合)により構成された踏切の部品で、「ここのライトは点滅」「ここのバーは上下する」といったことを定義することはできません。
前述の例で言うと、「ライト」「バー」を全て別々にcsvオブジェクトとして作成しておき、animatedファイルで合成することになります。
要するにanimatedファイルとは、複数のcsvファイルをまとめるための一つの箱のようなものと考えてください。

応用することにより、別にアニメーションさせない場合であったとしても、少ないオブジェクト数で様々なオブジェクト集合体を作ることができます。
(csvのオブジェクトを「素材」と捉え、素材の組み合わせ方で様々な部品を作ることが可能になります。

動的オブジェクト定義ファイルの書式

動的オブジェクト定義ファイルanimatedファイルは、以下のような書式になっています。
[object]
属性 = 値
属性 = 値
...

動的オブジェクト定義ファイルのリファレンス

オブジェクトを設定する

[object]
動的オブジェクトを定義します。ここから下に書かれた命令は、次の[object]が書かれるまで全てそのオブジェクトに作用します。

元となるCSVやb3dファイル(素材オブジェクト)を読み込む

States = File0, File1, ..., Filen-1
File0,File1...: 元となるオブジェクト(素材オブジェクト)のファイル名(拡張子つき)
例:abc.csv,bcd.csv,...

オブジェクトの位置を変更する

Position = X, Y, Z
X, Y ,Z: 移動量(メートル)
素材オブジェクト群が一括して移動します。
移動された状態で路線データ上に表示されます。

どの素材オブジェクトが表示されるかを決める

StateFunction = 式
StateFunctionに使う式の値は常に整数であり、整数でない場合は四捨五入されます。
この式の値が、「元となるCSVやb3dファイル(素材オブジェクト)を読み込む」にて指定したファイルの順番と連携し、表示・非表示を切り替えます。
つまり、式の演算結果が0であった場合にはFile0が、1であればFile1が、2であればFile2……といった具合で素材オブジェクトが表示されます。

たとえば、式に現在の秒数を代入しておき、秒数を2で割ったときの答えを式の値としておけば、答えは常に0か1ですので、File0かFile1が交互に表示されます。
これを利用して、踏み切り警報装置などを作ることができるでしょう。

オブジェクトを直線移動する

TranslateXFunction = 式
TranslateYFunction = 式
TranslateZFunction = 式
式 = 動的オブジェクトに使える式を参照(メートル)
TranslateXFunctionはX方向(左右方向)、YFunctionはY方向(上下方向)、ZFunctionはZ方向(奥行き方向)へそれぞれオブジェクトを移動させます。

たとえば、式に現在の秒数を代入しておき、秒数を2で割ったときの答えを式の値としておけば、答えは常に0か1ですので、File0かFile1が交互に表示されます。
これを利用して、踏み切り警報装置などを作ることができるでしょう。

オブジェクト直線移動の軸方向を指定する

TranslateXDirection = X,Y,Z
TranslateYDirection = X,Y,Z
TranslateZDirection = X,Y,Z
X,Y,Z = 動的オブジェクトに使える式を参照(ベクトルの大きさ)
TranslateXFunction等の関数においてオブジェクトを移動する際に使用する軸をベクトルで定義します。
デフォルトでは、
TranslateXDirection = 1,0,0
TranslateYDirection = 0,1,0
TranslateZDirection = 0,0,1

と定義されています。

TranslateXDirectionを「1,1,0」とした場合には、Xベクトルが1、Yベクトルが1となるので、その方角は右上に45度となります。
この場合、上記のTranslateXDirectionにてオブジェクトを移動すると、右上45度方向へ移動することになります。

ベクトルに関してよく分からない方はこちらの解説が便利です。→外部サイト「数学B ベクトル」へ

オブジェクトを回転する

RotateXFunction = 式
RotateYFunction = 式
RotateZFunction = 式
式 = 動的オブジェクトに使える式を参照(ラジアン)
X,Y,Z軸に従ってオブジェクトを回転させることができます。
角度はラジアンで指定します。度数法でないので注意してください。360度が2piラジアン=約6.28となります。
参考:ラジアンと角度の対応表(度数→ラジアンにするには、度数を57.29で割ると良い)
角度ラジアン
150.26
300.52
450.785
601.04
901.57

オブジェクトの回転軸を指定する

RotateXDirection = X, Y, Z
RotateYDirection = X, Y, Z
RotateZDirection = X, Y, Z
X,Y,Z = 動的オブジェクトに使える式を参照(ベクトル)
TranslateXDirectionと定義方法は同じです。
デフォルト値も同じで、この軸を元にオブジェクトは回転します。

オブジェクト回転の際のぶれを指定する

RotateYDamping = 振動数, 減衰比
RotateZDamping = 振動数, 減衰比
RotateZDamping = 振動数, 減衰比
振動数: 1秒間にぶれる回数の式(Hz) 動的オブジェクトに使える式を参照
減衰比: 1回ぶれるごとのぶれ幅の減衰の式(0より大きい値)動的オブジェクトに使える式を参照

振動数は、1秒あたりにぶれる回数を指定します。
バネを想像すると、長いバネに重いものをぶらさげるとビヨンビヨンと伸び縮みします。このときの振動数は低いです。
では、硬いバネを少しだけ指で弾くことを想像します。このときバネは小刻みに振動します。このときの振動数は高いです。
そのイメージで、振動数の値を大きくすれば大きくするほど、オブジェクトは小刻みに振動することになります。

減衰比は、ぶれるごとのぶれ幅の減衰を指定します。1が標準値です。
0~1の間にすると、減衰が少なくなる=ぶれている時間が長くなるため、何度かぶれることになります。
1以降の値にすると、減衰が大きくなる=ぶれている時間が短くなるため、よりブレが少なくなります。

現在のところ、直進中の物体がぶれるような命令TranslateXDamping命令はありません。
今後のOpenBVEで実装されるかどうかは分かりませんが、現在のところこの命令の利用価値は、時計の針の動きをリアルに再現するような場合に有効だと思います。
(駅の時計の針などは、長針が動くとブルブルっと何度か前後しますよね)

面に張られたテクスチャを移動する

TextureShiftXFunction = 式
TextureShiftYFunction = 式
式 = 動的オブジェクトに使える式を参照(移動割合)
そのオブジェクトに貼られたテクスチャの画像そのものをずらします。
単位は1を100%とし、0.5とすると半分ずらすことになります。Xは横方向、Yは縦方向に移動します。

オブジェクトそのものを動かすのではなく、テクスチャをずらすこの関数は、平面上をステップが移動する「動く歩道」のようなものを再現するのに便利でしょう。

面に張られたテクスチャ移動の軸を指定する

TextureShiftXDirection = X, Y
TextureShiftYDirection = X, Y
X,Y = 動的オブジェクトに使える式を参照(ベクトル)
他のDirection系の構文と同じように、テクスチャをずらす際の軸をベクトルにて定義できます。
1,1と設定すると、テクスチャは左下から右上のほうへ移動しているように見えます。

動的オブジェクトに使える式

ここまでのリファレンスで「式」と定義してきたものは、以下のような文法によって成り立たせることができます。

四則演算

文法意味説明
a + b加算足し算した結果を返します。
a - b減算aからbを引き算した結果を返します。
a / b除算割り算した結果を返します。当然、bの値が0になってはいけません。
a * b乗算掛け算した結果を返します。
-aマイナスの値マイナスの値を表します。

比較演算

文法意味説明
a == b一致aがbと同じ値のとき、1(true)を返します。
a !- b不一致aがbと同じ値でないとき、1(true)を返します。
a > baがbより大きいaがbより大きいとき、1(true)を返します。
a < baがbより小さいaがbより小さいとき、1(true)を返します。
a >= baがb以上aがb以上のとき、1(true)を返します。
a <= baがb以下aがb以下とき、1(true)を返します。

例:現在の秒数によって数値を変えるようにする場合
後に説明する、指定した数で割ったときの剰余を求めるMod関数と、その日の0時0分0秒からの経過秒数を求めるtime変数を使用することで、 現在の秒数が偶数のときに1を返すような使い方ができます。
具体的には
Mod[time,2] == 1
と書くことで、2で割りきれない、つまり奇数の場合に1を返すようなことができます。
これを使用することで、上の「どの素材オブジェクトが表示されるかを決める」において、秒ごとの表示オブジェクト切り替えができますね。

論理演算

文法意味説明
a & b論理積式aと式bが同時に成り立つ場合に1(true)を返します。
a | b論理和式aと式bの少なくとも一方が成り立つ場合に1(true)を返します。
a ^ b排他的論理和式aまたは式bのどちらかのみ成り立つ場合に1(true)を返します。

演算記号の優先順位

各演算記号は、次の順で優先されることになっています。
  1. -(マイナス)
  2. /
  3. *
  4. +,-(引き算)
  5. ==, !=, <, >, <=, >=
  6. !
  7. &
  8. ^
  9. |

関数

文法意味説明
Reciprocal[x]1/xと同じ1をxで割った値を返します。1/xと記述するより早いそうです。
Quotient[a,b]a/bの小数点切捨てaをbで割り算し、小数点を切り捨てた結果を返します。
Mod[a,b]剰余aをbで割ったときの余りを返します。
Min[a,b,c,...]最小値コンマで区切って羅列した式のうち、もっとも小さい値を返します
Max[a,b,c,...]最大値コンマで区切って羅列した式のうち、もっとも大きい値を返します
Abs[x]絶対値xの絶対値(xが0からどれだけ離れているか)を返します。
Sign[x]符号xの符号を返します。-1は負の数,0は0,1は正の数(自然数)となります。
Floor[x]切捨て小数点以下を切り捨てて返します。0.5は0に、1.9は1になります。
Ceiling[x]切り上げ小数点以下を切り上げて返します。0.5は1に、1.1は2になります。
Round[x]四捨五入小数点以下が最も近い整数を返します。0.55は1、0.49は0です。

文法意味説明
Exp[x]指数関数自然対数の底eをx乗した結果を返します。
Log[x]対数関数xの自然対数を返します
Sqrt[x]平方根xの平方根を返します
Sin[x]サインx度のサインを返します
Cos[x]コサインx度のコサインを返します
Tan[x]タンジェントx度のタンジェントを返します
ArcTan[x]アークタンジェントタンジェントがxとなるような角度を返します

制御構文

文法意味説明
If[条件式,真の場合の戻り値,偽の場合]条件分岐条件式が成り立つか否かによって返す値を変化させます。

使用可能な変数

関数や式の引数には、通常の1,2といった数字のほか、以下のような数を変数として使用することができます。
変数名説明
valueその関数が前回の演算で返した値を返します。(xxxxFunction = delta + 1とすると、値は1演算(1フレーム)ごとに1増えます)
deltaその関数が前回演算してから何秒経ったかを返します。(s)
timeその日の午前0時0分0秒から何秒経過したかを返します。(s)
sectionセクションの信号インデックスを返します。BVE4における「Track.Section」構文で現在表示されているインデックスと同じ値です。
speed運転している列車の平均速度を返します(m/s)
speedometer運転している列車の現在の速度を速度計から取得します(空転や滑走を考慮します)(m/s)
distance運転中の列車と[object]で定義された素材オブジェクト間の最短距離を返します(m)
trackdistance運転中の列車からオブジェクトの設置位置までの最短距離を返します。(m)
doors運転中の列車のドアの開放割合を返します。0で完全戸締め、1が完全開放中を示し、戸締めの途中に1から0へ変化します。
leftdoors[i]i+1両目の車両の左ドアの開放割合を返します。doorと同じく、1が完全開放です。
rightdoors[i]i+1両目の車両の右ドアの開放割合を返します。doorと同じく、1が完全開放です。
leftdoorstarget左側のドアの開閉の目標値を返します。返す値は1か0で、開いてる最中または完全開放で1を返します。(動作未確認)
rightdoorstarget右側のドアの開閉の目標値を返します。返す値は1か0で、開いてる最中または完全開放で1を返します。(動作未確認
pluginstate[i]ATSプラグインから値を取得します。panel2.cfgの「ATSプラグインから受け取った値」(ats0~ats255)と同じ値です。iはプラグインから取得するインデックスの番号です。
このサイトについて サポート サイトマップ