アニメーションオブジェクトの制作
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追記:変数一覧の一部表現を分かりやすく訂正
アニメーションオブジェクトの概要
既存のフォーマットに動作情報ファイルを付け加えることで、アニメーションを実現するよう考案されています。
動的オブジェクトはRail,Wall,Dike,FreeObjのみで使用することが可能で、FormCLやCrackRといった設置方法ではアニメーションしません。
また、OpenBVEに動的オブジェクトとして認識させるには、ファイル拡張子を.animatedとする必要があります。
なお、路線データ上でロードされたオブジェクトは、その後従来の静的オブジェクトと同様にRailtype構文やFreeobj構文で設置・使用が可能です。
つまり、基本的なアニメーションの定義方法としては、
- アニメーションさせたい部分別にcsvやb3dファイルを作成
- .animatedファイルにて各部品を読み込んで合成
- .animatedファイルを路線ファイル上で読み込む
逆に、一つのcsvファイルに複数の動きを作ること(csv内の二つの部品が別方向に動くなど)は出来ませんので注意してください。
例えば、複数のCreateMeshBuilder(CSVの場合)により構成された踏切の部品で、「ここのライトは点滅」「ここのバーは上下する」といったことを定義することはできません。
前述の例で言うと、「ライト」「バー」を全て別々にcsvオブジェクトとして作成しておき、animatedファイルで合成することになります。
要するにanimatedファイルとは、複数のcsvファイルをまとめるための一つの箱のようなものと考えてください。
応用することにより、別にアニメーションさせない場合であったとしても、少ないオブジェクト数で様々なオブジェクト集合体を作ることができます。
(csvのオブジェクトを「素材」と捉え、素材の組み合わせ方で様々な部品を作ることが可能になります。
動的オブジェクト定義ファイルの書式
動的オブジェクト定義ファイルanimatedファイルは、以下のような書式になっています。属性 = 値
属性 = 値
...
動的オブジェクト定義ファイルのリファレンス
オブジェクトを設定する
元となるCSVやb3dファイル(素材オブジェクト)を読み込む
オブジェクトの位置を変更する
移動された状態で路線データ上に表示されます。
どの素材オブジェクトが表示されるかを決める
この式の値が、「元となるCSVやb3dファイル(素材オブジェクト)を読み込む」にて指定したファイルの順番と連携し、表示・非表示を切り替えます。
つまり、式の演算結果が0であった場合にはFile0が、1であればFile1が、2であればFile2……といった具合で素材オブジェクトが表示されます。
たとえば、式に現在の秒数を代入しておき、秒数を2で割ったときの答えを式の値としておけば、答えは常に0か1ですので、File0かFile1が交互に表示されます。
これを利用して、踏み切り警報装置などを作ることができるでしょう。
オブジェクトを直線移動する
TranslateYFunction = 式
TranslateZFunction = 式
たとえば、式に現在の秒数を代入しておき、秒数を2で割ったときの答えを式の値としておけば、答えは常に0か1ですので、File0かFile1が交互に表示されます。
これを利用して、踏み切り警報装置などを作ることができるでしょう。
オブジェクト直線移動の軸方向を指定する
TranslateYDirection = X,Y,Z
TranslateZDirection = X,Y,Z
デフォルトでは、
TranslateXDirection = 1,0,0
TranslateYDirection = 0,1,0
TranslateZDirection = 0,0,1
と定義されています。
TranslateXDirectionを「1,1,0」とした場合には、Xベクトルが1、Yベクトルが1となるので、その方角は右上に45度となります。
この場合、上記のTranslateXDirectionにてオブジェクトを移動すると、右上45度方向へ移動することになります。
オブジェクトを回転する
RotateYFunction = 式
RotateZFunction = 式
角度はラジアンで指定します。度数法でないので注意してください。360度が2piラジアン=約6.28となります。
| 角度 | ラジアン |
|---|---|
| 15 | 0.26 |
| 30 | 0.52 |
| 45 | 0.785 |
| 60 | 1.04 |
| 90 | 1.57 |
オブジェクトの回転軸を指定する
RotateYDirection = X, Y, Z
RotateZDirection = X, Y, Z
デフォルト値も同じで、この軸を元にオブジェクトは回転します。
オブジェクト回転の際のぶれを指定する
RotateZDamping = 振動数, 減衰比
RotateZDamping = 振動数, 減衰比
振動数は、1秒あたりにぶれる回数を指定します。
バネを想像すると、長いバネに重いものをぶらさげるとビヨンビヨンと伸び縮みします。このときの振動数は低いです。
では、硬いバネを少しだけ指で弾くことを想像します。このときバネは小刻みに振動します。このときの振動数は高いです。
そのイメージで、振動数の値を大きくすれば大きくするほど、オブジェクトは小刻みに振動することになります。
減衰比は、ぶれるごとのぶれ幅の減衰を指定します。1が標準値です。
0~1の間にすると、減衰が少なくなる=ぶれている時間が長くなるため、何度かぶれることになります。
1以降の値にすると、減衰が大きくなる=ぶれている時間が短くなるため、よりブレが少なくなります。
現在のところ、直進中の物体がぶれるような命令TranslateXDamping命令はありません。
今後のOpenBVEで実装されるかどうかは分かりませんが、現在のところこの命令の利用価値は、時計の針の動きをリアルに再現するような場合に有効だと思います。
(駅の時計の針などは、長針が動くとブルブルっと何度か前後しますよね)
面に張られたテクスチャを移動する
TextureShiftYFunction = 式
単位は1を100%とし、0.5とすると半分ずらすことになります。Xは横方向、Yは縦方向に移動します。
オブジェクトそのものを動かすのではなく、テクスチャをずらすこの関数は、平面上をステップが移動する「動く歩道」のようなものを再現するのに便利でしょう。
面に張られたテクスチャ移動の軸を指定する
TextureShiftYDirection = X, Y
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 > b | aがbより大きい | aがbより大きいとき、1(true)を返します。 |
| a < b | aがbより小さい | aがbより小さいとき、1(true)を返します。 |
| a >= b | aがb以上 | aがb以上のとき、1(true)を返します。 |
| a <= b | aが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)を返します。 |
演算記号の優先順位
- -(マイナス)
- /
- *
- +,-(引き算)
- ==, !=, <, >, <=, >=
- !
- &
- ^
- |
関数
| 文法 | 意味 | 説明 |
|---|---|---|
| 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[条件式,真の場合の戻り値,偽の場合] | 条件分岐 | 条件式が成り立つか否かによって返す値を変化させます。 |
使用可能な変数
| 変数名 | 説明 |
|---|---|
| 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はプラグインから取得するインデックスの番号です。 |