ボートと亀のツアーライド

Make your Tour Ride シリーズ。スピードボートと亀とをリリースしました。 Japan Open Grid (JOG) 内の Shinobar Annex スクリプトの館でそのキットを無料配布しています。

ボートのツアーライドは地形を読み、陸地を避けて水面のみを走行します。
ただし乗降のできるターミナルが水面から20m以内であれば陸地にあっても構いません。たとえばこのキットに含まれる亀は海から20m以内であれば侵入します。

この亀は水中を潜って航行します。スクリプトの設定は次のようになっています。
float GROUND_LEVEL = 0.1;   //usually at the lower edge of the root prim

float FLOAT_LEVEL = -0.2; //offset from the water level
float DIVE_LEVEL = -5.0; //dive this level if can
float SINK_LEVEL = -0.7; //entire body is under the water level, splashing stops under this level
float FLIGHT_LEVEL = 0.0; //meter, lowest flight height for aircrafts

可能な限り DIVE_LEVEL で航行します。乗降のできるターミナルでは FLOAT_LEVEL まで上がってきます。潜っているときに水しぶきを上げるのは不自然なので、SINK_LEVEL 以下に潜っているときには水しぶきを停止します。

Posted on 18 Apr 2018, 9:27 - カテゴリ: ツアーライド
No comments - Edit - Delete


ココ・タクシー

ライドウアーを作ろう!シリーズ第2弾。ココ・タクシーです。Japan Open Grid (JOG) 内の Shinobar Annex スクリプトの館でそのキットを無料配布しています。

コースはノートカードで指示します。配布のものに同梱されているものは、 Shinobar Annex の中を走るものです。あなたのSIM用のコースに書き換えてください。

Course Annex の中身は次のようなものです。
// Offset X Y Region name

// Offset 以降の座標は 256xX, 256xY が加算されます。Varregionでも 256単位で数えてください。
// x y (z) (Station name)
// 通過点の座標。zが省略されると地表あるいは水面となります。
// Station name が書かれていると、そこでいったん停止し昇降ができます。書かれていなければ単なる通過点となります。

//Loop //末尾に至ると、続きはコースの最初から始まります。
//Oneway //末尾に至るとツアーを終了し、機体は直ちに出発点に戻ります。
//Shortcut //メニューから目的地が指定された場合、目的地までを直線で航行します。

// それぞれの項目は半角スペースで区切ってください。全角の空白が入らないよう注意してください。

128 128 Welcome Center
144 128
146 128 22
164 128 22
172 128
172 83 ボート乗り場
83 83 ダンスの館
83 172 スクリプトの館
128 172
128 164 22
128 143 22
Loop

気球などと違ってコースの指定を細かく指定しないと、建物を突き抜けたりとんでもない動きをします。

このスクリプトは地形を読みながら航行します。そこに橋が掛かっていても、地形のほうに追従するので、橋をすり抜けて地表あるいは水面に落ちてしまいます。これを避けるには橋の手前と渡った先、少し余裕を持った位置を Z座標を含めて指定しておきます。

このシリーズに限らずOpenSimでの乗物で RezzerからRezされたものはリージョンを越えることができません。リージョン越えできるのはインベントリから Rez されたものに限られます。

Posted on 18 Apr 2018, 0:34 - カテゴリ: ツアーライド
No comments - Edit - Delete


ツアーライドを作ろう

Secondlifeでよく見掛けるツアーライド。あなたのSIMにも設置しませんか?立ち寄るスポットをノートカードに記述するだけで、ツアーライドが作れます。

熱気球のツアーライドは Japan Open Grid 内の Dejimaで試乗できます。それをコピーてもいいですが、 Shinobar Annex スクリプトの館でも無料配布しています。もちろんコピー改変可です。

熱気球を JOGの Sandbox でRezすれば動きますが、あなたのSIMでRezしても動きません。中身のノートカード COURSE を書き換えなければなりません。

たとえば COURSE Round Tour meets にはこのように書かれています。
// Offset X Y Region name

