› しのバー › 乗り物
2018年03月13日
スノボができる雪山
期間限定で、スノボやスキー、スケートのできる雪山を設置しました。JOG(Japan OpenGrid)内の Shinobar Sea 03 です。
JOG Center Sim あるいは Shinobar Annexでこの看板を見つけたら、クリックした山頂にTPできます。あるいは世界地図で Shinobar Sea 03 を検索ください。
JOG Center Sim あるいは Shinobar Annexでこの看板を見つけたら、クリックした山頂にTPできます。あるいは世界地図で Shinobar Sea 03 を検索ください。
2016年04月07日
リージョンを跨がるライドツアー
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 に置いています。いずれも自由にコピー、改変、再利用できます。改変の方法は、この記事の続きをお読みください。
続きを読む
写真は、しのぐりで走る路面電車。Welcome Area から、隣のリージョン Shopping Town との間を往復します。(しのぐりは現在閉じています。リージョン越えするライドツアーは JOG内 Shinobar Annexなどにあります。)
このライドツアースクリプトは Shinobar が自作したものです。自由にコピー、改変して使えます。
この路面電車は2つの駅の間を往復運動するものですが、設定により、途中駅の設置やさまざまな動きができます。しのぐり Welcome Area から南の島へは、亀が連れて行ってくれます。
JOG(Japan Open Grid)内の Canyon には、気球、ボート、タクシーの3種のライドツアーがあります。Canyonのものはリージョン越えしませんが、動きの参考にしてください。
リージョン越えする気球やボートの最新版は JOG内 Shinobar Annex に置いています。いずれも自由にコピー、改変、再利用できます。改変の方法は、この記事の続きをお読みください。
続きを読む
2015年10月26日
Speed Boat
水上飛行機や複葉機で使われたスクリプトは、設定を変更することで、他の乗り物にも使えます。
今回は Speed Boat にスクリプトを組み込んで走らせます。走る Speed Boat は JOG内の Shinobar Gate 海のあるサンドボックスに置いています。
水上飛行機の台座を取り出し、Speed Boat の船体と、台座がルートプリムにしてリンクします。複葉機(1)機体の入れ替えを参考にしてください。
メインスクリプト Aircraft の設定を次のように変更します。
integer WHEEL = FALSE; //runs with wheel on the ground
integer HIDE_WHEEL = 0; //meter altitude wheels to be hidden
integer BOAT = TRUE; // runs only on the sea
integer SUBMARINE = FALSE; //goes under the sea
integer AIRCRAFT = FALSE; // flies in the air
integer HOVERING = TRUE; //can stop in the air like helicopters
設定項目の説明は「複葉機(3)スクリプトのオプション」を参照ください。
動きの設定。2015-10-26 のもの。
「複葉機(4)動きの調整」も参照ください。
vector BASE_SPEED = <2.0, 0.3, 0.5>; // forwad, turn, up/down
float BANK_RATIO = 0.5;
float HOP_SPEED = 0.0; //x BASE_SPEED.z
integer HOP_TIME = 0; //xINTERVAL, 0:no hopping
integer MAX_FORWARD = 6; // limit of forward speed
integer MAX_SWIM = 6; // limit of forward in the sea
integer NORMAL_FORWARD = 2; // initial gear, flight mode above this
integer MAX_BACKWARD = 2; // limit of backward speed
integer MAX_YAW = 4;
integer MAX_UPWARD = 1;
integer MAX_DOWNWARD = 1;
関数 engine(integer onoff) 内の設定。2015-10-26 のもの。
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1.0);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 2.0);
llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <8.0, 0.5, 2.0>);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 2.0);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1.0);
小回りのある複葉機に比べ、左右の旋回をゆっくりとしています(..._ANGULAR_...)。VEHICLE_ANGULAR_FRICTION_TIMESCALE の値は <X軸, Y軸, Z軸> です。 別の言い方でRoll-Pitch-Yaw(wikipedia ローリング)。
Roll は船体の左右への傾きで、この抵抗は小さく(時定数を大きく)、上下の揺れである Pitchへの抵抗は大きく(時定数を小さく)しました。
全体としての姿勢安定のため _VEHICLE_VERTICAL_ATTRACTION_TIMESCALE は小さめ、VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY は最大にしています。
今回は Speed Boat にスクリプトを組み込んで走らせます。走る Speed Boat は JOG内の Shinobar Gate 海のあるサンドボックスに置いています。
水上飛行機の台座を取り出し、Speed Boat の船体と、台座がルートプリムにしてリンクします。複葉機(1)機体の入れ替えを参考にしてください。
メインスクリプト Aircraft の設定を次のように変更します。
integer WHEEL = FALSE; //runs with wheel on the ground
integer HIDE_WHEEL = 0; //meter altitude wheels to be hidden
integer BOAT = TRUE; // runs only on the sea
integer SUBMARINE = FALSE; //goes under the sea
integer AIRCRAFT = FALSE; // flies in the air
integer HOVERING = TRUE; //can stop in the air like helicopters
設定項目の説明は「複葉機(3)スクリプトのオプション」を参照ください。
動きの設定。2015-10-26 のもの。
「複葉機(4)動きの調整」も参照ください。
vector BASE_SPEED = <2.0, 0.3, 0.5>; // forwad, turn, up/down
float BANK_RATIO = 0.5;
float HOP_SPEED = 0.0; //x BASE_SPEED.z
integer HOP_TIME = 0; //xINTERVAL, 0:no hopping
integer MAX_FORWARD = 6; // limit of forward speed
integer MAX_SWIM = 6; // limit of forward in the sea
integer NORMAL_FORWARD = 2; // initial gear, flight mode above this
integer MAX_BACKWARD = 2; // limit of backward speed
integer MAX_YAW = 4;
integer MAX_UPWARD = 1;
integer MAX_DOWNWARD = 1;
関数 engine(integer onoff) 内の設定。2015-10-26 のもの。
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 1.0);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 2.0);
llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <8.0, 0.5, 2.0>);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 2.0);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1.0);
小回りのある複葉機に比べ、左右の旋回をゆっくりとしています(..._ANGULAR_...)。VEHICLE_ANGULAR_FRICTION_TIMESCALE の値は <X軸, Y軸, Z軸> です。 別の言い方でRoll-Pitch-Yaw(wikipedia ローリング)。
Roll は船体の左右への傾きで、この抵抗は小さく(時定数を大きく)、上下の揺れである Pitchへの抵抗は大きく(時定数を小さく)しました。
全体としての姿勢安定のため _VEHICLE_VERTICAL_ATTRACTION_TIMESCALE は小さめ、VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY は最大にしています。
2015年10月25日
複葉機を飛ばす(4)動きを調整する
水上飛行機をベースに、機体を複葉機に入れ替えました。これをさらに改造、調整してゆきます。改造された複葉機は、JOG内の Shinobar Gate 海のあるサンドボックスに置いています。
水上飛行機
複葉機を飛ばす(1)機体の入れ替え
複葉機を飛ばす(2)カメラ位置の調整
複葉機を飛ばす(3)スクリプトのオプション
複葉機を飛ばす(4)動きの調整 ←この記事です。
今回の複葉機では小回りの効いた動きに調整します。スクリプトのオプションのうち、前回に解説しなかった動きに関するものを取り上げます。
メインスクリプトの53-63行目あたりが速度を調節するキー操作に関するものです。参考数字は 2015-10-25 付けバージョンのもの。
vector BASE_SPEED = <2.0, 0.2, 0.2>; // forwad, turn, up/down
ギア切り替えで速度は切り替えられますが、ギア1のときの速度です。最高速度はギア段数 MAX_FORWARDとの掛け算で来ますので、この例では 2.0x8 = 16m/sec が最高速度となります。のうち xが進行速度、yは左右の旋回の最小単位、zは上下です。
float BANK_RATIO = 0.5;
左右旋回のときの機体のひねり、 ロールの程度。
float HOP_SPEED = 0.0; //x BASE_SPEED.z
integer HOP_TIME = 0; //xINTERVAL, 0:no hopping
ジェットスキーなどで、浮き上がったときにさらに飛び上がる設定です。
integer MAX_FORWARD = 8; // limit of forward speed
ギアの段数。最高速度は MAX_FORWARD x BASE_SPEED.x となります。
integer MAX_SWIM = 4; // limit of forward in the sea
主に陸上や空中を飛ぶ乗り物が水中に入ったとき、 MAX_SWIM/MAX/MAX_FORWARDの比率で減速します。
integer NORMAL_FORWARD = 3; // initial gear, flight mode above this
初期のギア段。飛行機などでは、この段数を超えないと離陸できません。離陸後の空中でギアを落とすことはできます。
integer MAX_BACKWARD = 2; // limit of backward speed
バックする場合、MAX_BACKWARD/MAX_FORWARD の比率で減速します。
integer MAX_YAW = 6;
左右キーを押しつづけた場合、この倍数まで回転角速度が増大します。
integer MAX_UPWARD = 8;
上方向キー(↑)を押しつづけた場合、上向きの角速度が増大します。
integer MAX_DOWNWARD = 3;
下方向キー(↓)を押しつづけた場合の下向き角速度の最大倍数。
BASE_SPEED や MAX_xxx の数字で動きが変わりますが、もう一つ大事なものは、乗り物パラメータ群の調整です。179行目あたりから engin(onoff) という関数の中で、それらは設定されます。
直線運動と回転運動のそれぞれについて、TIMESCALE と DECAY 、それに FRICTION があります。推進力は瞬時に発生するのではなく、TIMESCALEにより、0から時間を掛けて所定の速度に達します。また、DECAY(減衰)によって時間とともに推進力は低下します。また FRICTION (抵抗)により時間とともに速度を減少させます。いずれも単位は秒です。TIMESCALEにしたがって速度が増しているところで減衰や抵抗が起き、所定の速度に達しない場合があります。
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 1.0*INTERVAL);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 2.0*INTERVAL);
llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <4.0*INTERVAL, 2.0, 2.0>);
直線速度に関して、飛行機などの場合はINTERVALの間隔で推進力が自動的に与えられるので、諸数値もこれに併せておきます。X方向にしか動かないので抵抗の Y、Zは関係しません。
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.3);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.5);
llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <1.0, 1.0, 1.0>);
上下左右の回転に属するもの。今回の複葉機では小回りを効かせるために、時間を短めに取っています。
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 4.0);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5);
上下左右に旋回などをすることによって、機体の姿勢は傾きます。機体を水平姿勢に戻すものが VERTICAL_ATTRACTION です。TIMESCALEを 2秒くらい、EFFICIENCY を 1とすると姿勢が安定します。今回は宙返りなどのアクロバティックな動きをするために、 TIMESCALE は長く取り、EFFICIENCY も小さくしてみました。
今回で「複葉機を飛ばす」シリーズは完結です。
水上飛行機
複葉機を飛ばす(1)機体の入れ替え
複葉機を飛ばす(2)カメラ位置の調整
複葉機を飛ばす(3)スクリプトのオプション
複葉機を飛ばす(4)動きの調整 ←この記事です。
今回の複葉機では小回りの効いた動きに調整します。スクリプトのオプションのうち、前回に解説しなかった動きに関するものを取り上げます。
メインスクリプトの53-63行目あたりが速度を調節するキー操作に関するものです。参考数字は 2015-10-25 付けバージョンのもの。
vector BASE_SPEED = <2.0, 0.2, 0.2>; // forwad, turn, up/down
ギア切り替えで速度は切り替えられますが、ギア1のときの速度です。最高速度はギア段数 MAX_FORWARDとの掛け算で来ますので、この例では 2.0x8 = 16m/sec が最高速度となります。
float BANK_RATIO = 0.5;
左右旋回のときの機体のひねり、 ロールの程度。
float HOP_SPEED = 0.0; //x BASE_SPEED.z
integer HOP_TIME = 0; //xINTERVAL, 0:no hopping
ジェットスキーなどで、浮き上がったときにさらに飛び上がる設定です。
integer MAX_FORWARD = 8; // limit of forward speed
ギアの段数。最高速度は MAX_FORWARD x BASE_SPEED.x となります。
integer MAX_SWIM = 4; // limit of forward in the sea
主に陸上や空中を飛ぶ乗り物が水中に入ったとき、 MAX_SWIM/MAX/MAX_FORWARDの比率で減速します。
integer NORMAL_FORWARD = 3; // initial gear, flight mode above this
初期のギア段。飛行機などでは、この段数を超えないと離陸できません。離陸後の空中でギアを落とすことはできます。
integer MAX_BACKWARD = 2; // limit of backward speed
バックする場合、MAX_BACKWARD/MAX_FORWARD の比率で減速します。
integer MAX_YAW = 6;
左右キーを押しつづけた場合、この倍数まで回転角速度が増大します。
integer MAX_UPWARD = 8;
上方向キー(↑)を押しつづけた場合、上向きの角速度が増大します。
integer MAX_DOWNWARD = 3;
下方向キー(↓)を押しつづけた場合の下向き角速度の最大倍数。
BASE_SPEED や MAX_xxx の数字で動きが変わりますが、もう一つ大事なものは、乗り物パラメータ群の調整です。179行目あたりから engin(onoff) という関数の中で、それらは設定されます。
直線運動と回転運動のそれぞれについて、TIMESCALE と DECAY 、それに FRICTION があります。推進力は瞬時に発生するのではなく、TIMESCALEにより、0から時間を掛けて所定の速度に達します。また、DECAY(減衰)によって時間とともに推進力は低下します。また FRICTION (抵抗)により時間とともに速度を減少させます。いずれも単位は秒です。TIMESCALEにしたがって速度が増しているところで減衰や抵抗が起き、所定の速度に達しない場合があります。
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 1.0*INTERVAL);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 2.0*INTERVAL);
llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <4.0*INTERVAL, 2.0, 2.0>);
直線速度に関して、飛行機などの場合はINTERVALの間隔で推進力が自動的に与えられるので、諸数値もこれに併せておきます。X方向にしか動かないので抵抗の Y、Zは関係しません。
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.3);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.5);
llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <1.0, 1.0, 1.0>);
上下左右の回転に属するもの。今回の複葉機では小回りを効かせるために、時間を短めに取っています。
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 4.0);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5);
上下左右に旋回などをすることによって、機体の姿勢は傾きます。機体を水平姿勢に戻すものが VERTICAL_ATTRACTION です。TIMESCALEを 2秒くらい、EFFICIENCY を 1とすると姿勢が安定します。今回は宙返りなどのアクロバティックな動きをするために、 TIMESCALE は長く取り、EFFICIENCY も小さくしてみました。
今回で「複葉機を飛ばす」シリーズは完結です。
2015年10月24日
複葉機を飛ばす(3)スクリプトのオプション
水上飛行機をベースに、機体を複葉機に入れ替えました。これをさらに改造、調整してゆきます。改造された複葉機は、JOG内の Shinobar Gate 海のあるサンドボックスに置いています。
水上飛行機
複葉機を飛ばす(1)機体の入れ替え
複葉機を飛ばす(2)カメラ位置の調整
複葉機を飛ばす(3)スクリプトのオプション ←この記事です。
複葉機を飛ばす(4)動きの調整
メインスクリプトは水上飛行機のものから改変し、名称を Aircraft としています。2015-10-24 の日付のあるバージョンで以下説明します。
スクリプトの冒頭71行くらいにさまざまな設定項目があります。主なものを説明していいきます。最初のほうはメッセージの文章で、説明がなくても分かるでしょう。
27行-39行目あたりに基本機能の設定があります。カメラについては前回説明しました。今回関係するのは、車輪まわり。
基本機能設定
integer SHOW_STATUS = TRUE; // status on floating text
ギアの位置など、さまざまな状態をフローティングテキストで表示するかどうかです。フローティングテキストの表示があってもなくても、メッセージはチャットに流れます。
integer SHOW_ALTITUDE = 2; //meters step to show altitude, 0:no display
飛行高度を表示するのに、何メートル刻みで表示するか。0だと高度を表示しません。高度は地上高あるいは海抜です。したがって水平飛行していても地形の起伏で変動します。
integer WHEEL = TRUE; //runs with wheel on the ground
地上で滑走する場合に車輪を使うかどうか。水上飛行機には車輪が付いていなかったので、FALSEでしたが、この複葉機には車輪があるので TRUEとします。地上で左右に曲がるとき、車輪のありなしで動きが変わります。車輪がないときは静止したままその場で向きを変えることができますが、車輪がある場合は前後に動きながらでないと曲がれません。
integer HIDE_WHEEL = 10; //meter altitude wheels to be hidden
車輪を格納する機能がある場合(後述)高度何メートルで格納するか。
integer BOAT = FALSE; // runs only on the sea
ボートなど水上の乗り物で陸に登れない場合に TRUEとし、それ以外はFALSEとしてください。
integer SUBMARINE = FALSE; //goes under the sea
潜水艦など水中に潜れる乗り物は TRUE。FALSEであれば、水面に浮きます。
integer AIRCRAFT = TRUE; // flies in the air
空を飛べるかどうかです。
integer HOVERING = FALSE; //can stop in the air like helicopters
ヘリコプターのように空中で静止できるかどうかかです。
integer SCREW = 6; //screw speed
スクリューあるいはプロペラがある場合、数値を設定します。あまりいじってもビューアーの問題で、そのとおりには見えませんので、このままでよいでしょう。ジェット機などでは 0にするか、そのままでもどうせプロペラはないので問題はありません。
integer CAMERA_FIX = FALSE; // TRUE: fixed camera angle / FALSE: follow
さきの記事で説明しました。TRUEだと SITCONFIG で、FALSEだと、このスクリプト中のinit_followCam() で設定されます。
integer OWNERONLY = FALSE; //only the owner can drive
持ち主だけが使えるのか、誰でも乗れるようにするかです。
integer DISPOSAL = FALSE; // disappears after PARKING_TIME
これを TRUE にすると、乗り捨てた場合に自動的に消えます。これをTRUEに設定するときは、あらかじめコピーをとっておくことを忘れずに。
41-63行目あたりにさまざまな数値の設定があります。FLOATING_LEVEL は前々回に説明しました。一部を説明し、動きに関する多くのものは次回に譲ります。
諸数値(前半)
float NEAR = 20.0; //meters from the original position
float DOCK = 10.0; //meters from the original position, auto docked
出発点から NEARの範囲を出て、DOCKの範囲に戻ってきたときをツアーの終了とみなし、パイロットや乗客を強制的に降ろします。この機能を無効にするには DOCKを 0.0にしてください。
float TOOHIGH = 500.0; //meters max z, maybe less than 1500
上昇できる最高高度。試してみたけど、1500m以上にはどうしても行けなかった。
float GROUND_LEVEL = 0.0; //meters above ground from the lower edge of the prim
float FLOAT_LEVEL = -0.8; //meters above water, minus means sink
float ALLOWANCE = 0.4; //meters
複葉機を飛ばす(1)機体の入れ替えで説明しました。FLOAT_LEVELが水上に不時着したときに沈む深さ(マイナス値)です。
float BOUNDARY_MARGIN = 8.0; //meters apart from the boundary
float AHEAD_MARGIN = 1.0; // x INTERVAL
リージョン境界に近づかないようにする設定です。 ノートカード Regions xxx で複数リージョンをゾーンにしている場合は、その間をまたぐことはできます。(危険ですが。)
float INTERVAL = 1.0; //seconds
着陸判定などを行う頻度。あまり小さくすると操作性に支障をきたします。
integer LAND_TIME = 2; //xINTERVAL to see landing or sinking
離着陸などを判定する尤度。たとえば地表を離れて LAND_TIMExINTERVAL経過して離陸とみなす。
integer IDLE_TIME = 8; //xINTERVAL to see stopping
自動車などの場合に一定時間キー操作をしないとエンジンを停止し、サーバーの負荷を最小にします。自動車以外では、地上や水上ではギア3速(設定による)以下のときに働きます。空中ではホバリングが有効で、ギアを最小にしたときのみ。
integer PARKING_TIME = 60; //second waiting pilot returns, 0:no return
出発地を離れた場所でパイロットが降りた場合にこの秒数だけ再搭乗を待ちます。0だと、ずっと待ちつづけます。
サウンド
設定の最後 65-71行目あたりはサウンドの設定です。書かれているサウンドはスクリプトと同じルートプリム(台座)の中になければなりません。
string ENGINE_SOUND = "engine2";
ベースとなるエンジン音。 FAST_SOUND や CAR_SOUNDが無いときは、これが使われます。
string FAST_SOUND = "";
ギアが4速(設定による)以上のときのエンジン音。
string CAR_SOUND = "";
水陸両用車などで、水上を地上でエンジンを切り替える場合に、地上を車輪で走るときのエンジン音。
string START_SOUND = "Startup";
エンジンを掛けたときの音。長さは2秒くらい。
string IDLE_SOUND = "s_idle";
アイドル状態のエンジン音。
string ATTENTION_SOUND = "airplane-pa";
メッセージの注意を喚起する「ポ〜ン」という音。
float ENGINE_VOL = 1.0; //loudness of the engine sound
音量。
なお、着水したときに出る「バシャーン」という音 bashaan は、別のスクリプト WaterSplash で設定されています。
車輪の格納
メインスクリプト側は HIDE_WHEEL で指定した高度を境に車輪の格納指示を出します。これを受けて車輪を出し入れする機構が必要です。この複葉機では車輪まわりのプリムにスクリプト HideWheel を仕込んでおり、"wheel" というキーワードでリンクメッセージを受け、併せておくられる整数値が0の場合、プリムを透明にするということで実装しています。
この複葉機の足まわりは合計7プリムでできていて、そのすべてに同じスクリプト HideWheelを入れています。
次回は動きを調整してみます。
水上飛行機
複葉機を飛ばす(1)機体の入れ替え
複葉機を飛ばす(2)カメラ位置の調整
複葉機を飛ばす(3)スクリプトのオプション ←この記事です。
複葉機を飛ばす(4)動きの調整
メインスクリプトは水上飛行機のものから改変し、名称を Aircraft としています。2015-10-24 の日付のあるバージョンで以下説明します。
スクリプトの冒頭71行くらいにさまざまな設定項目があります。主なものを説明していいきます。最初のほうはメッセージの文章で、説明がなくても分かるでしょう。
27行-39行目あたりに基本機能の設定があります。カメラについては前回説明しました。今回関係するのは、車輪まわり。
基本機能設定
integer SHOW_STATUS = TRUE; // status on floating text
ギアの位置など、さまざまな状態をフローティングテキストで表示するかどうかです。フローティングテキストの表示があってもなくても、メッセージはチャットに流れます。
integer SHOW_ALTITUDE = 2; //meters step to show altitude, 0:no display
飛行高度を表示するのに、何メートル刻みで表示するか。0だと高度を表示しません。高度は地上高あるいは海抜です。したがって水平飛行していても地形の起伏で変動します。
integer WHEEL = TRUE; //runs with wheel on the ground
地上で滑走する場合に車輪を使うかどうか。水上飛行機には車輪が付いていなかったので、FALSEでしたが、この複葉機には車輪があるので TRUEとします。地上で左右に曲がるとき、車輪のありなしで動きが変わります。車輪がないときは静止したままその場で向きを変えることができますが、車輪がある場合は前後に動きながらでないと曲がれません。
integer HIDE_WHEEL = 10; //meter altitude wheels to be hidden
車輪を格納する機能がある場合(後述)高度何メートルで格納するか。
integer BOAT = FALSE; // runs only on the sea
ボートなど水上の乗り物で陸に登れない場合に TRUEとし、それ以外はFALSEとしてください。
integer SUBMARINE = FALSE; //goes under the sea
潜水艦など水中に潜れる乗り物は TRUE。FALSEであれば、水面に浮きます。
integer AIRCRAFT = TRUE; // flies in the air
空を飛べるかどうかです。
integer HOVERING = FALSE; //can stop in the air like helicopters
ヘリコプターのように空中で静止できるかどうかかです。
integer SCREW = 6; //screw speed
スクリューあるいはプロペラがある場合、数値を設定します。あまりいじってもビューアーの問題で、そのとおりには見えませんので、このままでよいでしょう。ジェット機などでは 0にするか、そのままでもどうせプロペラはないので問題はありません。
integer CAMERA_FIX = FALSE; // TRUE: fixed camera angle / FALSE: follow
さきの記事で説明しました。TRUEだと SITCONFIG で、FALSEだと、このスクリプト中のinit_followCam() で設定されます。
integer OWNERONLY = FALSE; //only the owner can drive
持ち主だけが使えるのか、誰でも乗れるようにするかです。
integer DISPOSAL = FALSE; // disappears after PARKING_TIME
これを TRUE にすると、乗り捨てた場合に自動的に消えます。これをTRUEに設定するときは、あらかじめコピーをとっておくことを忘れずに。
41-63行目あたりにさまざまな数値の設定があります。FLOATING_LEVEL は前々回に説明しました。一部を説明し、動きに関する多くのものは次回に譲ります。
諸数値(前半)
float NEAR = 20.0; //meters from the original position
float DOCK = 10.0; //meters from the original position, auto docked
出発点から NEARの範囲を出て、DOCKの範囲に戻ってきたときをツアーの終了とみなし、パイロットや乗客を強制的に降ろします。この機能を無効にするには DOCKを 0.0にしてください。
float TOOHIGH = 500.0; //meters max z, maybe less than 1500
上昇できる最高高度。試してみたけど、1500m以上にはどうしても行けなかった。
float GROUND_LEVEL = 0.0; //meters above ground from the lower edge of the prim
float FLOAT_LEVEL = -0.8; //meters above water, minus means sink
float ALLOWANCE = 0.4; //meters
複葉機を飛ばす(1)機体の入れ替えで説明しました。FLOAT_LEVELが水上に不時着したときに沈む深さ(マイナス値)です。
float BOUNDARY_MARGIN = 8.0; //meters apart from the boundary
float AHEAD_MARGIN = 1.0; // x INTERVAL
リージョン境界に近づかないようにする設定です。 ノートカード Regions xxx で複数リージョンをゾーンにしている場合は、その間をまたぐことはできます。(危険ですが。)
float INTERVAL = 1.0; //seconds
着陸判定などを行う頻度。あまり小さくすると操作性に支障をきたします。
integer LAND_TIME = 2; //xINTERVAL to see landing or sinking
離着陸などを判定する尤度。たとえば地表を離れて LAND_TIMExINTERVAL経過して離陸とみなす。
integer IDLE_TIME = 8; //xINTERVAL to see stopping
自動車などの場合に一定時間キー操作をしないとエンジンを停止し、サーバーの負荷を最小にします。自動車以外では、地上や水上ではギア3速(設定による)以下のときに働きます。空中ではホバリングが有効で、ギアを最小にしたときのみ。
integer PARKING_TIME = 60; //second waiting pilot returns, 0:no return
出発地を離れた場所でパイロットが降りた場合にこの秒数だけ再搭乗を待ちます。0だと、ずっと待ちつづけます。
サウンド
設定の最後 65-71行目あたりはサウンドの設定です。書かれているサウンドはスクリプトと同じルートプリム(台座)の中になければなりません。
string ENGINE_SOUND = "engine2";
ベースとなるエンジン音。 FAST_SOUND や CAR_SOUNDが無いときは、これが使われます。
string FAST_SOUND = "";
ギアが4速(設定による)以上のときのエンジン音。
string CAR_SOUND = "";
水陸両用車などで、水上を地上でエンジンを切り替える場合に、地上を車輪で走るときのエンジン音。
string START_SOUND = "Startup";
エンジンを掛けたときの音。長さは2秒くらい。
string IDLE_SOUND = "s_idle";
アイドル状態のエンジン音。
string ATTENTION_SOUND = "airplane-pa";
メッセージの注意を喚起する「ポ〜ン」という音。
float ENGINE_VOL = 1.0; //loudness of the engine sound
音量。
なお、着水したときに出る「バシャーン」という音 bashaan は、別のスクリプト WaterSplash で設定されています。
車輪の格納
メインスクリプト側は HIDE_WHEEL で指定した高度を境に車輪の格納指示を出します。これを受けて車輪を出し入れする機構が必要です。この複葉機では車輪まわりのプリムにスクリプト HideWheel を仕込んでおり、"wheel" というキーワードでリンクメッセージを受け、併せておくられる整数値が0の場合、プリムを透明にするということで実装しています。
この複葉機の足まわりは合計7プリムでできていて、そのすべてに同じスクリプト HideWheelを入れています。
次回は動きを調整してみます。
2015年10月23日
複葉機を飛ばす(2)カメラの調整と助手席
「飛行機を改造」の続きです。
水上飛行機をベースに、機体を複葉機に入れ替えました。これをさらに改造、調整してゆきます。改造された複葉機は、JOG内の Shinobar Gate 海のあるサンドボックスに置いています。
水上飛行機
複葉機を飛ばす(1)機体の入れ替え
複葉機を飛ばす(2)カメラ位置の調整 ←この記事です。
複葉機を飛ばす(3)スクリプトのオプション
複葉機を飛ばす(4)動きの調整
(パイロットの)カメラ位置の調整
メインスクリプトの最初のほう 37行目あたりに
integer CAMERA_FIX = TRUE; // TRUE: fixed camera angle / FALSE: follow
があります。これがTRUEだと、カメラは機体に固定され、パイロットのカメラは SITCONFIG のほうで決まります。
vector CAMERA_POS = <-8.0, 0, 3.0>;
vector CAMERA_DIR = <0, 0, 1.0>;
CAMERA_POS がカメラ位置、CAMERA_DIRは視野中心点です。例によって台座プリム中心から x は東方向、yは北方向、 zは上方向です。カメラの仰角はこの例で tan-1 (-2m/8m)ということになります。およそ -15度。このくらいが自然です。
CAMERA_FIX = FALSE の場合は、カメラは機体後方からついてゆく感じになります。メインスクリプト側の162行目あたりの関数 init_followCam() で設定されます。llSetCameraParams 関数でいくつかを設定していますが、そのうち CAMERA_DISTANCE の値だけを機体の大きさに合わせて調整し、他はそのままにしておくことをおすすめします。
座席を増やす
パイロットは台座に座り、位置だけを操縦席の位置に合わせてそれらしく見せます。台座の中にあるノートカード SITCONFIG で位置を調整しました。
他の乗客は別のプリムに座らせます。ボックスで作った座布団が簡単です。機体と座布団の向きを揃えます、座布団の回転角をxyzともに0としておきます。機体というか台座の回転角もxyzとも0とします。機首は東に向くはずです。そうでなければ、先の記事の要領で機体と台座の角度を合わせておいてください。
台座の中からノートカード SITCONFIGと、スクリプト sitpose2をコピーして、座布団の中に入れます。乗客用の座りポーズのアニメがあるなら、それも座布団の中に入れます。アニメが無ければ標準の座りポーズとなります。
ノートカード SITCONFIGを修正します。座り位置は POSITION です。<0, 0, 0.7> あたりで調整してください。パイロットはカメラ位置も設定していますが、乗客はカメラ位置を決めないほうが良いでしょう。
vector POSITION = <0.0 ,0, 0.7>; // meters offset when the agent face to the east
//vector ANGLE = <0, 0, 0>; // degrees
vector CAMERA_POS = <0, 0, 0>;
vector CAMERA_DIR = <0, 0, 0>;
追加した座席の位置を調整し、飛行機とリンクさせます。編集モードでShiftキーを押しながら、追加座席を、複数あるときは順次選択に加え、最後に飛行機をクリックして、全体をリンクします。飛行機の台座がルートプリム(輪郭が黄色で表示される)となっていることを確認してください。
全体のリンクができたら、メインスクリプト (Seaplane あるいは Aircraft) をリセットしてください。
次回はスクリプトのオプションについて解説します。
水上飛行機をベースに、機体を複葉機に入れ替えました。これをさらに改造、調整してゆきます。改造された複葉機は、JOG内の Shinobar Gate 海のあるサンドボックスに置いています。
水上飛行機
複葉機を飛ばす(1)機体の入れ替え
複葉機を飛ばす(2)カメラ位置の調整 ←この記事です。
複葉機を飛ばす(3)スクリプトのオプション
複葉機を飛ばす(4)動きの調整
(パイロットの)カメラ位置の調整
メインスクリプトの最初のほう 37行目あたりに
integer CAMERA_FIX = TRUE; // TRUE: fixed camera angle / FALSE: follow
があります。これがTRUEだと、カメラは機体に固定され、パイロットのカメラは SITCONFIG のほうで決まります。
vector CAMERA_POS = <-8.0, 0, 3.0>;
vector CAMERA_DIR = <0, 0, 1.0>;
CAMERA_POS がカメラ位置、CAMERA_DIRは視野中心点です。例によって台座プリム中心から x は東方向、yは北方向、 zは上方向です。カメラの仰角はこの例で tan-1 (-2m/8m)ということになります。およそ -15度。このくらいが自然です。
CAMERA_FIX = FALSE の場合は、カメラは機体後方からついてゆく感じになります。メインスクリプト側の162行目あたりの関数 init_followCam() で設定されます。llSetCameraParams 関数でいくつかを設定していますが、そのうち CAMERA_DISTANCE の値だけを機体の大きさに合わせて調整し、他はそのままにしておくことをおすすめします。
座席を増やす
パイロットは台座に座り、位置だけを操縦席の位置に合わせてそれらしく見せます。台座の中にあるノートカード SITCONFIG で位置を調整しました。
他の乗客は別のプリムに座らせます。ボックスで作った座布団が簡単です。機体と座布団の向きを揃えます、座布団の回転角をxyzともに0としておきます。機体というか台座の回転角もxyzとも0とします。機首は東に向くはずです。そうでなければ、先の記事の要領で機体と台座の角度を合わせておいてください。
台座の中からノートカード SITCONFIGと、スクリプト sitpose2をコピーして、座布団の中に入れます。乗客用の座りポーズのアニメがあるなら、それも座布団の中に入れます。アニメが無ければ標準の座りポーズとなります。
ノートカード SITCONFIGを修正します。座り位置は POSITION です。<0, 0, 0.7> あたりで調整してください。パイロットはカメラ位置も設定していますが、乗客はカメラ位置を決めないほうが良いでしょう。
vector POSITION = <0.0 ,0, 0.7>; //
//vector ANGLE = <0, 0, 0>; //
vector CAMERA_POS = <0, 0, 0>;
vector CAMERA_DIR = <0, 0, 0>;
追加した座席の位置を調整し、飛行機とリンクさせます。編集モードでShiftキーを押しながら、追加座席を、複数あるときは順次選択に加え、最後に飛行機をクリックして、全体をリンクします。飛行機の台座がルートプリム(輪郭が黄色で表示される)となっていることを確認してください。
全体のリンクができたら、メインスクリプト (Seaplane あるいは Aircraft) をリセットしてください。
次回はスクリプトのオプションについて解説します。
2015年10月17日
複葉機を飛ばす(1)機体の入れ替え
水上飛行機の続きです。
今回以降、この飛行機スクリプトを利用して、他の飛行機や乗り物が飛べるよう改造する方法を解説します。もとになる水上飛行機は Shinobar Gate サンドボックスにあり、コピーで入手できます。
水上飛行機
複葉機を飛ばす(1)機体の入れ替え ←この記事です。
複葉機を飛ばす(2)カメラ位置の調整
複葉機を飛ばす(3)スクリプトのオプション
複葉機を飛ばす(4)動きの調整
サンドボックスなどで、水上飛行機を Rezします。右クリックで「編集」を選びます。機体の下に小判状の透明な台座があることが分かります。
機体はじつはこの透明な台座に乗っているというか、めり込んでいます。主要なスクリプトは台座部分に含まれています。この台座部分を流用し、機体部分を他のものと取り替えることで、任意の機体を飛ばせることができるというわけです。以下、ビューアーはFirestormで説明します。
必要な部品を手に入れます。
・「リンク部分を編集」にチェックを入れ、小判形台座を選択し、以降の作業がやりやすいように、「透過度%」を50%程度にしておきます。
・作業中にスクリプトが動くとややこしいので、「中身」からスクリプト Seaplane を抜いておくか、これをクリックして出てくるスクリプト編集画面で「実行中」のチェックを外してスクリプトを停止しておきます。
・「リンク部分を編集」で台座を選択し、「リンクを外す」で、これを単一プリムとして全体から取り外し、いったん横にどけておきます。
・同じ要領で、もとの機体からプロペラの羽根を外し、Takeしておきます。後にこれを流用するためです。
・台座とプロペラを確保すれば、残りの機体部分は必要ないので、削除します。
機体を入れ替えます。
・新たに飛ばせたい機体にはスクリプトは入っていないものとします。この機体を台座の上にRezしたのち、位置合わせします。まず向きは、東が進行方向になりますので、それに合わせます。台座の回転はxyzとも 0 であることを確認します。xyの位置は基本的に台座の中心に合わせ、高さ方向zは、機体の下端を台座の下端に合わせます。機体の大きさと台座の大きさはだいたい合わせておきます。
・機体のプロペラの羽根を、さきほど水上飛行機から取り出したものに置き換えます。羽根が他の部分と合体していて取り外せないときは、水上飛行機からのプロペラを追加で加えることでごまかします。
・「リンク部分を編集」のチェックを外し、Shiftキーを押しながら、プロペラ、機体、台座を、この順番に選択。「リンク」ボタンで全体をリンクします。
・「リンク部分を編集」にチェックを入れ、小判形台座を選択し、「透過度%」を90%程度に戻します。
次に操縦席の位置を調整します。パイロットは機体の操縦席に直接座るのでなく、台座に座り、操縦席に座っているかのように見せるだけです。
・オブジェクトを編集、「中身」にある SITCONFIG という名前のノートカードをクリックして開きます。この中の
vector POSITION = <0.7, 0.0, 1.0>; // meters offset when the agent face to the east
とある行が位置を表します。x,y,z の値は、台座の中心から、パイロットの腰までの距離をメーター単位で表したものです。xのプラスは東、マイナスは西方向です。変更しては立ったり座ったりを繰り返して調整します。
次にメインスクリプト Seaplaneを、必要に応じて変更します。スクリプトの最初のほうに各種の設定がありますが、とりあえずは次の1行の調整だけでよいでしょう。
float FLOAT_LEVEL = -0.7; //meters above water, minus means sink
この値は、水上に着水したときに機体の沈む深さです。普通は沈み込むので、マイナスの値を取ります。ゼロは台座下面が水面すれすれになるという状態です。
ただし次の行に float ALLOWANCE = 0.4; があるので、FLOAT_LEVEL を中心に±0.4m は浮き沈みがあります。気になるようなら ALLOWANCE を 0.2 なり 0.1 に減らしてみてください。
・変更したメインスクリプト Seaplaneを保存し、「実行中」にチェックを入れてください。
これで、入れ替えた機体で飛ぶことができます。
次回はカメラ位置の調整と、座席を追加してみます。
今回以降、この飛行機スクリプトを利用して、他の飛行機や乗り物が飛べるよう改造する方法を解説します。もとになる水上飛行機は Shinobar Gate サンドボックスにあり、コピーで入手できます。
水上飛行機
複葉機を飛ばす(1)機体の入れ替え ←この記事です。
複葉機を飛ばす(2)カメラ位置の調整
複葉機を飛ばす(3)スクリプトのオプション
複葉機を飛ばす(4)動きの調整
サンドボックスなどで、水上飛行機を Rezします。右クリックで「編集」を選びます。機体の下に小判状の透明な台座があることが分かります。
機体はじつはこの透明な台座に乗っているというか、めり込んでいます。主要なスクリプトは台座部分に含まれています。この台座部分を流用し、機体部分を他のものと取り替えることで、任意の機体を飛ばせることができるというわけです。以下、ビューアーはFirestormで説明します。
必要な部品を手に入れます。
・「リンク部分を編集」にチェックを入れ、小判形台座を選択し、以降の作業がやりやすいように、「透過度%」を50%程度にしておきます。
・作業中にスクリプトが動くとややこしいので、「中身」からスクリプト Seaplane を抜いておくか、これをクリックして出てくるスクリプト編集画面で「実行中」のチェックを外してスクリプトを停止しておきます。
・「リンク部分を編集」で台座を選択し、「リンクを外す」で、これを単一プリムとして全体から取り外し、いったん横にどけておきます。
・同じ要領で、もとの機体からプロペラの羽根を外し、Takeしておきます。後にこれを流用するためです。
・台座とプロペラを確保すれば、残りの機体部分は必要ないので、削除します。
機体を入れ替えます。
・新たに飛ばせたい機体にはスクリプトは入っていないものとします。この機体を台座の上にRezしたのち、位置合わせします。まず向きは、東が進行方向になりますので、それに合わせます。台座の回転はxyzとも 0 であることを確認します。xyの位置は基本的に台座の中心に合わせ、高さ方向zは、機体の下端を台座の下端に合わせます。機体の大きさと台座の大きさはだいたい合わせておきます。
・機体のプロペラの羽根を、さきほど水上飛行機から取り出したものに置き換えます。羽根が他の部分と合体していて取り外せないときは、水上飛行機からのプロペラを追加で加えることでごまかします。
・「リンク部分を編集」のチェックを外し、Shiftキーを押しながら、プロペラ、機体、台座を、この順番に選択。「リンク」ボタンで全体をリンクします。
・「リンク部分を編集」にチェックを入れ、小判形台座を選択し、「透過度%」を90%程度に戻します。
次に操縦席の位置を調整します。パイロットは機体の操縦席に直接座るのでなく、台座に座り、操縦席に座っているかのように見せるだけです。
・オブジェクトを編集、「中身」にある SITCONFIG という名前のノートカードをクリックして開きます。この中の
vector POSITION = <0.7, 0.0, 1.0>; //
とある行が位置を表します。x,y,z の値は、台座の中心から、パイロットの腰までの距離をメーター単位で表したものです。xのプラスは東、マイナスは西方向です。変更しては立ったり座ったりを繰り返して調整します。
次にメインスクリプト Seaplaneを、必要に応じて変更します。スクリプトの最初のほうに各種の設定がありますが、とりあえずは次の1行の調整だけでよいでしょう。
float FLOAT_LEVEL = -0.7; //meters above water, minus means sink
この値は、水上に着水したときに機体の沈む深さです。普通は沈み込むので、マイナスの値を取ります。ゼロは台座下面が水面すれすれになるという状態です。
ただし次の行に float ALLOWANCE = 0.4; があるので、FLOAT_LEVEL を中心に±0.4m は浮き沈みがあります。気になるようなら ALLOWANCE を 0.2 なり 0.1 に減らしてみてください。
・変更したメインスクリプト Seaplaneを保存し、「実行中」にチェックを入れてください。
これで、入れ替えた機体で飛ぶことができます。
次回はカメラ位置の調整と、座席を追加してみます。
2015年10月17日
水上飛行機
JOGなどOpenSIM上で動作する乗り物のスクリプトを作っています。その成果として水上飛行機ができました。JOG内 Shinobar Gate 北東部分のサンドボックスに置いています。自由にコピーし、たとえば別の機体に入れ替えるなど改変もできます。
この水上飛行機を例に、開発した乗り物スクリプトをシリーズで解説していきます。初回は、操縦の方法から。
シリーズ(1) 水上飛行機の操縦法
・水上飛行機にタッチすると操縦席に座れます。数秒間、準備が終わるのを待ちます。
・上方向矢印キー(↑)でエンジンが掛かります。
・[Page Up]キーでギアチェンジします。 GEAR=4 になります。
・上方向矢印キー(↑)で離陸します。
・離陸後は左右キー(←→)で左右へ旋回。上(↑)で上昇、下(↓)で下降。[Page Up]/[Page Down]でギアチェンジ。ギアは最大8速。
・海上や陸上でも左右キーやギアチェンジは同じですが、上下キーの動きはギアの段階によって異なる動作をします。ギアが4速以上での上(↑)キーは離陸(空中と同じ動作)。ギアが3速以下では、キーを放していると停止し、上(↑)キーを押している間だけ前進、下(↓)キーでバックします。
・出発位置付近10m以内に戻ると、機体は出発点に戻り、強制的に降ろされます。
Shinobar Gateから隣のBoraboraへのリージョン越えもできますが、遭難も多く、危険ですw。
他のリージョンで飛ばす
コピーしたものを、他のリージョンに持っていき飛ばせることもできます。リージョンのサイズは 256x256を基本とします。256x256を超える Varreginでは、リージョン名を Regions xxx ('xxx'の部分は任意)の名前のノートカードで登録するか、あるいはリージョンの北ないしは東端付近でRezすれば、サイズを自動認識します。
・Regions xxx ('xxx'の部分は任意)の形式は、中身にある他のノートカードを参考にして作ってください。SOL や Game などがすでに登録されています。
・一つのリージョンに対して一つのノートカー,ド、あるいは隣接するリージョン群を一つのノートカードに書いてください。
・複数のリージョンを含む場合、すべてのリージョンは同じサイズであることと、全リージョンの集合体が凸凹なく方形になっていなければなりません。
2014年11月03日
マンタだって飛べる
南の海に棲むマンタは巨大なエイですが、おとなしくて人懐っこく、掴まっていっしょに泳がせてくれるそうです。
普段はゆったりと泳いでいるのですが、聞いた話によれば、なぜか、まれに海面上にジャンプするそうです。
JOG内ボラボラ島のほか、隣のマーレ環礁にも群生してるとか。
SLの話ではありません。OpenSIMによるJOG(Japan Open Grid)内です。 続きを読む
2014年11月01日
リージョン越えするジェットスキー
SLではあたりまえにありますが、OpenSIMにはありません。なので作りました。
JOG(Japan Open Grid)内のボラボラ島に置いてます。JOG内で borabora を検索ください。SLからは行けません。
ジェットスキーを乗り回すには、広い海が必要。SIM越え、正確にはリージョン越えができないと、面白くありません。ちょっとたいへんでした。
ところで物理で乗り物を動かしてみると、動きがぎごちないことがあります。どうもプリム数が関係してるみたいです。プリム数は極力、10プリム程度に収めるのが良いようでした。 続きを読む
JOG(Japan Open Grid)内のボラボラ島に置いてます。JOG内で borabora を検索ください。SLからは行けません。
ジェットスキーを乗り回すには、広い海が必要。SIM越え、正確にはリージョン越えができないと、面白くありません。ちょっとたいへんでした。
ところで物理で乗り物を動かしてみると、動きがぎごちないことがあります。どうもプリム数が関係してるみたいです。プリム数は極力、10プリム程度に収めるのが良いようでした。 続きを読む
2014年10月20日
亀の背に乗って
陸亀は泳げませんでしたが、ウミガメを見つけたので、ボラボラ島への送迎に働いてもらうことにしました。
ボラボラ島へ案内してくれる亀はシノバーJOG支店南側のビーチ Southern Star に居ます。 Southern Star へはJOG支店の着地点 Sunset Beach から cocoタクシーが出ています。
SLからは行けません。JOG(Japan Open Grid) については ブレさんのブログなどを参照ください。
続きを読む
ボラボラ島へ案内してくれる亀はシノバーJOG支店南側のビーチ Southern Star に居ます。 Southern Star へはJOG支店の着地点 Sunset Beach から cocoタクシーが出ています。
SLからは行けません。JOG(Japan Open Grid) については ブレさんのブログなどを参照ください。
続きを読む
2014年10月12日
南国の coco タクシー
シノバーJOOG支店にタクシーを運行させました。
キューバで走っている cocoタクシーがモデルです。
Sunset Beach ←→ 島の東端 Sunrise Hill コンビニLIWSON 相互が開通しました。運賃は無料です。
シノバーJOOG支店へは、JOG内でMAPを開き shinobar を検索してください。Secondlifeからは飛べません。 続きを読む
キューバで走っている cocoタクシーがモデルです。
Sunset Beach ←→ 島の東端 Sunrise Hill コンビニLIWSON 相互が開通しました。運賃は無料です。
シノバーJOOG支店へは、JOG内でMAPを開き shinobar を検索してください。Secondlifeからは飛べません。 続きを読む
2014年10月09日
オカガメは泳げるのか
浜辺に亀がいる。
こういうの見ると、乗りたくなりますよね。乗れるようにしました。
乗ってみると、海へ向かって歩き出す。ああ、オカガメなので、泳がずに歩いていくのね。
乗れるオカガメに会うには、JOG(Japan Open Grid) 内で shinobar を検索してください。オカガメは南のビーチ、Southern Star に居ます。Second Life からは行けません。 続きを読む
こういうの見ると、乗りたくなりますよね。乗れるようにしました。
乗ってみると、海へ向かって歩き出す。ああ、オカガメなので、泳がずに歩いていくのね。
乗れるオカガメに会うには、JOG(Japan Open Grid) 内で shinobar を検索してください。オカガメは南のビーチ、Southern Star に居ます。Second Life からは行けません。 続きを読む
2014年10月04日
遊泳するオルカ
OpenSIMでの乗り物シリーズ。イルカのボート、熱気球に続いて、遊泳するオルカを作りました。
操縦はできません。オルカは気ままに遊泳し、潜ります。泳ぎ疲れたら、もとの場所に戻って休息します。
試乗はシノバーJOG支店。JOG内MAPで shinobar を検索してください。Secondlife からは入れません。 続きを読む
操縦はできません。オルカは気ままに遊泳し、潜ります。泳ぎ疲れたら、もとの場所に戻って休息します。
試乗はシノバーJOG支店。JOG内MAPで shinobar を検索してください。Secondlife からは入れません。 続きを読む
2014年10月01日
熱気球のツアーライド
SLではおなじみのツアーライド。OpenSIMではこの手の乗り物がうまく動かないということで、あまり見掛けません。作ってみました。シノバーJOG支店で試乗できます、着席したら、気球あるいはゴンドラをもういちどタッチしてください。
シノバー JOG支店へは、JOG(Japan Open Grid)からは shinobar を検索してください。Secondlifeからは入れません。
ローカルの Shinobar World でテストしてOK。それをJOGに持ち込むと最初は動きませんでした。調べてみると JOGの物理エンジンは ODE (OpenDynamicsEngine) がデフォルトになっています。これを BulletSim に変更することで動くようになりました。
熱気球はコピーして持って帰っていただけますが、あなたのSIMの物理エンジンの設定が BulletSim でないと動きませんので、あしからず。
続きを読む
シノバー JOG支店へは、JOG(Japan Open Grid)からは shinobar を検索してください。Secondlifeからは入れません。
ローカルの Shinobar World でテストしてOK。それをJOGに持ち込むと最初は動きませんでした。調べてみると JOGの物理エンジンは ODE (OpenDynamicsEngine) がデフォルトになっています。これを BulletSim に変更することで動くようになりました。
熱気球はコピーして持って帰っていただけますが、あなたのSIMの物理エンジンの設定が BulletSim でないと動きませんので、あしからず。
続きを読む
2014年09月20日
イルカのボート
OpenSIMでの乗り物をいじくっています。イルカの背中に乗って泳げるようにしてみました。
公開されている ボート・スクリプトがいちおう動くのですが、いろいろと問題があって、かなりの修正を加えました。これでOpenSIM上では動きますが、なぜかSecondlife上で動きません。
修正スクリプトは汎用になってないので公開は控えますが、試乗はできます。Shinobar in JOG あるいは Shinobar World に置いています。
公開されている ボート・スクリプトがいちおう動くのですが、いろいろと問題があって、かなりの修正を加えました。これでOpenSIM上では動きますが、なぜかSecondlife上で動きません。
修正スクリプトは汎用になってないので公開は控えますが、試乗はできます。Shinobar in JOG あるいは Shinobar World に置いています。
2014年08月22日
Vehicle は動く
OSgird がサーバーのトラブルで、しばらく停止しています。それでローカル(スタンドアロン)でテストを続けています。
さきに OSgridで乗り物が動かないと書きましたが、動きます。物理エンジンで llApplyImpulse 関数などが奇妙な振る舞いをするので、これらを組み合わせて動かすのは難しいということです。
フリーで配布されている ボート・スクリプトがこちらで入手できます。
http://www.free-lsl-scripts.com/cgi/freescripts.plx?ID=1020
これは vehicle 関数群を使っています。試してみると、いくつか問題は残るものの、いちおう動くようです。
さきに OSgridで乗り物が動かないと書きましたが、動きます。物理エンジンで llApplyImpulse 関数などが奇妙な振る舞いをするので、これらを組み合わせて動かすのは難しいということです。
フリーで配布されている ボート・スクリプトがこちらで入手できます。
http://www.free-lsl-scripts.com/cgi/freescripts.plx?ID=1020
これは vehicle 関数群を使っています。試してみると、いくつか問題は残るものの、いちおう動くようです。
2014年08月16日
OSgridでの乗り物
OSgrid中では乗り物が動かないようです。動くとか動いたという情報もありますが、さだかでありません。
Secondlifeでパラグライダーなど数々の乗り物を作ったシノバー。OSgrid中での乗り物に挑戦してみました。やはり難しい。一部は動くが、一部は動きません。
OSgridで浮き輪を作ってみました。辛うじて動く感じです。
OSgridでのシミュレータはOpenSIMです。OpenSIMによる物理のシミュレーションがどうなのか、とにかく情報が無い。しかたないので手探りで、一つひとつを動作確認するしかありません。いまのところの状況をメモしておきます。
1. OpenSIMはバージョン0.8で物理エンジンが変更されている。
バージョン7.x の物理エンジンは OpenDynamicsEngine(ODE) だったが、8.xでは BulletSim が標準となっている。OpenSIM Wikiの情報はほとんどが ODEに関するもので、あてにできない。
2. 装着物に対して物理は効かない。
装着すると浮遊するとか飛び上がるなど、アイテムの装着によってアバターに力を及ぼすことはできないようです。
3. 同じスクリプトが別のオブジェクトでは異なる動作をする。
理由の一つはオブジェクトの質量(Mass)にあるらしい。いっぱんに質量が小さいと、比較的まともに動くが、質量が大きいと奇妙な挙動を示すことがある。
もうひとつはプリムの回転によってX軸の向きが変わることによる相違。たとえば浮遊(Buoyancy) によってプリムのX軸方向に妙な運動が起こる。
4. 動かない関数
物理関連で動かない関数はたくさんあるが、そのうちとくに気付いたもの。
llSetHoverHeight, llSetForce
5. 動作の怪しい関数
llSetBuoyancy
a) 1.0 をセットすると無重力になるはずだが、プリムX軸方向に 5m/s 程度の運動が起こる。 0.5 などの中間的な値を指定しても、この奇妙な運動は変わらない。
b) 0.0 をセットすると普通に重力が掛かるはずだが、オブジェクトの質量が小さいとき、たとえば 質量(Mass)が0.6 あたりで無重力状態が生じる。
追記 (2014-08-16)
この関数だけをテストしてみると、正常そうに見えます。スクリプトの他の部分と複合してるのかもしれません。llApplyImpulse の影響かも。
llApplyImpulse
だいたいは期待される動作だが、質量の大きいオブジェクトに小さな力を与えると反応せず、大き目の力を与えると、とんでもなく反応する。期待の100〜1000倍とかになったりする。
llRotLookAt
動作してるようだが、時定数 τの指定が効いているような、いないような。
追記(2014-08-17)
llApplyImpulse, llRotLookAt のどちらも、オブジェクトの質量が大きいと、それが反映するのに時間が掛かるとともに、いったん過反応した後にそれを修正する動作が起こり、結果、無用な振動が起きる。
llSetTimeEvent
タイマー割り込みがまったく発生しないことがときにある。スクリプトを一部変更して保存しなおすと直ったりする。
追記 (2014-08-29)
タイマーをセットしたまま llResetScript でスクリプトをリセットすると、その後タイマーをセットしても動かなくなります。リセットの前に llSetTimerEvent(0.0) でタイマーを停止する必要があります。 その他にも llResetScript を使うと不具合があるみたいですが、よく分かりません。
以上のテストは、パピーリナックス(Puppy Linux) 571JP 上で OpenSIM 8.0 + mono-2.10.8 スタンドアロンでローカル環境で行いました。動いたものを OSgrid(OpenSIM-0.8.1) 上に持っていくと、ほぼ同じ動きではあります。
安定して再現するとは限らず、上記テストもあまり正確ではないかもしれませんが、とりあえずのメモ。
Secondlifeでパラグライダーなど数々の乗り物を作ったシノバー。OSgrid中での乗り物に挑戦してみました。やはり難しい。一部は動くが、一部は動きません。
OSgridで浮き輪を作ってみました。辛うじて動く感じです。
OSgridでのシミュレータはOpenSIMです。OpenSIMによる物理のシミュレーションがどうなのか、とにかく情報が無い。しかたないので手探りで、一つひとつを動作確認するしかありません。いまのところの状況をメモしておきます。
1. OpenSIMはバージョン0.8で物理エンジンが変更されている。
バージョン7.x の物理エンジンは OpenDynamicsEngine(ODE) だったが、8.xでは BulletSim が標準となっている。OpenSIM Wikiの情報はほとんどが ODEに関するもので、あてにできない。
2. 装着物に対して物理は効かない。
装着すると浮遊するとか飛び上がるなど、アイテムの装着によってアバターに力を及ぼすことはできないようです。
3. 同じスクリプトが別のオブジェクトでは異なる動作をする。
理由の一つはオブジェクトの質量(Mass)にあるらしい。いっぱんに質量が小さいと、比較的まともに動くが、質量が大きいと奇妙な挙動を示すことがある。
もうひとつはプリムの回転によってX軸の向きが変わることによる相違。たとえば浮遊(Buoyancy) によってプリムのX軸方向に妙な運動が起こる。
4. 動かない関数
物理関連で動かない関数はたくさんあるが、そのうちとくに気付いたもの。
llSetHoverHeight, llSetForce
5. 動作の怪しい関数
llSetBuoyancy
a) 1.0 をセットすると無重力になるはずだが、プリムX軸方向に 5m/s 程度の運動が起こる。 0.5 などの中間的な値を指定しても、この奇妙な運動は変わらない。
b) 0.0 をセットすると普通に重力が掛かるはずだが、オブジェクトの質量が小さいとき、たとえば 質量(Mass)が0.6 あたりで無重力状態が生じる。
追記 (2014-08-16)
この関数だけをテストしてみると、正常そうに見えます。スクリプトの他の部分と複合してるのかもしれません。llApplyImpulse の影響かも。
llApplyImpulse
だいたいは期待される動作だが、質量の大きいオブジェクトに小さな力を与えると反応せず、大き目の力を与えると、とんでもなく反応する。期待の100〜1000倍とかになったりする。
llRotLookAt
動作してるようだが、時定数 τの指定が効いているような、いないような。
追記(2014-08-17)
llApplyImpulse, llRotLookAt のどちらも、オブジェクトの質量が大きいと、それが反映するのに時間が掛かるとともに、いったん過反応した後にそれを修正する動作が起こり、結果、無用な振動が起きる。
llSetTimeEvent
タイマー割り込みがまったく発生しないことがときにある。スクリプトを一部変更して保存しなおすと直ったりする。
追記 (2014-08-29)
タイマーをセットしたまま llResetScript でスクリプトをリセットすると、その後タイマーをセットしても動かなくなります。リセットの前に llSetTimerEvent(0.0) でタイマーを停止する必要があります。 その他にも llResetScript を使うと不具合があるみたいですが、よく分かりません。
以上のテストは、パピーリナックス(Puppy Linux) 571JP 上で OpenSIM 8.0 + mono-2.10.8 スタンドアロンでローカル環境で行いました。動いたものを OSgrid(OpenSIM-0.8.1) 上に持っていくと、ほぼ同じ動きではあります。
安定して再現するとは限らず、上記テストもあまり正確ではないかもしれませんが、とりあえずのメモ。