リージョンを跨がるライドツアー

シノバー

2016年04月07日 18:12


Secondlifeでよく見かけるライドツアー、OpenSim世界にもあります。しかしリージョン(SIM)を跨がってのものは、Secondlife内でもOpensim内でもあまり見掛けません。

写真は、しのぐりで走る路面電車。Welcome Area から、隣のリージョン Shopping Town との間を往復します。(しのぐりは現在閉じています。リージョン越えするライドツアーは JOG内 Shinobar Annexなどにあります。)


このライドツアースクリプトは Shinobar が自作したものです。自由にコピー、改変して使えます。

この路面電車は2つの駅の間を往復運動するものですが、設定により、途中駅の設置やさまざまな動きができます。しのぐり Welcome Area から南の島へは、亀が連れて行ってくれます。


JOG(Japan Open Grid)内の Canyon には、気球、ボート、タクシーの3種のライドツアーがあります。Canyonのものはリージョン越えしませんが、動きの参考にしてください。

リージョン越えする気球やボートの最新版は JOG内 Shinobar Annex に置いています。いずれも自由にコピー、改変、再利用できます。改変の方法は、この記事の続きをお読みください。


ツアーライドの作り方
Shinobar Annex や Canyonにある気球やボートをベースに改造して、カスタムのツアーライドを作ることができます。改造のやり方を説明します。

1.エンジン
動きの主役はルートプリムで、いわばエンジン。その他の子プリムは飾りの存在となります。ルートプリムにメインのスクリプトを入れてエンジンとします。基本的にはルートプリムのX軸のプラス方向が進行方向となります。路面電車の場合、下面がレールに接し、上面が電車の床となるような(傾斜を付けた)直方体です。
総プリム数の制限は定かでありませんが、30以下を推奨します。複葉機を飛ばす(機体の入れ替え)の記事も参考にしてください。

2.座席
座席はルートプリム(エンジン)とは別に作るといいでしょう。 sitpose4.4 スクリプトと SITCONFIG で位置調整などをします。座席は複数作れます。

3. コース
コースは「COURSE」で始まる名前のノートカードで指定します。
//Offset 0 0 Shinobar Annex
//175 62 Shinobar Annex

Offset 2 0 Borabora
115 142 //Borabora
230 218 Eater
256 200
280 170
418 103 //Mare

Offset 5 0 Canyon
115 223 Canyon

Offset 0 0 Shinobar Annex
175 62 Welcome Center

行中 // 以降はコメントとして行末まで無視されます。

位置のx座標、y座標の順に、次の z座標は省略すると地表あるいは水面となります。
座標の後ろに停留所名を書くと一時停車します。

Offset文は Offset X Y Region name の形式です。以降のxy座標はオフセット値 x 256 が加算されます。512以上のVarregionであっても、Offsetは 256単位で指定してください。

4. RoundTour設定の詳細
ツアーライドのメインスクリプトの設定の詳細を記します。バージョンにより異なる場合があります。ボートの場合を例に取ります。
integer BALLOON = FALSE; //no tilt
integer BOAT = TRUE; //never land
integer FOLLOW_TERRAIN = TRUE; // follow terrain up/down
integer PHYSICS = FALSE; // use physic vehicle
integer STAY_PHANTOM = FALSE; //make phantom when stopping
integer SIT_AND_GO = FALSE; //starts imidiately when 1 passenger is sit
integer COURSE_REPEAT = FALSE; //repeat course at the end (but only once)
integer MENU = TRUE; //show menu to choose destination
integer CUT_BACK = TRUE; // try to back home crossing regions
integer ONLINE_CHECK = TRUE; //check if next region is online, sometimes fails for varregions

BALLOON = TRUE; にすると、姿勢を変えずに移動します。ただし ANGLE_FOLLOW_TRENGTH の値によって、Z軸まわりの左右回転が生じます。
BOAT = TRUE; では、水上のみを航行し、陸上に上がりません。
SIT_AND_GO = TRUE; とすると、着席するとすぐに動き出します。乗客が1人限定の場合に有用です。
PHYSICS は動きに物理(乗り物)を使うかどうかです。
STAY_PHANTOM は、停止時にルートプリムをファントムにするかとうかです。
ONLINE_CHECK はリージョン越えのさい、隣のリージョンが存在するかどうかを調べます。大きさの異なるVaregionが混在する場合にチェックがうまく作動しないことがあります。その場合には FALSEを設定してチェックをスキップさせてください。

