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


[d'] センサーで取得した値を、ポイントのグローバル変数に代入する。
[e] センサーからポイントの編成判別をおこなうメソッドを実行する。
[f] センサーから得た値からポイントを正/反位のどちらにするか判別する。
[g] ポイントを切り替える。
[センサースクリプト]第一の重要点は、冒頭のVarPoint命令によるポイントオブジェクト変数の宣言と、続くget命令による代入です。get命令の第2引数の{ポイント名}は、実際にはレイアウト上に配置されたポイントに付けた名称に置き換えます。
//センサーイベントを設定
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
[ポイントスクリプト]ポイントの状態は、三叉ポイントを除けば要するに正/反位の2つしかありません。使う/使わないは別にして、とりあえずレイアウト上のすべてのポイントに上記のメソッドを予め用意しておくことをお奨めします。こうしておけば、そこへ至る処理はともかく、call {ポイント名} MtdStraight を実行すれば正位に、call {ポイント名} MtdTurnout としてやれば反位にポイントが切り替わります。[g]はこれがすべてです。
//正位切替メソッド
BeginFunc MtdStraight
SetPointBranch 0
EndFunc
//反位切替メソッド
BeginFunc MtdTurnout
SetPointBranch 1
EndFunc
[f]-1 センサーから編成判別の値を受け取るためのグローバル変数を宣言する。
[f]-2 センサーから実行されるメソッドを作る。
[f]-3 グローバル変数をif命令で調べ、ある条件に当てはまる場合とそうでない場合(追越列車と退避列車に相当)を判別すること。
[f]-4 [f]-3の結果に応じてポイント切替メソッドを実行すること。
[a] 走ってきた編成を判別する必要のある地点(このケースでは駅構内手前で分岐するポイント)の少し前にセンサーを配置する。
[b] 編成には、その編成の性格を示すグローバル変数(公開プロパティ)を用意しておく。このグローバル変数に代入される数値と、編成の性格(追越/退避列車のいずれか)を対応させる。
[c] センサーで編成を検知したら、前述のグローバル変数の値を取得する。
[d] センサーで取得した値を、その値を使って自身の動作を決定するオブジェクト(このケースでは分岐ポイント)に渡す。
[編成スクリプト]上掲サンプルコードのセンサースクリプトが先に箇条書きした[c]に当たります。たとえば、編成Aの{適当な数値}には100が、編成Bのそれには250が代入されていたとします。このとき、編成Aがセンサーを通過すると、ローカル変数TmpTypeには100が、編成Bが通過すると250が得られることになります。この変数TmpTypeをif系命令で判断すれば、編成を判別できることになります。
//編成の性格を示すグローバル変数を宣言
Var VarType
set VarType {適当な数値}
[センサースクリプト]
//センサーイベントを設定
Var EvtSensor
SetEventSensor MtdSenseTrain EvtSensor
//編成検知時に実行されるメソッド
BeginFunc MtdSenseTrain
VarTrain TmpTrain
Var TmpType
//検知した編成オブジェクトを取得
GetSenseTrain TmpTrain
//変数TmpTypeに検知した編成のVarTypeの値を取得
mov TmpType TmpTrain.VarType
EndFunc
(1)ある編成が駅に進入した際、追越列車は通過線に、退避列車は退避線にそれぞれ送り込む、ポイント自動制御の仕組みが要る。
(2)退避/追越列車に出発の可否を伝えるのは当然信号機であり、したがって信号自動制御の仕組みが要る。
(3)退避列車を待たせるには、優先列車が先に出発しある程度駅から離れたことを確認しなければならない。つまり、編成走行位置把握の仕組みが要る。
(4)列車が信号を無視して走行した場合、これに対して何らかの措置を講じないと運転が破綻する。したがって、現実の鉄道でいうところのATSに相当する保安機構の仕組みが要る。
(1)ポイント自動制御
(1)-1 追越列車と退避列車を判別する。
(1)-2 (1)-1の結果に従ってポイントを切り換える。
(2)信号自動制御
(2)-1 信号をどの色にすべきか判別する。
(2)-2 (2)-1の結果に従って信号灯火を切り換える。
(3)編成走行位置把握
(3)-1 経路をいくつかの区間(閉塞区間)に分けて考える。
(3)-2 編成が、区間に進入したことを判別する。
(3)-3 編成が、区間を通過したことを判別する。
(3)-4 (3)-2,3の情報を、外部(他のオブジェクト)から参照する。
(4)ATSに相当する保安機構
(4)-1 (2)(3)によって設定される信号の灯火色を調べる。
(4)-2 信号の灯火色から、とるべき行動(進行/減速/停止)を判別する。
(4)-3 実際に編成の速度を変えて信号を守らせる。