ツアーライドを作ろう

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


ヘリの改造(2)スクリ構成

ヘリの改造(1)の続きです。

非物理のヘリコプター各プリムに入っているスクリプトとその働きを列記します。


ルート・プリム(Base)内のスクリプト
NonPhysicsHelicopter - 動きを制御するエンジン部分、メイン・スクリプトです。

sitpose - アバターの座る位置や固定カメラ、アニメーションを司るスクリプトです。座る位置、固定カメラ位置はノートカード SITCONFIG に記述します。スクリプトの変更は必要ありません。アニメはプリム内にあるものを自動的に採用します。プリム内にはアニメを一つだけ入れてください。

FollowCamera - アバターを追いかける Follow Cameraの設定はこちらのスクリプトで指定します。固定カメラの位置指定は SITCONFIG でと、それぞれ別になります。

messenger - パイロットにInstantMessageを送るとメイン・スクリプトが一時停止しますので、それを避けるために、その仕事だけをこのスクリプトが担当します。変更の必要はありません。

WaterSplash - 水中に入ったときに水しぶきを上げるスクリプト。水しぶきのテクスチャは goo です。「バシャーン」という音は、このスクリプト冒頭で指定します。

AutoReturn - 乗物を乗り捨てて一定時間経つと自動的に出発地点に戻ります。この機能が必要なければ取り除いてください。待ち時間はスクリプト冒頭で指定できます。

main propella内のスクリプト
screw texture rotator - プロペラは薄い円盤にプロペラの形をテクスチャで貼ったもの。このスクリプトはこのテクスチャを回転させます。
プロペラが1プリムの場合はテクスチャを回転させるのではなくプリムを回転させることができます。その場合は次のスクリプトに変更してください。
string KEYWORD = "engine";

vector AXIS = <0.0, 0.0, -1.0>;
integer INITIAL_RPS = 0;
float TIME_LAG = 1.0;

float last_omega = 0.0;

run(integer speed)
{
float w = 2.0*PI*(float)speed;
llTargetOmega(AXIS, (0.3*w + 0.7*last_omega), 1.0);
llSleep(TIME_LAG);
if (speed)
{
llTargetOmega(AXIS, w, 1.0);
}
else llTargetOmega(AXIS, 0.0, 0.0);
last_omega = w;
}

default
{
state_entry()
{
run(INITIAL_RPS);
}

link_message(integer sender, integer num, string text, key id)
{
if ( text == KEYWORD ) run(num);
}
}


rear propella
main propella と同じスクリプトが入っています。プリムを回転させる場合は、さきに示したスクリプトのうち冒頭部分にある AXIS を下記のように回転軸をY軸に変更したものを入れてください。
vector AXIS = <0.0, 1.0, 0.0>;


front seat, rear seat right, rear seat left
それぞれに sitposeSITCONFIG がアニメとともに、また FollowCamera が入っています。

light
LightDimmerNoTouch - ライトを点滅します。



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


ヘリの改造(1)部品

Shinobar Annexスクリプトの館などで入手できる非物理のヘリコプターはコピー改変可。機体を入れ替えるなど、この改造法を記します。

すでに他の乗物改造の経験のある方はご承知でしょう。機体の下部に透明なルート・プリムがあり、これがエンジンとなり、主要なスクリプトはここに入っています。上の図は「リンク部分を編集」で、このプリムの透明度を50%に変更して見せています。青色に塗ってあります。

ルート・プリム以外に子プリムにもスクリプトが入っているものがあります。それを示したものが下の図です。このヘリコプターの場合、ライトはルート・プリムである土台に埋まっており、土台部分を移動しけなければ取り出せません。

円盤状のプリムを座席の上に置いてアバターを座らせています。パイロットはロート・プリムである土台に座ることになるので、パイロット用の円盤はありません。

各プリムに組み込まれているスクリプトについては次の記事 ヘリの改造(2) をお読みください。


Posted on 3 Apr 2018, 0:01 - カテゴリ: 乗物
No comments - Edit - Delete


非物理のヘリコプター

物理を使わない乗物の第一弾として、非物理のヘリコプターをリリースしました。Japan Open Grid(JOG)内Canyonの Boat Terminalで試乗ができます。これをコピーしてもらっていいですが、併せて Shinobar Annex スクリプトの館でも無料配布しています。

操作法
[Page Up]/[Page down]が上昇/下降、矢印キーで前後移動と左右回転、[Shift]+左右キーでは姿勢を変えることなく左右にスライドします。ギアというかスロットル操作はありません。飛行中に機体をクリックするとカメラ位置が切り替わり、コックピット内の視点が楽しめます。

物理と非物理
Secondlife でも Opensim でも出回っているヘリコプターのスクリプトは iTec のものがメジャーです。それらは物理を使っています。しかし非物理でも llSetKeyfaramedMotion を用いることで、スムースな動きを得ることは可能です。そこで作ったものが非物理のヘリコプターです。加速・減速などもそれらしく再現しています。

非物理の利点は、サーバーへの負荷が軽く、リージョン境界でもデッドロックがないことです。また比較的楽にリージョンを越えることができます。いっぽうの難点は、衝突判定がなくファントムのような振る舞いをするので、建物などをすり抜けてしまうことです。

建物などをすり抜けてしまうことの対処のため、屋上にヘリパッドを置き、これを検知してその上に着陸させるようにしました。それでも建物の横からだと普通にすり抜けてしまいます。

改造
このヘリはフルパー、コピー改変可です。機体の入れ替えなど改造法の詳細は述べませんが、次の記事を参考にしてください。
ヘリの改造(1)部品
ヘリの改造(2)スクリ構成

(初稿:4 Apr 2018, 0:25)

Posted on 8 May 2018, 0:42 - カテゴリ: 乗物
No comments - Edit - Delete


Pages: ... [7] [8] [9]