オブジェクトベンダー

img

■ 概要

このツールはオブジェクトのセグメントを結合して、メッシュを曲げることができます。 これはレールや壁、堤防など、曲がった形状のオブジェクトを作るのに有用です。 セグメントは B3D か CSV フォーマットでなければなりません。 あなたはセグメントをこれらで用意しなければならず、 B3DかCSVのオブジェクトのファイルフォーマットの基本的な作成の知識が必要なことを意味します。 詳しくはそれぞれのドキュメントをご覧ください。

Object Bender はGUIとコマンドライン双方のインターフェースを備えます。 コマンドライン引数を省略して起動すると、GUIが起動します。 GUIは本プログラムの独習と慣れるのに有用です。 長期的に見た場合、コマンドラインに変更されるほうが良いとでしょう。 目的別のコマンドライン引数のリストは下記のとおりです。

バイトオーダーマーク (BOM) が異なるUnicodeエンコーディングが示されない限り、Object Benderは常にUTF-8として解釈することに注意してください。非Unicodeのエンコーディングはサポートされません。

サポートされるオブジェクトのファイルフォーマット:

■ コマンドライン引数

引数 意味
/? コマンドライン引数の一覧を表示します。
入力ファイル 入力ファイルのパスを指定します。 B3D もしくは CSV ファイルを指定します。
出力ファイル 出力先ファイルのパスを指定します。 ファイルフォーマットは入力ファイルのフォーマットと同一です。
/n=セグメント セグメントの個数。
/s=セグメント長 各セグメントの長さを、メートル単位で指定します。
/b=ブロック長 ブロックの長さをメートルで指定します。レールオブジェクトなどに用いる場合など、ゼロが指定された場合は回転しません。
/r=半径 半径をメートルで指定します。 負の値は左側、正の値は右側です。ゼロの場合はカーブを生成しません。
/g=レール幅 レールのゲージ幅をミリメートルで指定します。カントが適用される場合は必ず指定しなければなりません。
/u=始点のカント オブジェクトの始まりの時点のカントをミリメートルで指定します。
/v=終点のカント オブジェクトの終点のカントをミリメートルで指定します。
/a 出力先のファイルを上書きせずに追記します。

例:

ObjectBender input.csv output.csv /n=25 /s=1 /b=25 /r=600

■ Object Benderの振る舞い

Object Bender はZ軸方向に向かってセグメントのコピーを生成します。 各々のコピーはGUIもしくはコマンドラインで指定されたセグメントの長さに従ってオフセットされます。 はじめのセグメントは何も修正されず残され、二番目のセグメントはセグメント長に従ってZ軸方向にシフトされます。 三番目のセグメントは 2セグメント長、4番目は 3セグメント長、という具合です。

コピーが生成されると、 Object Bender は極座標変換を行います。 簡単に言うと、Z軸は円の中心座標(Radius,0,0)のある方に向かって曲がります。 言い換えると、右側は正の値、左側は負の値です。 ブロック長が指定された場合、 最後のオブジェクトは回転します。それ故レールオブジェクトの生成に有用です。

Object Bender ではSetTextureCoordinates (CSV) と Coordinates (B3D) コマンドにおいて、コメントとして特別なマークアップを受け入れます。これらは Object Bender がテクスチャを張る座標を各々のセグメントにおいてシフトさせる機能に用いられます。

{X=} 各セグメントにおいて の数値分、テクスチャをX軸の方向にシフトさせます。
{Y=} 各セグメントにおいて の数値分、テクスチャをY軸の方向にシフトさせます。

このマークアップはSetTextureCoordinates/Coordinates commandと同一の行におけるコメント内のどこにでも記述できます。 詳細はチュートリアルを参照してください。

■ チュートリアル

こちらではどの様に Object Bender を用いてカーブレールを生成するか簡単なチュートリアルを示します。 基本的なことはさておきまして、こちらのチュートリアルではテクスチャの座標を適切に取り扱いどのように働くのか、また、コマンドラインのインターフェースで効率的に動作させる方法も示します。

● 基礎

私達はこれから25mのブロック長、軌間1435mm、半径600mで、右方向に曲がるカーブレールオブジェクトを作ろうと思います。最初に必要なものは5mの長さの短いレールのセグメントです。

