2007/4/30

2007年4月のまとめ  月刊まとめ
順風逆風ともに春の嵐が吹き荒れた2007年4月のまとめ。

● VRM入道的ネットVRM界隈今月のピックアップ

レイアウト製作日記@VRM4チャレンジ日記
VRM4-comVignette
 関連:VRM4-comVignetteについて一言
スクリーンショットが撮れたのだが・・・@ほいほいとぼとぼ絵日句記

全体的にはミクロ系ネタが印象的だった今月のネットVRM界隈の中でも、敢えてマクロ系の期待のネタをピックアップ。

まるぼろ氏のレイアウト製作日記は、スクリプト/スクロールによる各種ギミックを組み込んだレイアウトを作る上でつまづきがちなツボを、実際につまづきながら解決していく過程が書かれているという点で、画期的なコンテンツ。

Zio氏のcomVignetteは、古くはVRM2時代のモジュールレイアウトムーブメントまで遡るユーザー主導の標準規格策定プロジェクト。強力な援軍としてfox氏沖ノ鳥島氏も参戦を表明し、今後の進展が期待される。

ほいほいとぼとぼ日記は、VRMを使って古地図から歴史的な路線を再現しよう、という、ありそうでなかった試み。個人的には、このweblogのコメント欄にしばしば登場する“鉄道模型シミュレーター鑑賞委員会”と名乗る御仁に興味津々。

「VRMfoxTextureCompose」の使用方法@fox-hobby-garden
 関連:“とれたて”とfoxTexture

ミクロ系のネタからは、てった氏とfox氏のコラボレーションが生み出した車両用画像リソース生成ツールをピックアップ。既にこれを活用した作例も出てきており、ネットVRM界隈における分業を推奨してきたボクとしては非常に興味深い。

● 今月の注目ニュース

第6号リリース記念余部王選手権

今月の最大トピックはVRM4第6号のリリース。これを記念してネタを振ってみたのだが、後述するところの“セカンドインパクト”をうけて、いささか尻つぼみになった感も。

なにはともあれ、余部王を推挙せねばならんワケです。ボクの趣味的には思わずコイツにしたくなるんですが。

そういう冗談は捨て置き、ボクの独断と偏見で、余部王に登極するのはこの人に決定します。決め手は“直通エレベーター”でした。おめでとう、遠慮なく特典を活用してね。え、要らない?

VRM4追加キット C57 11 かもめ専用機
 関連:何事もバランスが肝心だと思うので

問題のセカンドインパクトは、満を持して登場したVRM4プレミアムトレイン第一弾。ネットVRM界隈はもちろんのこと、本稿執筆時点でもVRM会議室のCaldia氏が立てたスレッド(メッセージNo.10280〜)は伸びている由。とりあえず次の焦点は、最初にコレを入手し、ネット上でネタにするのは誰か、かな?

・Tatsuo氏引退宣言

ネットVRM界隈の長老的存在であったTatuso氏が、今月6日に引退を宣言されました。ボク自身、氏の作例からは多くのことを学ばせていただきました。改めて、氏のネットVRM界隈に対する功績を讃え、最大の感謝を捧げたいと思います。

● 自薦VRM論考&ネタ

VRM逢魔時仮説
二日ぶりに見ても“とれたて”
鉄道模型レイアウターF2006のFOVを変更する方法
junichi氏の“夜間走行”は作者自身が思っているよりも凄い作例かも知れない件
ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(連載中)

以上、2007年4月のまとめでした。
0

2007/4/29

中間台車ご乱心  電波ゆんゆん
堅い活字が続いているので、ビジュアル系(?)のお馬鹿話を1つ。

クリックすると元のサイズで表示します
<DD51 on R243>

上写真は、TOMIX FineTrack(ミニレールを除く)の最急曲線となるC243-45の上に、DD51(TOMIX旧製品)を停車させた状態です。表題にも掲げているように、中間台車がカーブ外側に向かって飛び出しているのがわかります。車輪の上面がこのアングルで見えていますから、これが異常な状態だってのはご理解いただけますね。

無論、リアル鉄道模型もたしなむ方は周知と思いますが、これは本来ありえない急カーブを模型車両が通過するための工夫の1つであって、模型の瑕疵ではありません。見た目のリアリティとレイアウト上のプレイアビリティは、必ずしも一致しないってことですね。

で。

不意に、同じ状態をVRMビュワーで見たらどうなっているんだろう、と疑問に感じたので見てみました。

クリックすると元のサイズで表示します
<VRMではこうなる>


・・・ん?

中間台車車輪の上面が見えませんね。
と言うことは・・・

