![見出し画像](https://assets.st-note.com/production/uploads/images/138147339/rectangle_large_type_2_555cb752b1a6ceb097ff920de84c30bf.png?width=1200)
【RailSim2】ひし形パンタグラフの組み立て方
まえがき
RailSim2での車両プラグイン制作の難関として挙がるのがパンタグラフだ。2Kで使用すれば架線追尾が可能になることもあり、PI制作時に自作化しようとする作者も多い。
だがその性質上、パンタグラフのモデリングは出来ても可動化させるための組み立てが難しいと思う作者も多いことだろう。そこで本稿では、(記事執筆時点で)現在制作中の国鉄401系PIを使用し、パンタグラフの各部品はすでにモデリング済みと想定して、可動パンタグラフの構文の解説を行う。
RailSimでの可動部品は座標が肝
まずは台座から設置していくが、その前にRailSimにおける座標値について説明しよう。
RailSimにおける座標値はメートルで考えるのが手っ取り早いようで、例えばZ軸の値が「-5.5」となっていた場合、プラグインの中心部から-5.5m移動していると解釈できる。
401系のパンタグラフは形式図で見ると車体構体の端部から4250mmの位置に取り付けられている。車体構体長(連結器を省いた車体の長さ)は形式図から計算すると19500mmとなり、半分にすると9750mmとなる。そこから先程の4250mmを引くと5500mm、つまり車体中央部から5.5mの位置にパンタグラフが取り付けられていると読み取ることが出来る。
Z軸=5.5という値はパンタグラフの台座のZ軸座標として使うことができるので、この際の座標値設定は
Joint3D "MeinBody"{
AttachCoord = (0.0, 3.8859, -5.5);
}
となる。ちなみに、Y軸値は実物資料を見つつモデル側の座標値などから割り出したものだ。
![](https://assets.st-note.com/img/1713790242878-C5LEqnIWgL.png?width=1200)
解説用に台座のみにした状態。
台座を置いたら、次に定義するのは架線と接触する摺り板となる。私が作るパンタグラフはこの摺り板の上下(左右)移動にアームが追従する形を取っており、実物とは逆となる。
この際重要なのが、摺り板のマウント先を先程定義した台座にすることである。車体側にマウントしてしまうと、屋根高さが異なる、交直機器があるなどの理由でパンタグラフの取り付け位置が変化する車種に対応できなくなるためである。今回台座は「pantabase_16B」というオブジェクト名で定義しているため、摺り板側の構文は次のようになる。
Joint3D "pantabase_16B"{
AttachCoord = (0.0, 0.3, 0.0);
}
これは折りたたんだ際の値となり、折りたたんだ際に台座と干渉しないようにY軸に+0.3している。
また、このままでは永遠に折りたたまれたままとなるので、上に移動させて展開させる必要がある。構文例は以下のようになる。
ApplySwitch "パンタグラフ"{
Case 0:
StaticMove{
Displacement = (0.0, 0.9041, 0.0);
AnimationTime = 0.5;
}}
Displacementの値は屋根高さや架線高さに合わせて調整する必要がある。
![](https://assets.st-note.com/img/1713791089147-XmA5NNrRhO.png?width=1200)
ちなみに、RailSim2Kで架線追尾を行う場合は構文は以下のようになる。
ApplySwitch "パンタグラフ"{
Case 0:
TrackingMove{
TrackingID = "Trolley";//Line2k.txt::Wireframe::Lineで指定した名前
AscentRange = 2.0;//上昇方向に伸びる限界値
SliderRange = 1.0;//スリ板として認識する横幅
Displacement = (0.0, 0.9041, 0.0);//追尾するべきトラッカーがない場合(範囲を外れている場合)のデフォルト
AnimationTime = 0.5;
}}
Displacementの値は純正版(と同時に作る場合)での値と同じであることがミソだ。
メタセコとRSで座標値を読み替えよ
台座と摺り板を定義出来たので、ここからは難しいとされるアーム類の定義になる。
triangle-zy構文を用いるが、モデル側で事前準備が必要だ。アーム類は以下の画像のようにモデリングしそれぞれ出力する必要がある。
![](https://assets.st-note.com/img/1713791466382-E4aDO0RdZ9.png?width=1200)
この辺りは作者によって考え方が異なる要素になると考えられるが、
構文の簡素化や作業効率化に結びつくのでこの方法を推奨する。
triangle-zyは蒸気機関車のロッドやパンタグラフのアームなど、二点を結ぶ三角形構造を作る際に使う構文となっている。ちなみに、応用するとワイパーの内部機構(往復機構)にも用いることが出来る。
本稿から少し逸れるが、シングルアームパンタグラフを真横から見た様子を単純化すると、「<」の形になり、台座~アーム連結部~摺り板という3点で結ばれている事がわかる。RailSim上のひし形パンタグラフはこの3点構造を2つ向かい合わせにして組み立てているのだ。
![](https://assets.st-note.com/img/1713792405505-PP2YtRCGRi.png?width=1200)
解説用に片側だけにして色付けした状態。
実際に構文を組んでみよう。triangle-zyはtriangle-link-zyという、点を結ぶ辺となるオブジェクトとそのモデルファイルを定義するための構文を2つ連ねる。実際に用いている構文は以下のようになる。
TriangleZY{
Link "armunder1_16B"{
ModelFileName = "";
ModelScale = 1.0;
ApplySwitch "形式"{
Case 0: ChangeModel = "../\R_common\パンタ\PS16_V2\underarm_1.x", 1.0;
}
ApplySwitch "汚れ(非GroupCommon)"{
Case 0:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex.png";
Case 1,2:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex_y.png";
}
JointZYX "pantabase_16B"{
AttachX = 0.0;
AttachCoord = (0.445, 0.03);
LocalCoord = (0.0, 0.0);
}
LinkCoord = (1.05, 0.06);
}
Link "armtop1_16B"{
ModelFileName = "";
ModelScale = 1.0;
ApplySwitch "形式"{
Case 0: ChangeModel = "../\R_common\パンタ\PS16_V2\toparm_1.x", 1.0;
}
ApplySwitch "汚れ(非GroupCommon)"{
Case 0:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex.png";
Case 1,2:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex_y.png";
}
JointZYX "panta_top_16B"{
AttachX = 0.0;
AttachCoord = (0.05, -0.11);
LocalCoord = (0.0, 0.0);
}
LinkCoord = (1.4555, 0.0);
}}
詳しい解説は純正版RS付属のユーザーレファレンスを参照してほしいが、ここで重要なのは「AttachCoord」と「LinkCoord」の2つだ。
まず、下側のアームとなる「armunder1_16B」のマウント先はパンタ台座となり、接続座標の定義を抜粋すると以下のようになる。
JointZYX "pantabase_16B"{
AttachX = 0.0;
AttachCoord = (0.445, 0.03);
LocalCoord = (0.0, 0.0);
}
ここでのAttachCoordはそれぞれZ軸とY軸であり、この値の求め方が特に重要になる。
メタセコイアで「移動」モードにし、「絶対」を選択したうえでポリゴンを選択すると選択したポリゴンの座標値を表示することが出来る。複数選択した場合はその中心値が表示されるが、この中心値が重要だ。
![](https://assets.st-note.com/img/1713784979224-rrYq2SvNX2.png?width=1200)
上の画像では、アームの枠を取り付ける部品である「主軸」の中心部を選択しており、座標はY=3.00、Z=-45.00となっている。
![](https://assets.st-note.com/img/1713793606352-5ZVxZgbSuR.png?width=1200)
この値が下部アームの「回転軸」であるとともに、台座との接続位置となる。つまり、接続したい座標値はこの方法で求めることが出来るのだ。
これをRSに落とし込む際には、出力サイズにもよるが、筆者の環境では1/100した値を設定している。そのため、メタセコ上でのZ軸の値は-45.00だが、RS上でのZ軸値は0.45となる。また必要に応じて微調整を行うこともあるため、実際の設定では0.445となっている。Y軸も同様に設定し、下部アームと台座との接続設定はこれで完了だ。
次は上アームとの接続だが、先ほどと同様、座標を求める過程が必要となる。
![](https://assets.st-note.com/img/1713794110857-E70s7SZxiY.png?width=1200)
こちらで設定するのは「LinkCoord」となる。先程と同様、接続したい位置にあるポリゴンを選択し、座標値を求めて入力し調整すると以下のようになる。
LinkCoord = (1.05, 0.06);
これは次項で触れる上側のアームとの接続位置となり、この値の変動で接続位置が変化するのは上アームとなる。
これで下側のアームは設定できたので、次は上アームの設定になるが、その前に摺り板の接続位置座標を求める。
![](https://assets.st-note.com/img/1713794381959-XUSaRPlL6j.png?width=1200)
摺り板は作風によってディテールが増えたり減ったりするが、
拙作では単純化している。
上アームも下アーム同様、座標値を確認しては定義ファイルに落とし込み調整する作業の繰り返しとなる。
JointZYX "panta_top_16B"{
AttachX = 0.0;
AttachCoord = (0.05, -0.11);
LocalCoord = (0.0, 0.0);
}
画像で示した値とは全くと言っていいほど異なる値が設定されているが、これは座標の調整を行った結果。拙作のPS16の摺り板の接続部はかなりアバウトに作ってあるため、メタセコ上で確認した値がそのまま使えるわけではない。
RailSimにおけるパンタグラフの組み立ては、実物資料と照らし合わせながら、トライアンドエラーを繰り返して行う作業なのだ。
![](https://assets.st-note.com/img/1713794713348-I94fhm9Y2D.png?width=1200)
円形の部品であると中心値が確認しやすい。
この際の定義は以下のようになる。
LinkCoord = (1.4555, 0.0);
こちらはほぼそのままの値を入力した。
アームを上下共に定義するとこの様になる。
![](https://assets.st-note.com/img/1713794794390-bx4SjWrZWk.png?width=1200)
反対側は値の正負を逆転させ、反対側用のモデルに置き換えるだけでよいため、片側が形になればもう片方も簡単に定義できる。
![](https://assets.st-note.com/img/1713794956469-GYD08M8STY.png?width=1200)
これにてひし形パンタグラフ(PS16B形)は完成となる。
あとがき
下枠交差式を含め、一般的なパンタグラフはこの方法で組み立てることができ、下枠交差式などもこの方法を応用することで作ることが出来る。
パンタグラフの構文は今回紹介した作例以外にも、プラグインによって様々な作例があるため、他プラグインを参考にして作ってみて欲しい。
最後に、今回解説に用いたパンタグラフ構文の全体を掲載する。
国鉄401系モハ400形用のもので、製造時期で異なるパンタグラフ取り付け高さやウェザリング時のテクスチャ変更の設定、2K用の差分構文もそのまま掲載している。
//PS16B
Object3D "pantabase_16B"{
ModelFileName = "";
ModelScale = 1.0;
If "車番">=11{//
StaticMove{
Displacement = (0.0, -0.1, 0.0);
}}
If "車番">=23&"車番"<=24{
StaticRotation{
RotationAxis = (0.0, 90.0, 0.0);
RotationAngle = -180;
}}
ApplySwitch "形式"{
Case 0: ChangeModel = "../\R_common\パンタ\PS16_V2\base_B.x", 1.0;
}
ApplySwitch "汚れ(非GroupCommon)"{
Case 0:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex.png";
Case 1,2:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex_y.png";
}
Joint3D "MeinBody"{
AttachCoord = (0.0, 3.8859, -5.5);
}}
Object3D "panta_top_16B"{
ModelFileName = "";
ModelScale = 1.0;
ApplySwitch "形式"{
Case 0: ChangeModel = "../\R_common\パンタ\PS16_V2\top.x", 1.0;
}
ApplySwitch "汚れ(非GroupCommon)"{
Case 0:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex.png";
Case 1,2:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex_y.png";
}
ApplySwitch "パンタグラフ"{
Case 0:
If "車番"<=10{
StaticMove{//にゃほ氏シンプルカテナリー高さ:5.09
Displacement = (0.0, 0.9041, 0.0);//トロリー線高さ-パンタ台座高さ-摺板折りたたみ高さ
AnimationTime = 0.5;
//ReverseTime = 1.2;
}}
If "車番">=11{
StaticMove{//にゃほ氏シンプルカテナリー高さ:5.09
Displacement = (0.0, 1.0041, 0.0);//トロリー線高さ-パンタ台座高さ-摺板折りたたみ高さ
AnimationTime = 0.5;
//ReverseTime = 1.2;
}}
}
/*
ApplySwitch "パンタグラフ"{
Case 0:
If "車番"<=10{
TrackingMove{
TrackingID = "Trolley";//Line2k.txt::Wireframe::Lineで指定した名前
AscentRange = 2.0;//上昇方向に伸びる限界値
SliderRange = 1.0;//スリ板として認識する横幅
Displacement = (0.0, 0.9041, 0.0);//追尾するべきトラッカーがない場合(範囲を外れている場合)のデフォルト
AnimationTime = 0.5;
//ReverseTime = 1.2;
}}
If "車番">=11{
TrackingMove{
TrackingID = "Trolley";//Line2k.txt::Wireframe::Lineで指定した名前
AscentRange = 2.0;//上昇方向に伸びる限界値
SliderRange = 1.0;//スリ板として認識する横幅
Displacement = (0.0, 1.0041, 0.0);//追尾するべきトラッカーがない場合(範囲を外れている場合)のデフォルト
AnimationTime = 0.5;
//ReverseTime = 1.2;
}}
}
*/
Joint3D "pantabase_16B"{
AttachCoord = (0.0, 0.3, 0.0);
}}
TriangleZY{
Link "armunder1_16B"{
ModelFileName = "";
ModelScale = 1.0;
ApplySwitch "形式"{
Case 0: ChangeModel = "../\R_common\パンタ\PS16_V2\underarm_1.x", 1.0;
}
ApplySwitch "汚れ(非GroupCommon)"{
Case 0:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex.png";
Case 1,2:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex_y.png";
}
JointZYX "pantabase_16B"{
AttachX = 0.0;
AttachCoord = (0.445, 0.03);
LocalCoord = (0.0, 0.0);
}
LinkCoord = (1.05, 0.06);
}
Link "armtop1_16B"{
ModelFileName = "";
ModelScale = 1.0;
ApplySwitch "形式"{
Case 0: ChangeModel = "../\R_common\パンタ\PS16_V2\toparm_1.x", 1.0;
}
ApplySwitch "汚れ(非GroupCommon)"{
Case 0:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex.png";
Case 1,2:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex_y.png";
}
JointZYX "panta_top_16B"{
AttachX = 0.0;
AttachCoord = (0.05, -0.11);
LocalCoord = (0.0, 0.0);
}
LinkCoord = (1.4555, 0.0);
}}
TriangleZY{
Link "armtop2_16B"{
ModelFileName = "";
ModelScale = 1.0;
ApplySwitch "形式"{
Case 0: ChangeModel = "../\R_common\パンタ\PS16_V2\toparm_2.x", 1.0;
}
ApplySwitch "汚れ(非GroupCommon)"{
Case 0:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex.png";
Case 1,2:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex_y.png";
}
JointZYX "panta_top_16B"{
AttachX = 0.0;
AttachCoord = (-0.05, -0.11);
LocalCoord = (0.0, 0.0);
}
LinkCoord = (-1.4555, 0.0);
}
Link "armunder2_16B"{
ModelFileName = "";
ModelScale = 1.0;
ApplySwitch "形式"{
Case 0: ChangeModel = "../\R_common\パンタ\PS16_V2\underarm_2.x", 1.0;
}
ApplySwitch "汚れ(非GroupCommon)"{
Case 0:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex.png";
Case 1,2:
ChangeTexture = 0, "../\R_common\パンタ\PS16_V2\PS16B_tex_y.png";
}
JointZYX "pantabase_16B"{
AttachX = 0.0;
AttachCoord = (-0.445, 0.03);
LocalCoord = (0.0, 0.0);
}
LinkCoord = (-1.05, 0.06);
}}
この記事が気に入ったらサポートをしてみませんか?