OpenBVEでドアの開閉を再現
チュートリアル:OpenBVEで交通信号を作ってみようでは、UVアニメーションを使用して テクスチャをアニメーションさせる方法を学びました。ここでは、それの応用として、OpenBVEでのドア開閉を再現してみようと思います。下準備:車両データの用意と編成の作成
車両データ・オブジェクトデータの用意
今回は、運転する車両のドア開閉を再現するため、Trainデータとオブジェクトデータの両方を再現する必要があります。
ここでは、付属編成(Web)氏の制作された207系1000番台を例に、ドアの開閉が見れるよう改造してみましょう。
また、自車用モデルにはn209氏(Web)より207系1000番台のオブジェクトを使用したいと思います。
データは上記Webサイトよりダウンロードできます。
ここでは、付属編成(Web)氏の制作された207系1000番台を例に、ドアの開閉が見れるよう改造してみましょう。
また、自車用モデルにはn209氏(Web)より207系1000番台のオブジェクトを使用したいと思います。
データは上記Webサイトよりダウンロードできます。
自車両用オブジェクトの準備
ではまず、自分が運転する車両を207系に変更し、編成も表示させてみることにしましょう。ダウンロードしてきた207系のオブジェクトデータを、車両データ(BVE\Train\207-1000)の中にフォルダを作って挿入します。
次に、CSVファイルを読み込むだけの.animatedファイルを、オブジェクトのフォルダ(写真の例だと207-1000objデータの中)に作成します。
以下にファイルの内容を記載します。本来は3つファイルが必要ですが、掲載の都合上Mc207.animatedのみ掲載しています。
;Mc207.animatedの中身
[object]
States=Mc207.csv
[object]
States=Mc207.csv
extensions.cfgを編集して、自車両を表示させる
次に、車両データ内に「extensions.cfg」ファイルを作成します。
そして、以下のように書き込みます。
そして、以下のように書き込みます。
[exterior]
0 = 207-1000obj/Mc207.animated
1 = 207-1000obj/M207.animated
2 = 207-1000obj/Tc206.animated
0 = 207-1000obj/Mc207.animated
1 = 207-1000obj/M207.animated
2 = 207-1000obj/Tc206.animated
Train.datを編集して、編成の車両数を設定
次に、車両エディタを使用して、上の「extensions.cfg」で設定した車両数とtrain.datの車両数が一致するようにします。train.datで定義された両数と、extensions.cfgで定義された両数が違う場合にはエラーが出ますので注意してください。
ここまでで動作させる
うまく行けば、好きな路線データに車両を指定することで自車両が表示されるはずです。うまく表示されない場合には、
- ファイルとパスは正しいか?(animatedファイル内のcsvへのリンク、extensionsファイル内のanimatedへのリンク)
- 車両の両数は正しいか
ドアの開閉用オブジェクトの作成
ここからは、実際にアニメーションを行うべく、オブジェクトデータに手を加えていきます。ドアの開閉に使うアニメーションは、今回はUVアニメーション(信号機と同じ、テクスチャのシフトを使ったアニメーション)とします。
イメージを考える
ドアの開閉を行うには、どのような位置でオブジェクトを置けばよいでしょうか?ドア一つ一つをアニメさせればよいのか、4つまとめてやってしまうのか……今回は左の図のようなイメージで、
ドアの右側と左側を重ね合わせ、それぞれを別方向に動かすことで再現しようと思います。
実際のところ、左のイメージがつかめてしまえばあとはテクスチャを作るだけなのでそんなに難しくはありません。
テクスチャの作成
イメージが決まったら、フォトショップであればコピー&ペーストや選択領域の呼び出しを使って効率的に仕上げていきます。とはいえ、やはり車両数が多くなるといささかマゾヒズムな作業量になってしまうわけですが、耐えます。
オススメは、「ドアの領域を選択」→「選択範囲の保存」→「選択範囲でカットしたレイヤーを作成」xドアの数→ドアレイヤーと非ドアレイヤーに分ける→ドアレイヤーを左右で分割
というやり方です。左の画面のような状態になります。
モデルデータの作成・編集
テクスチャが完成したら、モデルデータを作成・編集します。N209氏のオブジェクトでは、より不自然さを無くすために、ドアのテクスチャが左右均一になっていません。
そのため、いくつかのパターンを用意する必要があります。
ここで必要な作成と編集は、
- 元ファイルの、各画像に合った透過色の設定(今回は黒色を透過色にしました)
- 新規ファイルで、進行方向後ろのドア群(左側面の右側ドア、左側面の左側ドア)前のドア群(左側面の左側ドア、右側面の右側ドア)の合計4つのオブジェクト
- 新規ファイルで、車内のオブジェクト(最も内側。イメージ図でいう「ベース」)
また、アニメーションさせる都合上、2と3のオブジェクトは独立したCSVファイルである必要があります。
ここでは、ベースとなる客室のオブジェクトをcabin.csv、ドアをそれぞれ、編成の前後でflontdoorsL(R).csvとreaddoorsL(R).csvにしました。
※今回気分的にcabin.csvを作りましたが、実際のところは元の車両オブジェクトファイルに統合してしまっても問題ないと思われます。
ドア開閉アニメーションの作成
下準備がようやく済んだところで、ドア開閉アニメーションの作成に入ります。今回使用する要となる変数は、「leftdoors[i]」などの変数になります。
この変数は、自車のi+1両目の車両の、左側のドア開放割合(1で完全開放)を返す変数です(右側はrightdoors[i])。
車両単位でドアの開放の値が取得できるということは、将来的には、ドアカットの場合等、開かないドアなどの再現も可能ということですね。
まずスクリプトを以下に示します。
;Mc207.animatedの中身 ;本体 [object] States=Mc207.csv ;客室 [object] States=cabin.csv ;編成前方ドア左側 [object] States=flontdoorsL.csv TextureShiftXFunction = 31 / 1024 * leftdoors[0] ;編成前方ドア右側 [object] States=flontdoorsR.csv TextureShiftXFunction = 31 / 1024 * rightdoors[0] ;編成後方ドア左側 [object] States=reardoorsL.csv TextureShiftXFunction = -1 * 31 / 1024 * leftdoors[0] ;編成後方ドア右側 [object] States=reardoorsR.csv TextureShiftXFunction = -1 * 31/ 1024 * rightdoors[0]順番に解説していきます。
テクスチャのシフトの概要
今回も、信号機同様テクスチャのシフトを行っています。
テクスチャのシフトは正の方向のとき、左向きに行われます。
左側のドアは、ドアが開くときに正の方向でシフトし、右側のドアは、ドアが開くときに負の方向にシフトするということですね。
テクスチャのシフトは正の方向のとき、左向きに行われます。
ドア1枚あたりの開閉の最大移動幅
さて、シフトする方向が分かったところで、実際の値はどのくらいになるのでしょうか?
シフトする量が1のとき、そのテクスチャがまるまるシフトされることになり、0.5の時には半分シフトされるのは、信号機のチュートリアルで説明したところです。
ドア1枚が開閉される際に移動する量(ドアの開閉幅)は、当然ですがドア1枚分となります。
そこで、ドア1枚の幅をテクスチャのBMP上で計ります。今回使用した画像は幅が1024px、ドアの横幅が31pxでした。
よって、ドア1枚分の移動量を割合にすると、31 / 1024 ≒ 0.03となるわけです。ここではより正確な値を出すため、近似値ではなく31 / 1024をそのまま使っています。
つまり、移動量を+0.03とすると、左側のドアはほぼ開いた状態になるということですね。
シフトする量が1のとき、そのテクスチャがまるまるシフトされることになり、0.5の時には半分シフトされるのは、信号機のチュートリアルで説明したところです。
ドア1枚が開閉される際に移動する量(ドアの開閉幅)は、当然ですがドア1枚分となります。
そこで、ドア1枚の幅をテクスチャのBMP上で計ります。今回使用した画像は幅が1024px、ドアの横幅が31pxでした。
よって、ドア1枚分の移動量を割合にすると、31 / 1024 ≒ 0.03となるわけです。ここではより正確な値を出すため、近似値ではなく31 / 1024をそのまま使っています。
つまり、移動量を+0.03とすると、左側のドアはほぼ開いた状態になるということですね。
ドアの開放割合
ドアの開放割合は、1のとき完全開放となります。
ドアの画像は閉じているときを基準に作りましたので、 左側のドアを開放している際のずらし量は、開放割合 * 最大移動幅で求まることになります。完全開放の1のときは最大移動幅分移動している=ドアが見えなくなるということですね。 よって、左側のドアのずらし量は、
右側の場合には、移動方向が負の値になるので、上の値に-1をかければよいだけです。
2両目となるM207.animatedでは、leftdoors[i]のiに入る値は1になり、3両目となるTc206.animatedでは2が入ることになりますが、それ以外はコピー&ペーストでOKです。ドアの画像は閉じているときを基準に作りましたので、 左側のドアを開放している際のずらし量は、開放割合 * 最大移動幅で求まることになります。完全開放の1のときは最大移動幅分移動している=ドアが見えなくなるということですね。 よって、左側のドアのずらし量は、
TextureShiftXFunction = 31 / 1024 * leftdoors[i]
となるわけです。 (iは車両インデックス、i+1両目を示す)右側の場合には、移動方向が負の値になるので、上の値に-1をかければよいだけです。
実際、個別にleftdoors[i]を使いたい場合には、事実上車両ごとにanimatedファイルを作る必要があります。(たとえ全く同じ車両でも、編成内の位置が違うだけでiの値は異なります)
が、まぁ実際のところは先頭車両のドアの状況に合わせていても、あまり不自然さは無いと思います。(ドアカット再現の場合を除く)
完成!
これで、無事ドアの開閉を再現することができました。ところで、207系がこのアングルでドア開閉を行っていると、どことなく電車でGO! 3を思い起こすのは私だけじゃないはず。
■■左の画像をクリックすると動画が見れます■■
音声に若干のズレがありますが、それは追々修正していくことにしましょう。(Ver0.9.5ではかなり是正されました)※実際に運行されている3両編成の207系は、Mc - T - Tcで運行されているようです。
ダウンロードとリンク
参考リンク
以下のリンク先のデータを教材として使用いたしました。
公開されている付属編成氏、N209氏には改めて厚く御礼申し上げます。
公開されている付属編成氏、N209氏には改めて厚く御礼申し上げます。
- ec207 via 中央線
- 207系1000番台のBVEデータがダウンロードできます。DL後、上の教材セットを追加することでOpenBVE仕様になります。
- Ossanbackerのつりぼり
- JR西日本系のオブジェクトデータ等が多数あります。
| ホーム>OpenBVE 日本語リファレンス>OpenBVEでドアの開閉を再現 |
|
(C) 2009 神乃木製作所 All Rights Reserved. |