segment.csv
; 左側のレール
CreateMeshBuilder
AddVertex,-0.7775,0,0
AddVertex,-0.7775,0,5
AddVertex,-0.7175,0,5
AddVertex,-0.7175,0,0
AddFace,0,1,2,3

; 右側のレール
CreateMeshBuilder
AddVertex,0.7775,0,0
AddVertex,0.7775,0,5
AddVertex,0.7175,0,5
AddVertex,0.7175,0,0
AddFace,3,2,1,0

; バラスト
CreateMeshBuilder
AddVertex,-1,-0.2,0
AddVertex,-1,-0.2,5
AddVertex,1,-0.2,5
AddVertex,1,-0.2,0
AddFace,0,1,2,3
SetColor,150,125,100

今必要なものとして、上記のコードはテクスチャを用いず、簡単なものを作りました。 GUIとして起動した後、 この入力ファイル(segment.csv)を選択し、 必要に応じてパラメータを入力していきます。 私達は今5mの長さのセグメントを持ち、ブロック長は25mですから、それ故にブロックを埋めるためには5つのセグメントのコピーが必要となります。

Number of segments: 5
Segment length: 5
Block length: 25
Radius: 600

レール幅は設定する必要はありません。なぜなら今回私達はカントを生成しないからです。 いま私達は出力先のファイルを例えば right_curve_600.csv として選び、Startボタンを押下します。 すると Object Bender はシンプルに Done! とメッセージを出力します。 半径を-600と設定し、出力先ファイルを例えば left_curve_600.csv と変更し、Startボタンをもう一度押すだけで、同様の設定を持った左カーブを追加で生成できます。

● テクスチャの座標設定を伴う動作

今回は単色ではなく、適切なテクスチャが設定されるものとしましょう。 例:

segment.csv
; バラスト
CreateMeshBuilder
AddVertex,-1,-0.2,0
AddVertex,-1,-0.2,5
AddVertex,1,-0.2,5
AddVertex,1,-0.2,0
AddFace,0,1,2,3
LoadTexture,ballast.png
SetTextureCoordinates,0,0,0
SetTextureCoordinates,1,0,1
SetTextureCoordinates,2,1,1
SetTextureCoordinates,3,1,0

注意すべき点として、上記のコードにおけるテクスチャのy軸 は特別なz軸に対応していることです。 もし今、画像データがオブジェクトのz軸方向に向かってコピーされているとすると、各セグメントでは1つのコピーしか得られないことになります。 例えば5m毎に1つのコピーです。 これは望ましいことかもしれませんが、 例えばテクスチャを25メートルのブロック全体で1つのテクスチャを用いるようにデザインしたとしましょう。 このケースでは、ひとつのセグメントでは全てのテクスチャを表示しない上に表示せず、しかしながらちょうど 1/5 です。 こうしたケースの目的のために、 最初にセグメントを正しく表示しなければなりません:

segment.csv
; バラスト
CreateMeshBuilder
AddVertex,-1,-0.2,0
AddVertex,-1,-0.2,5
AddVertex,1,-0.2,5
AddVertex,1,-0.2,0
AddFace,0,1,2,3
LoadTexture,ballast.png
SetTextureCoordinates,0,0,0.0
SetTextureCoordinates,1,0,0.2
SetTextureCoordinates,2,1,0.2
SetTextureCoordinates,3,1,0.0

上記のコードにおいて、テクスチャは 1/5 (=0.2)しか表示されていません。 もしいま私達がObject Bender で複数のセグメントを持つ長いオブジェクトを結合するために用いる場合、 其々のセグメントは結果としてテクスチャの最初の5分の一の部分だけで全て表示します。 この結果はもちろん望ましいものではありません。 私達が望むのは各セグメントにおいて0.2づつY軸に沿ってシフトするものです。 Object Bender はこのために SetTextureCoordinates コマンドのコメント欄において特別なマークアップを受け入れます。 ですので追加してみてください。