続きを読む
0

2007/4/28

ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(4)−分岐ポイントを切り替える  VRMスクリプト禅問答
<<前回へ

今回は、課題(1)-2“(1)-1の結果に従ってポイントを切り換える”についてです。下線部(1)-1の結果とは、前回、センサースクリプトにおいて編成オブジェクトから取得した「編成の性格(追越/退避列車のいずれか?)を示す値」です。

まず、大まかに何をしなければならないか、列挙してみましょう。

[d'] センサーで取得した値を、ポイントのグローバル変数に代入する。
[e] センサーからポイントの編成判別をおこなうメソッドを実行する。
[f] センサーから得た値からポイントを正/反位のどちらにするか判別する。
[g] ポイントを切り替える。

[d']は、前回の[d]を言い換えたもので、基本的には同じことです。[e]と合わせてミニマムなサンプルコードを以下に示します。なお、センサースクリプトは前回してしたサンプルコードに追記したもので、前回既に示されていた部分は文字色を薄くしています。
[センサースクリプト]
//センサーイベントを設定
Var EvtSensor
SetEventSensor MtdSenseTrain EvtSensor

//このセンサーが担当するポイント
VarPoint ObjPoint
get ObjPoint {ポイント名}

//編成検知時に実行されるメソッド
BeginFunc MtdSenseTrain
  VarTrain TmpTrain
  Var TmpType
//検知した編成オブジェクトを取得
  GetSenseTrain TmpTrain
//変数TmpTypeに検知した編成のVarTypeの値を取得
  mov TmpType TmpTrain.VarType

//[d']ポイントのグローバル変数にTmpTypeの値を代入
  mov ObjPoint.VarTrainType TmpType
//[e]ポイントの編成判別メソッドを実行
  call ObjPoint MtdCheckType
EndFunc
第一の重要点は、冒頭のVarPoint命令によるポイントオブジェクト変数の宣言と、続くget命令による代入です。get命令の第2引数の{ポイント名}は、実際にはレイアウト上に配置されたポイントに付けた名称に置き換えます。

この部分は、このセンサーが「私は{ポイント名}を担当するセンサーである」と述べている部分になります。以降、スクリプト内では、目的のポイントに何かをするに際し、常にこのポイント変数ObjPointを使っています。これも前回同様に、後々の修正の手間(get命令の{ポイント名}だけを書き換えれば、制御対象のポイントを簡単に変更できる)を考えての措置です。さらに、もう1つ別のセンサーとポイントの組に同じような仕掛けを組み込む場合、このget命令に続く{ポイント名}以外の部分は、コピー&ペーストするだけで使えます。

続いてポイントスクリプトに取り掛かりましょう。順序が前後しますが、先に[g]からいきます。
[ポイントスクリプト]
//正位切替メソッド
BeginFunc MtdStraight
  SetPointBranch 0
EndFunc
//反位切替メソッド
BeginFunc MtdTurnout
  SetPointBranch 1
EndFunc
ポイントの状態は、三叉ポイントを除けば要するに正/反位の2つしかありません。使う/使わないは別にして、とりあえずレイアウト上のすべてのポイントに上記のメソッドを予め用意しておくことをお奨めします。こうしておけば、そこへ至る処理はともかく、call {ポイント名} MtdStraight を実行すれば正位に、call {ポイント名} MtdTurnout としてやれば反位にポイントが切り替わります。[g]はこれがすべてです。

その上で、残る[f]の部分ですが、これは試みに読者の宿題にして敢えてサンプルコードは示さないことにしましょう。以下、この部分でやらなければならないことを列挙しますと・・・

[f]-1 センサーから編成判別の値を受け取るためのグローバル変数を宣言する。
[f]-2 センサーから実行されるメソッドを作る。
[f]-3 グローバル変数をif命令で調べ、ある条件に当てはまる場合とそうでない場合(追越列車と退避列車に相当)を判別すること。
[f]-4 [f]-3の結果に応じてポイント切替メソッドを実行すること。

になります。なお、[f]-4に際し、この場合実行する[g]ポイント切替メソッドは自分自身(ポイントオブジェクト)の中にありますから、call命令は、call {ポイント名} {メソッド名}ではなく、call this {メソッド名}になる点に注意してください。わからないことがあれば、随時コメント欄にどうぞ。

以上で、編成側に用意したグローバル変数の値に応じて、分岐ポイントを切り替える仕掛けの解説を終わります。ちなみに、合流ポイント、特に駅出発直後のそれについては、出発信号との連動や保安機能の組み込みが関係してくるのでこの手法では解決できません。これは、後日の課題となります。

次回へ>>
0

2007/4/26

ゆゆぽん☆退避/追越列車とか作っちゃうかMona-(3)−追越列車と退避列車を判別する  VRMスクリプト禅問答
<<前回へ

いよいよ具体論に入ります。今回は課題(1)-1“追越列車と退避列車を判別する”についてです。なお、話を単純化するために、列車は原則一方通行(上下線完全分離)である前提で進めていきます。

まず、結論から。

[a] 走ってきた編成を判別する必要のある地点(このケースでは駅構内手前で分岐するポイント)の少し前にセンサーを配置する。
[b] 編成には、その編成の性格を示すグローバル変数(公開プロパティ)を用意しておく。このグローバル変数に代入される数値と、編成の性格(追越/退避列車のいずれか)を対応させる。
[c] センサーで編成を検知したら、前述のグローバル変数の値を取得する。
[d] センサーで取得した値を、その値を使って自身の動作を決定するオブジェクト(このケースでは分岐ポイント)に渡す。

[a]については、直感的にそうでなければならないことはご理解いただけると思いますので解説は省略します(詳述が必要であればコメント欄でリクエストしてください、以下同)。

今回の肝は[b]の部分です。ネットVRM界隈で交わされるVRMスクリプトのコードを見ていると、しばしばVarTrain命令で宣言されるところのTrain変数(編成オブジェクト変数)を比較することで、センサーが検知した編成の判別を試みているものを見受けます。これはお奨めできない手法です。理由は以前に書いたこちらを参照してください。

センサーが検知した編成を判別するには、オブジェクト名(編成名、厳密には編成オブジェクトへの参照)ではなく、レイアウト上の編成それぞれに事前に設定したグローバル変数を使う癖をつけておいた方が、何かと便利です。ミニマムな形でサンプルコードを示すと、以下のようになります。
[編成スクリプト]
//編成の性格を示すグローバル変数を宣言
Var VarType
set VarType {適当な数値}

[センサースクリプト]
//センサーイベントを設定
Var EvtSensor
SetEventSensor MtdSenseTrain EvtSensor
//編成検知時に実行されるメソッド
BeginFunc MtdSenseTrain
  VarTrain TmpTrain
  Var TmpType
//検知した編成オブジェクトを取得
  GetSenseTrain TmpTrain
//変数TmpTypeに検知した編成のVarTypeの値を取得
  mov TmpType TmpTrain.VarType
EndFunc
上掲サンプルコードのセンサースクリプトが先に箇条書きした[c]に当たります。たとえば、編成Aの{適当な数値}には100が、編成Bのそれには250が代入されていたとします。このとき、編成Aがセンサーを通過すると、ローカル変数TmpTypeには100が、編成Bが通過すると250が得られることになります。この変数TmpTypeをif系命令で判断すれば、編成を判別できることになります。

最後に[d]ですが、これは拙作gws/1.0規格自動運転スクロールでは採用していない方法論です(当該スクロールの解析を試みた方向けの言い訳)。スクロールの場合、オブジェクトへのスクリプトの流し込みはSCRIPTウィザードという(不備はあるものの)視覚的なGUIがやってくれるので、ここで言う判別処理が実際にどのオブジェクトでおこなわれるか、があまり問題になりません。これに対し、今回のケースは自分で手作業でスクリプトを書いて歩くことを想定しています。このような場合、たとえば、一旦動く仕組みを作り上げてから、その動作の一部に変更を加える事態を想定しておく価値があります。

事実、[b]はまさにそれを体現していて、編成スクリプト内のグローバル変数の値がその編成の性格を示している、ということは、すなわち、編成スクリプトのその値だけを変更すれば、このグローバル変数を判別して動作するところのすべてのオブジェクトの動作を変更できることに他なりません。つまり、編成がどこを走るか、を、それがどこに記述されているかを考えた場合に、直感的に判断しやすい編成スクリプトの一行に集約できる、というのが[b]の価値です。

同じ考え方からいくと(絶対にそうではなくてはならない、という性質のものではありませんが)、センサーが検知した編成から得たグローバル変数の値を判別する処理は、この値によって正/反位へ切替をおこなうポイントのポイントスクリプト内に書かれていた方が良いと言えます。つまり、そのポイントのスクリプトさえ変更すれば、どの編成(厳密には編成から得られる変数の値)を正位方向に向かわせ、どの編成を反位方向へ向かわせるのか修正できる、ということです。

具体的なスクリプト記述については、ポイント側の処理が絡んできますから、次回改めて解説することにします。

次回へ>>
0


teacup.ブログ “AutoPage”
AutoPage最新お知らせ