// Offset 以降の座標は 256xX, 256xY が加算されます。Varregionでも 256単位で数えてください。
// x y (z) (Station name)
// 通過点の座標。zが省略されると地表あるいは水面となります。
// Station name が書かれていると、そこでいったん停止し昇降ができます。書かれていなければ単なる通過点となります。
Loop //末尾に至ると、続きはコースの最初から始まります。
//Oneway //末尾に至るとツアーを終了し、機体は直ちに出発点に戻ります。
//Shortcut //メニューから目的地が指定された場合、目的地までを直線で航行します。

// それぞれの項目は半角スペースで区切ってください。全角の空白が入らないよう注意してください。

Offset 0 0 JOG meets
128 160 JOG meets

Offset -1 0 Dejima
112 118 25.8 Dejima

Offset -1 1 JOG Cemter Sim
110 110 20.6 JOG Center SIm

Offset -2 1 Avatar Center
128 128 21.5 Avatar Center

Offset 0 1 SandBox
40 132 Building Supplies

Offset 1 1 B03
55 200 Furniture

Offset 1 0 D01
20 164 23 Amusement

「//」以降、行の終わりまではコメントとして無視されます。

各スポットの「X座標 Y座標 Z座標 停留所名」を記述しますが、Z座標は省略できます。また停留所でなく途中通過点は station name も省きます。

Offset 文は リージョン越えする場合にのみ必要です。同一リージョン内で完結するなら不要です。

今回リリースするものは、これまでのものを改良した v2となります。大きく変わった点は、ノートカードにコースの扱いについていくつかのバリエーションを指定できることです。

コースの最終位置に来ると、標準だといったん降ろされます。Loop を指定すると、コース末尾の次はコースの先頭に接続しているものと解釈されます。 Oneway ではコース逆行ができないので、コース末尾で降ろされ、機体は出発地に戻ります。

標準では目的地までコースを辿って航行しますが、 Shortcut を指定すると目的地まで直線で直行します。気球などでは Shortcutの設定が適しています。

Posted on 14 Apr 2018, 23:46 - カテゴリ: ツアーライド
No comments - Edit - Delete


乗物を進行方向に向ける

非物理でも llSetKeyfaramedMotion を用いることで、スムースな動きを作ることができます。このときに姿勢を進行方向に合わせるにはどうするかという質問があったので、ここにその方法を説明します。

乗物が現在向いている方向 now_arrow を、移動先を向く方向 new_arrow に回転させる new_rotationllRotBetween関数を使って次のように求められます。
new_rotation = llRotBetween(now_arrow, new_arrow);

移動がX-Y平面に限られる場合は、これでOKです。

移動が上下方向にも動く場合は、やっかいな問題が生じます。上記の方法で回転させると、向きの回転に伴って乗物の前後軸(X軸)を中心にする回転、ロール(roll)が生じます。下手をすると車体が裏返しになったりしてしまいます。

ロールなしに向きだけ変えるには、まず水平(X-Y平面上)で回転させたのちに上下方向の傾きを加えるようにします。

目標地点があまりに近いときや、ほぼ垂直移動の場合に向きがコロコロ変わるのも防いでおかねばなりません。
float TOO_CLOSE = 1.0;   //meter, skip rotation

float SMALL_TILT = 0.1; //0.0-1.0, skip rotation when horizontal movement is small
vector STD_ARROW = <1.0, 0.0, 0.0>; //headding east

rotation new_rotation(vector pos)
{
vector now_pos = llGetPos();
rotation now_rot = llGetRot();
rotation new_rot = ZERO_ROTATION;
vector now_arrow = STD_ARROW*now_rot;
vector arrow = pos - now_pos;
vector h_arrow = arrow;
h_arrow.z = 0.0;
h_arrow = llVecNorm(h_arrow);
if ( llVecMag(arrow) < TOO_CLOSE ) return ZERO_ROTATION;
if ( llVecMag(h_arrow) < SMALL_TILT ) return ZERO_ROTATION;
new_rot = llRotBetween(STD_ARROW, h_arrow)*llRotBetween(h_arrow, arrow)/now_rot;
return new_rot;
}

基本は上記のようなやり方になります。これに急角度に曲がることに制限を加えたり、気球のようにZ軸の姿勢は動かさない場合とか、曲がるときにバンクを加えたりなどのアレンジはもう少し複雑になります。




Posted on 5 Apr 2018, 1:17 - カテゴリ: 乗物
No comments - Edit - Delete


Pages: ... [4] [5] [6]