float GROUND_LEVEL = 0.1; //usually at the lower edge of the root prim
float FLOAT_LEVEL = -0.5; //offset from the water level
float DIVE_LEVEL = -0.5; //dive this level if can
float SURFACE_LEVEL = -0.7; //splashing stops under this level
float FLIGHT_LEVEL = 0.0; //meter, lowest flight height for aircrafts

GROUND_LEVEL でルートプリム下面と地表面との隙間を指定できます。
FLOAT_LEVEL は海に浮かんだ場合のルートプリム下面と水面との高低差です。マイナスの値は沈み込みを意味します。
FLIGHT_LEVEL は気球などで航行するさいの地表からの高さ。

//boundery
float TOOFAR = 2000.0; //maters limit from the original point

コースはノートカードで指定しますが、安全のためスタート地点からの最長距離をここで設定しておきます。

//speed
float SPEED = 32.0; //meter per second
float SPEED_MID = 8.0; //meter per second to pass the turning points
float SPEED_MIN = 2.0; //meter per second to aproach station
float BLOCK_SPEED = 0.25; //meter per second to judge blocking
float PACE_DOWN = 100; //mater, pace down at near target, should be SPEED x 2 or larger
float INTERVAL = 1.0; //seconds

SPEED は最大速度、SPEED_MIN は最小速度です。速度が小さいと、推力も小さくなるので、急勾配の坂を登れない場合があります。
PACE_DOWN は速度変更のタイミング。SPEED の2倍以上を推奨。
INTERVAL が長いと動きが荒くなり、細かすぎるとサーバーの負荷が大きくなります。

//route interpolation
float NEAR_STATION = 20.0; //meter ignore for starting point
float NEAR = 1.5; //x span, where span = speed x INTERVAL
float ANGLE_FORTH = 0.5; //0.0-1.0: angle sensivity

コースで指定した通過点に NEARで指定されるだけ近付いたとき、次の通過点に向かいます。停車駅の場合は、ただちに停車位置に移動します。
ツアー開始のさい、コース冒頭に指定された座標がスタート地点から NEAR_STATION以内であるとき、これを飛ばして、次の通過点に向かいます。
ANGLE_FORTHはコースが曲がるときの補間パラメータ。大きいほどコースに忠実な折れ線に近くなります。

//search water route, boat only
float ANGLE_STEP = 6.0; //degree to search directtion, BOAT only
float ANGLE_MAX = 90.0; //degree max to searc, BOAT only

BOATの場合で陸に上がりそうなとき、これらのパラメータにより水のある方向を探索します。

//vehicle body orientation
float DELTA = 0.05; // clearance of adusting new rotation
//float DELTA2 = 0.5; //0.0 - 1.0 meter to ignore small horizontal vector
float ANGLE_FOLLOW = 60.0; //0.0 - 180.0: degree
float MAX_OMEGA = 0.2; //radian per second, BALLOON only
float ANGLE_FOLLOW_STRENGTH = 4.0; //normally 4.0, phisical only

コースの動きに車体の姿勢をどのように合わせるかのパラメータ。BALLOONの場合は上下の姿勢は変わらず、Z軸回りだけを動かします。

//timings
integer PARKING_TIME = 10; //seconds brief stop
integer TIMEOUT = 180; //seconds before disappering at disposal
integer MENU_TIMEOUT = 180; //seconds timeout to repry menu
integer BLOCK_TIME = 10; // x INTERVAL to see blocking
float MOMENT = 0.0; // wait time before back home
float REGION_MOMENT = 1.0; //second wait time at crossing regions

Rezzer などから出しての使い捨てモードのとき、TIMEOUT待っても乗車が無いと消滅。
BLOCK_SPEED, BLOCK_TIME のパラメータにより、障害物などで止まっていると判断されると、ツアーを中断します。
ツアー終了後、MOMENT経って原点に戻るか、使い捨てモードのときは消滅します。
リージョンを越えたとき、 REGION_MOMENTの間休止します。

乗り物