2018年04月01日
新ブログ開設
自前サイト内に仮想世界 OpenSim の話題を扱う新しいブログを開設しました。今後はそちらをメインにしていきます。
URLは http://shinobar.net/opensim/ です。
2020年10月に上記に変更しました。ブックマークなどの更新よろしくお願いします。
URLは http://shinobar.net/opensim/ です。
2020年10月に上記に変更しました。ブックマークなどの更新よろしくお願いします。
Posted by シノバー at
22:43
│Comments(0)
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 を検索ください。
2017年12月04日
Sexy Santa
肌の色やメイクが冬仕様となったスキンでサンタ衣装に身を包んだNaoko。衣装、靴、髪やアクセサリーも含んだフルアバターセットです。
JOG(Japan OpenGrid)内、Shinobar Annex のアバターのお店で無料配布しています。
SLからは行けません。JOGへの参加法は以下ページなどを参考にしてください。
https://mandfcreations.wixsite.com/misaki-house/lesson
2017年11月16日
海底に眠る財宝
その昔、シノバーSIM群を荒らし回っていた海賊がいたそうです。その海賊船が財宝を積んだまま海底深く沈んでいるという噂があります。「Pirate」のキーワードで、シノバーSIM群に居るコンシェルジュたちに話しかけてみてください。
Japan Open Grid(JOG)内の Shinobar Annex が入り口となります。
Japan Open Grid(JOG)内の Shinobar Annex が入り口となります。
2017年10月27日
2017年09月30日
Dance Master HUD
OpenSimで使えるダンスマスターHUDをリリースしました。
JOG内 Shinobar Annex にあるスクリプトの館で無料で配布しています。
Dance Master HUD の使い方
1. HUDを装着、編集して、中身のアニメーションを入れ替えてください。ただし 0 idle は待機時のアニメとして残しておいてください。追加するアニメーションの数は無制限です。
アニメーションはアルファベット順となり、いちばん上のものが待機時のアニメとなります。順番の入れ替えはアニメの名前を変更することでできます。
アニメを入れ替えてHUDへの表示が更新されるまで10秒掛かります。
2. HUDを装着したとき Dance Master はまだ作動していません。HUD右上の電源ボタンをクリックすることで開始します。あるいはアニメボタンのいずれかをクリックしても作動します。
3. ミラーボール Dance Joiner をRezしてください。最初は offlineとなっています。タッチして受付開始してください。
4.開始時にはHUDを装着したアバター、すなわちダンスマスターだけがダンスに参加しています。他のアバターがダンスに参加する方法は3つあります。
(1) HUDの左上の招待ボタンをクリックすると近くに居るアバターが一斉に招待されます。事前に HUDを作動状態にしておかねばなりません。
(2) ミラーボール Dance Joiner をアバターがクリックすると参加できます。もういちどボールをタッチすると離脱し、アニメが止まります。
Dance Joiner は Rezされたとき受付不可(offline) になっています。ダンスマスターがタッチすることで受付可能(アクティブ)になります。HUD側も作動状態もしておかねばなりません。
Dance Joiner と Dance Master HUD の online/offline は連動していませんので、それぞれぞれ独立にダンスマスターが作動開始/停止しなければなりません。
Dance Master HUDの電源ボタンで offlineにすると、ダンスマスター自身を含め全員がダンスメンバーから外れます。再開時はまた招待/参加しなおさなければなりません。
ミラーボール Dance Joinerの停止は、すでにダンスに参加しているアバターには何の影響もありません。
(3) 「/99 sync」とチャットするとダンスに参加でき、「/99 stop」で離脱できます。
5. HUDのアニメボタンをクリックするとアニメが切り替わります。アニメが10個以上のときは、HUD最下段の←と→ボタンでページが切り替わります。□ボタンは待機アニメを再生します。 Page 1 の最上段のアニメと同じです。
JOG内 Shinobar Annex にあるスクリプトの館で無料で配布しています。
Dance Master HUD の使い方
1. HUDを装着、編集して、中身のアニメーションを入れ替えてください。ただし 0 idle は待機時のアニメとして残しておいてください。追加するアニメーションの数は無制限です。
アニメーションはアルファベット順となり、いちばん上のものが待機時のアニメとなります。順番の入れ替えはアニメの名前を変更することでできます。
アニメを入れ替えてHUDへの表示が更新されるまで10秒掛かります。
2. HUDを装着したとき Dance Master はまだ作動していません。HUD右上の電源ボタンをクリックすることで開始します。あるいはアニメボタンのいずれかをクリックしても作動します。
3. ミラーボール Dance Joiner をRezしてください。最初は offlineとなっています。タッチして受付開始してください。
4.開始時にはHUDを装着したアバター、すなわちダンスマスターだけがダンスに参加しています。他のアバターがダンスに参加する方法は3つあります。
(1) HUDの左上の招待ボタンをクリックすると近くに居るアバターが一斉に招待されます。事前に HUDを作動状態にしておかねばなりません。
(2) ミラーボール Dance Joiner をアバターがクリックすると参加できます。もういちどボールをタッチすると離脱し、アニメが止まります。
Dance Joiner は Rezされたとき受付不可(offline) になっています。ダンスマスターがタッチすることで受付可能(アクティブ)になります。HUD側も作動状態もしておかねばなりません。
Dance Joiner と Dance Master HUD の online/offline は連動していませんので、それぞれぞれ独立にダンスマスターが作動開始/停止しなければなりません。
Dance Master HUDの電源ボタンで offlineにすると、ダンスマスター自身を含め全員がダンスメンバーから外れます。再開時はまた招待/参加しなおさなければなりません。
ミラーボール Dance Joinerの停止は、すでにダンスに参加しているアバターには何の影響もありません。
(3) 「/99 sync」とチャットするとダンスに参加でき、「/99 stop」で離脱できます。
5. HUDのアニメボタンをクリックするとアニメが切り替わります。アニメが10個以上のときは、HUD最下段の←と→ボタンでページが切り替わります。□ボタンは待機アニメを再生します。 Page 1 の最上段のアニメと同じです。
2017年07月09日
コンシェルジュ
Canyonなど、JOG内シノバーSIM群の要所に案内嬢(ロボット)を配置しました。いろいろ聞いてみてね。
JOGへの入り方は以下を参考にしてください。
JOG - ジャパンオープングリッドへの入り方(もとちゃ の めざせ!たこ焼き屋さん) 続きを読む
2017年06月10日
ダンスの館
JOG内 Shinobar Annexに「ダンスの館」を開店しました。
カップル・ダンスやキスなどのアニメーションを再生するボールを豊富に取り揃えております。自作スクリプトでアバターの身長差の吸収、NPCによるパートナーの呼び出しなどの機能を備えています。
Shinobar Annex 南西隅にあります。hop://jogrid.net:8002/Shinobar%20Annex/80/80/21/
北西角は スクリプトの館です。併せてご愛顧ください。すべてフルパー、無料です。
2017年06月06日
キスボール
kiss ball を作りました。カップルポーズの問題は2人のアバタのサイズの違いをどう吸収するかです。 llSetLinkParams関数を使えば、子プリムに座ったアバタの位置を動かせることに私は最近気づきました。
これを使える sitpose4 スクリプトを、JOG内 Shinobar Annex スクリプトの館で公開しました。ノートカード SITCONFIGで ADJUST = <0, 0, 0.2> などとして設定してください。x, y z 方向の位置補正の強さです。
アバタの身長しか見ていないので、唇の位置、手足の長さなどに起因するズレは補正されません。大まかなものと理解してください。
これを使える sitpose4 スクリプトを、JOG内 Shinobar Annex スクリプトの館で公開しました。ノートカード SITCONFIGで ADJUST = <0, 0, 0.2> などとして設定してください。x, y z 方向の位置補正の強さです。
アバタの身長しか見ていないので、唇の位置、手足の長さなどに起因するズレは補正されません。大まかなものと理解してください。
Posted by シノバー at
20:11
│Comments(0)
2017年05月06日
ツアーライド・スクリプトの修正
JOGに接続している Canyon など Shinobar SIM群のサーバープログラム opensim のバージョンを 0.8.2.1 から 0.9.1 系に更新しました。opensim-0.9.1系はOSGで公開されているものです。
opensim更新により一部のスクリプトが動かなくなりました。調べてみると、llList2Float および llList2Integer 関数の挙動に問題がありました。
これらの関数はリスト変数の一要素から数字を読み出すものです。もともと数字が代入されていたものを取り出すのは問題はないでしょう。今回問題になったのは気球などライドツアーのスクリプトで、ノートカードに書かれた座標を読み取ろうとするものです。
ノートカードから読み込まれたものは文字列として扱われています。それを数字として扱うためにタイプキャストという操作が必要です。LSLポータルによればタイプキャストを自動的にやってくれることになっていますし、opensim-0.8系では問題ありませんでした。しかし opensim-0.9.1系では自動的にはやってくれず、すべて 0 が帰ってくるようです。
以下のように明示的にタイプキャストすることで問題なく動くようになりました。
修正前: x = llList2Float( datalist, index );
↓
修正後: x = (float)llList2String( datalist, index);
JOG内 Canyon には修正後のツアーライド3種(気球、ボート、タクシー)を置いています。コピー改変自由です。内蔵ノートカードのコース座標を変更して、ご自身のSIMでもライドツアーを設置してはいかがでしょうか。
opensim更新により一部のスクリプトが動かなくなりました。調べてみると、llList2Float および llList2Integer 関数の挙動に問題がありました。
これらの関数はリスト変数の一要素から数字を読み出すものです。もともと数字が代入されていたものを取り出すのは問題はないでしょう。今回問題になったのは気球などライドツアーのスクリプトで、ノートカードに書かれた座標を読み取ろうとするものです。
ノートカードから読み込まれたものは文字列として扱われています。それを数字として扱うためにタイプキャストという操作が必要です。LSLポータルによればタイプキャストを自動的にやってくれることになっていますし、opensim-0.8系では問題ありませんでした。しかし opensim-0.9.1系では自動的にはやってくれず、すべて 0 が帰ってくるようです。
以下のように明示的にタイプキャストすることで問題なく動くようになりました。
修正前: x = llList2Float( datalist, index );
↓
修正後: x = (float)llList2String( datalist, index);
JOG内 Canyon には修正後のツアーライド3種(気球、ボート、タクシー)を置いています。コピー改変自由です。内蔵ノートカードのコース座標を変更して、ご自身のSIMでもライドツアーを設置してはいかがでしょうか。
2016年06月23日
スキンのテンプレート公開
Secondlife や OpenSim で使えるスキンのテンプレートを公開します。ライセンスはパブリックドメイン、すなわち著作権を主張しません。どなたでも無条件でコピー、改変、再配布できます。
いずれかのファイルをベースにしたものではありませんので、いずれのライセンスの制約も受けません。インターネット上の写真や、インワールドでのスキンなどを参考にして私が手描きしたものです。私自身が著作権を主張しないのは、それら先人たちの成果の上に立ったものであり、他の方々もそうであろうと思うからです。
ZIPファイルをこちらから。
解凍すると、ナチュラルメイクの女性スキン naoko の画像と、画像処理ソフト Gimp のファイルが同梱されています。使い方の説明はまたの機会にぼちぼちと。 続きを読む
いずれかのファイルをベースにしたものではありませんので、いずれのライセンスの制約も受けません。インターネット上の写真や、インワールドでのスキンなどを参考にして私が手描きしたものです。私自身が著作権を主張しないのは、それら先人たちの成果の上に立ったものであり、他の方々もそうであろうと思うからです。
ZIPファイルをこちらから。
解凍すると、ナチュラルメイクの女性スキン naoko の画像と、画像処理ソフト Gimp のファイルが同梱されています。使い方の説明はまたの機会にぼちぼちと。 続きを読む
Posted by シノバー at
20:12
│Comments(0)
2016年05月01日
スクリプトの館
自作の小技スクリプトを集めた「スクリプトの館」を、JOG内 Shinobar Annex に開設しました。すべてコピー、改変、再利用できます。ポーズボールや商品の配布、ドアなどの基本的なものを公開中。今後順次拡充していきます。
Shinobar Annex へは、 JOG Center Sim にあるシノバーの看板からどうぞ。
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 に置いています。いずれも自由にコピー、改変、再利用できます。改変の方法は、この記事の続きをお読みください。
続きを読む
2016年03月27日
新規スクリプトのパーミッション
オブジェクトを作成し、コピー可に設定しても、そのオブジェクトの中身にコピー不可のものがあると、オブジェクト全体がコピー不可になります。これはときどき問題になります。
オブジェクトの中に新規スクリプトを作成したとき、標準のままだと新規スクリプトはコピー・修正とも不可となります。作成後に変更することはできますが、面倒ですし、気付かずにトラブルになることがあります。新規スクリプトが最初からフルパーになるような設定法を記します。ビューアーは Firestormの場合で説明します。
Firestormのメニューバーから、制作>オプション>権限の初期設定...を選びます。
初期状態でスクリプトなどはコピーや修正が不可となっています。
スクリプトなどのコピーや修正にチェックを入れ、OKをクリックします。
ここで設定された初期設定は完全に反映されるわけではありません。執筆時点の Firestorm最新版 4.7.7 で、アップロードのパーミッションは指定どおりにはなりません。しかし少なくとも新規スクリプトは指定どおりフルパーミッションになるようです。
オブジェクトの中に新規スクリプトを作成したとき、標準のままだと新規スクリプトはコピー・修正とも不可となります。作成後に変更することはできますが、面倒ですし、気付かずにトラブルになることがあります。新規スクリプトが最初からフルパーになるような設定法を記します。ビューアーは Firestormの場合で説明します。
Firestormのメニューバーから、制作>オプション>権限の初期設定...を選びます。
初期状態でスクリプトなどはコピーや修正が不可となっています。
スクリプトなどのコピーや修正にチェックを入れ、OKをクリックします。
ここで設定された初期設定は完全に反映されるわけではありません。執筆時点の Firestorm最新版 4.7.7 で、アップロードのパーミッションは指定どおりにはなりません。しかし少なくとも新規スクリプトは指定どおりフルパーミッションになるようです。
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 などがすでに登録されています。
・一つのリージョンに対して一つのノートカー,ド、あるいは隣接するリージョン群を一つのノートカードに書いてください。
・複数のリージョンを含む場合、すべてのリージョンは同じサイズであることと、全リージョンの集合体が凸凹なく方形になっていなければなりません。