segment.csv
; バラスト
CreateMeshBuilder
AddVertex,-1,-0.2,0
AddVertex,-1,-0.2,5
AddVertex,1,-0.2,5
AddVertex,1,-0.2,0
AddFace,0,1,2,3
LoadTexture,ballast.png
SetTextureCoordinates,0,0,0.0 ; {Y=0.2}
SetTextureCoordinates,1,0,0.2 ; {Y=0.2}
SetTextureCoordinates,2,1,0.2 ; {Y=0.2}
SetTextureCoordinates,3,1,0.0 ; {Y=0.2}

現段階で、Object Bender は上記のサンプルのうちSetTextureCoordinatesの4行について、各セグメントでyの値に都度0.2追加しなければならないことを認識しています。 それ故に最初のセグメントは未修正で、2番めのセグメントは0.2から0.4に変更するよう指示に従い、三番目のセグメントは0.4から0.6に、4番めのセグメントは0.6から0.8に、そして最後のセグメントは0.8から1.0に変更されます。 これにより、テクスチャは毎回5セグメントごとに繰り返されます。 セグメント長は5メートルで、毎回25m毎に繰り返されますが、それはすなわちブロック長と同じです。

● コマンドラインインターフェースを用いる

それでは、架線付きのカーブレールオブジェクトを作ってみましょう。 架線は曲がってはいません。それ故に25m長の長いワイヤーです。 私達はこれをひとつのステップで行うことはできません。 なぜならもし架線をsegment.csvに含めてしまうと、コピーされた上に曲がってしまうからです。 その代わりに、双方のオブジェクトを分割して生成し、後に結合します。 コマンドラインインターフェースを通じてカーブレールを生成しようとした場合、端末から以下のコードを入力します。

Terminal
ObjectBender segment.csv right_curve_600.csv /n=5 /s=5 /b=25 /r=600

では次に、ファイルに組み込むために架線を作ってみましょう。

wire.csv
AddVertex,-0.03,5,0
AddVertex,-0.03,5,25
AddVertex,0.03,5,25
AddVertex,0.03,5,0
AddFace,3,2,1,0
SetColor,0,0,0

上記のコードは単線の25m長のワイヤーです。 最初からオブジェクト長は25m長を与えてあり、 私達は追加のコピーを生成する必要がなく、ちょうど一つのセグメントで済みます。 これをright_curve_600.csv に追加します。 この場合以下の方法で行います:

Terminal
ObjectBender wire.csv right_curve_600.csv /n=1 /s=25 /b=25 /r=600 /a

最後の /a のスイッチは Object Bender がターゲットファイルの生成結果の末尾に架線を追加するためのもので上書きしません。 バッチファイルに記述し、結合してみましょう。 このバッチファイルは Windows上で呼び出すことができます。

start.bat
ObjectBender segment.csv right_curve_600.csv /n=5 /s=5 /b=25 /r=600
ObjectBender wire.csv right_curve_600.csv /n=1 /s=25 /b=25 /r=600 /a

もしあなたがセグメントや架線のオブジェクトに変更を加えようとしたいなら、好きなときにバッチファイルを実行するだけで生成結果を更新することができます。 同様により長いバッチファイルで左右の違う半径のカーブレールを以下の方法で生成することができます:

start.bat
; 左向きでR300m
ObjectBender segment.csv left_curve_300.csv /n=5 /s=5 /b=25 /r=-300
ObjectBender wire.csv left_curve_300.csv /n=1 /s=25 /b=25 /r=-300 /a
; 右向きでR300m
ObjectBender segment.csv right_curve_300.csv /n=5 /s=5 /b=25 /r=300
ObjectBender wire.csv right_curve_300.csv /n=1 /s=25 /b=25 /r=300 /a
; 左向きでR600m
ObjectBender segment.csv left_curve_600.csv /n=5 /s=5 /b=25 /r=-600
ObjectBender wire.csv left_curve_600.csv /n=1 /s=25 /b=25 /r=-600 /a
; 右向きでR600m
ObjectBender segment.csv right_curve_600.csv /n=5 /s=5 /b=25 /r=600
ObjectBender wire.csv right_curve_600.csv /n=1 /s=25 /b=25 /r=600 /a

あなたがなにかのアイデアを得られるよう期待しています。