| カバー | 会社概要 | お問合せ |
|
セカンドライフリンク
サマーソフト研究所の Lavender C について詳しくは:
Registry Cleaner については:
For Error Nuker については:
|
|
サマーソフト研究所の暗号プログラム Lavender_C Lavender_C は、お客様の大切なファイルを暗号でお守りします。 暗号方式として、画期的な高速フラクタル方式を採用いたしました。 暗号鍵には、画像ファイルや音楽ファイルなど、お好みのファイルをご利用いただけます。 そのため、暗号鍵は、お客様にとっては覚えやすく、第三者には推測が非常に困難です。 暗号鍵は、お客様だけが管理します。 ご購入後は、安全な通信のために、Setup.exe を友人に配布できます。 ! 暗号鍵ファイルの配布には、注意が必要です。 Windows プラットフォームに対応。Lavender_C は、6,000 円にてご提供しております。
Linden スクリプティング言語
(これは、進行中の未完成の作業です)
Linden Scripting Language Guide
Aaron Brashears
Copyright ? 2003 Linden Lab
Linden スクリプティング言語(LSL)は、セカンドライフ内のオブジェクトの動きを制御するための単純ながら強力な言語です。
LSL は、暗黙的な状態マシンを持つ C/Java 型の言語です。
同じオブジェクトに複数のスクリプトを添付すると、個々の小型スクリプトを発展させることができます。
たとえば、"hover"(滑空)、 "follow"(追尾)のような関数を組み合わせて、新しい動きを作ることができます。
スクリプトのテキストは、Java のように、実行可能なバイトコードにコンパイルされます。
シミュレータの仮想マシンでは、このバイトコードが実行されます。
各スクリプトにはシミュレータ時間の一部が割り当てられるため、シミュレータに多数のスクリプトがあっても、個々のスクリプトに割り当てられる時間が減るだけで、シミュレータの性能は低下しません。
また、各スクリプトは固有のメモリチャンク内で実行され、シミュレータの保護メモリ領域や他のスクリプトへの書き込みが禁止されるため、シミュレータのクラッシュが防止されます。
このチュートリアルでは、LSLの基本機能、編集方法、スクリプトの適用方法について説明し、標準の Linden 定数、イベント、およびライブラリ関数の完全なリファレンスを掲載します。
LSL では何ができるでしょうか。また、その習得は簡単でしょうか。
まず単純な例を使って、スクリプトの開発作業をつぶさに見ていきましょう。
プログラミングの世界で伝統になっているように、"Hello" と言うだけのスクリプトを考えましょう。
この例自体は特に役に立つわけではありませんが、次のことがわかります。
Inventory(「持ち物」)を開き、プルダウンメニューから Create|New Script(スクリプトの作成)を選びます。
'Scripts' フォルダに 'New Script' というスクリプトが作成されます。
スクリプトのテキストかアイコンをダブルクリックして、内蔵エディタでスクリプトを開きます。
スクリプトが開くと、次のような LSL 用の基本スケルトン(骨格)が自動的にビューアに挿入されます。
default
このスクリプトをながめると、スクリプトがある状態に入ると 'Hello, Avatar!' と言い、タッチすると 'Touched.' と言うことがわかります。
ここでは、初めてスクリプトに接する方のために、各部を説明していきましょう。
default
すべての LSL スクリプトには、1 つまたは複数の状態を持つ、単純で暗黙的な状態マシンがあります。
すべてのスクリプトはデフォルト状態を持つ必要があり、ただ 1 つの状態しかない場合はデフォルトの状態になります。
スクリプトを起動したり、リセットすると、デフォルト状態から開始します。
デフォルト状態は、文書のルートレベルに default と入れ、'{' と '}' で囲みます。
デフォルト状態は特権的なステータスであるため、他の状態のように状態として宣言する必要はありません。
ある状態を入るたびに、スクリプトエンジンは自動的に state_entry() イベントを呼び出し、そこにあるコードを実行します。
状態から出るとき、スクリプトエンジンは自動的に state_exit() イベントを呼び出し、次の状態の state_entry ハンドラを呼び出します。
この例では、state_entry() で llSay() 関数を呼び出し、state_exit() ハンドラは定義しません。
state_entry ハンドラと state_exit ハンドラは、状態データを初期化し、listen イベント コールバックのような状態固有データを消去するために便利な場所です。
デフォルト状態の詳細と他の状態を作成し、利用する方法については、「状態」の章で説明します。
2.1.3 関数
この言語には、環境の中でスクリプトとオブジェクトを使用するために、200 以上の組み込み関数があります。
すべての組み込み関数は、'll' で始まります。
例では、'llSay()' 関数を 2 回呼び出しています。
llSay() は、指定したチャネルにテキストを発行するために使用されます。
llSay( integer channel string text );
channel に text を発行します。
チャネル 0 は、すべてのアバターにチャットテキストとして見えるパブリック チャットチャネルです。
チャネル 1〜2,147,483,648 は、アバターへ送信されず、他のスクリプトが聞くことができるプライベートチャネルです。
予約語、組み込み定数、または組み込み関数と名前が衝突しない限り、独自の関数を定義することができます。
2.1.4 タッチイベント
touch_start(integer total_number)
ハンドラーを宣言すると、多くのイベントをスクリプトで検出できます。
ユーザーがユーザー インタフェースからオブジェクトにタッチすると、touch_start() イベントが発生します。
2.1.5 試しましょう
デフォルトのスクリプトを詳しく説明したので、今度は実際に動作するスクリプトをながめてみましょう。
Save(保存)をクリックして、スクリプトを保存します。
このとき、エディタは、スクリプトのテキストを保存し、スクリプトをバイトコードにコンパイルしてバイトコードを保存します。
プレビュー ウィンドウに 'Compile successful!' メッセージが表示されたら、コンパイルと保存が成功しています。
スクリプトをテストするには、世界の中でオブジェクトにスクリプトを適用する必要があります。
世界のメインビューでクリックし、Create(作成)を選択して、世界の中で新しいオブジェクトを作成します。
魔法の杖が表示されたら、世界の中でクリックすると、単純な基本図形を作成することができます。
オブジェクトが表示されたら、新しく作成したスクリプトをオブジェクトの上にドラッグすると、スクリプトを起動できます。
オブジェクトにスクリプトをドラッグすると、Object: Hello Avatar! というメッセージが表示されます。
オブジェクトをクリックして、タッチイベントが動作することを確認します。
チャット履歴に Touched メッセージが表示されるはずです。
2.2 内蔵エディタを使う
内蔵エディタには、基本的なテキストエディタにあるような機能があります。
マウスでテキストをハイライトするか、Shift キーを押しながら矢印キーを押します。
'Edit'(編集)プルダウン メニューを使用するか、通常のショートカット キーを押すと、選択した部分の切り取り、コピー、貼り付け、および削除を実行できます。
2.3 外部エディタを使う
内蔵エディタはクリップボードからテキストを貼り付けることができるので、別の外部エディタを使用してスクリプトを編集し、セカンドライフの中にコピーして保存することができます。
第 3 章 基本事項
実際に動作する単純なスクリプトについて説明したので、ここではスクリプトを作成するためのツールについて説明します。
以下のツールはスクリプトを作成するための基本的なツールであり、本格的なスクリプトを作成するために使用できます。
3.1 コメント
スクリプトにコメントを付けると、スクリプトを変更したり、更新するとき、また他のスクリプトにスクリプトの一部を組み込むときに便利です。
意味が自明でない場合は、常にコメントを付けてください。
LSL は、Java/C++ 型の単一行コメントを使用します。
// このスクリプトは、オブジェクトの回転を切り替えます。
3.2 四則演算
LSL は、C/Java 構文でほとんどの代数演算をサポートしています。
3.2.1 代入
代入は '=' 記号で表します。
おおまかに述べると、この演算子は、'='記号の右辺を左辺に代入します。
代入の右辺には基本型に評価される式を使用できますが、左辺は通常の変数でなければなりません。
すべての基本型が、代入 '='、等価 '=='、および不等 '!=' 演算子をサポートしています。
// ターゲットに関する情報を保持する変数
3.2.2 2 進算術演算子
2 進算術演算子は、同じ型の 2 個のパラメータを受け付ける関数呼び出しのように動作し、その型を返しますが、構文はいくぶん異なります。
表 3-1 2 進算術演算子
但し書きがある場合、2進算術演算子には特殊な意味があります。
詳細は、LSL 型の項を参照してください。
3.2.3 論理演算子
表 3-2 論理演算子
3.2.4 ビット演算子
表 3-3 ビット演算子
3.3 型
変数、戻り値、およびパラメータには、型情報があります。
LSL は、言語全体で使用される基本型を提供しています。
LSL型
integer
float
key
vector
表 3-4 ベクタ算術演算子
rotation
表 3-5 回転算術演算子
list
string StringVar = "Hello, Carbon Unit";
は、[ 1234, <0,0,0,1>, "Hello, Carbon Unit" ] というリストを生成します。
リストは、他のリストと結合できます。
例を示します。
MyList = 3.14159 + MyList;
は、[ 3.14159, 1234, <0,0,0,1>, "Hello, Carbon Unit" ] というリストを生成します。
MyList = MyList + MyList;
は、[ 3.14159, 1234, <0,0,0,1>, "Hello, Carbon Unit", 3.14159, 1234,
<0,0,0,1>, "Hello, Carbon Unit" ] というリストを生成します。
リストからデータをコピーする、リストをソートする、サブリストをコピー/削除するために使用されるライブラリ関数があります。
3.3.1 型変換
型変換は、暗黙的または明示的に行われます。
明示的な型変換は、C 構文を使用して行ないます。
float foo_float = 1.0;
3.3.1.1 暗黙的な型変換
LSL は、integer から float と string から key へのただ 2 つの暗黙的な型変換だけをサポートしています。
したがって、float が指定されている場所で integer を提供し、key が指定されている場所で string を提供することができます。
3.3.1.2 明示的な型変換
LSL は、以下の明示的な型変換をサポートしています。
3.4 グローバル関数
グローバル関数も Java/C のように宣言しますが、'void' 戻り値は存在しません。
代わりに、戻り値が不要な場合は、戻り値を指定しないでください。
make_physical_and_spin(vector torque)
3.5 グローバル変数
グローバル変数とグローバル関数は、ファイルのどこからでもアクセスできます。
グローバル関数も Java/C のように宣言しますが、1 行に 1 つの宣言しか行えません。
vector gStartPosition;
グローバル変数は、必要な場合に初期化することができます。
ただし、初期化されていないグローバル変数とローカル変数は、合法のゼロ値に初期化されます。
vector gStartPosition = <10.0,10.0,10.0>
3.6 ローカル変数
ローカル変数は、宣言されているコードブロック内の宣言の下で有効であり、任意のコードブロック内で宣言します。
したがって、次のコードは合法であり、C のように動作します。
integer test_function()
第 4 章 流れの制御
しかし、最も基本的なスクリプトでも、流れを制御する必要があります。
LSL には、条件処理、ループ、ジャンプを扱うための構造があります。
4.1 条件文
'if' 文は、Java/C と同じ構文を持ち、Java/C と同じように動作します。
check_message(string message)
( ) 内の件付が 0 以外の整数になると、{と}で囲まれた文が実行されます。
条件が TRUE (0 以外)と判定されると、'else' 部分は処理されません。
NULL_KEY 定数は、条件式で FALSE と見なされます。
'else if' 文はまったくないか、複数ある場合があり、最後の 'else' は、すべての if 文が 0 以外の整数にならない場合に実行されます。
通常の整数算術演算と比較演算子を使用できます。
// 環境に関する情報を受け付け、最適な次の手順を決定する関数です。
4.2 ループ構造
ループはほとんどの有用なプログラミング言語の基本的な要素であり、LSL には Java や C と同じループ構造があります。
4.2.1 for ループ
for ループは、演算を繰り返す回数がわかっているときに最も便利です。
Java や C と同様、for ループの( )の中は、初期化子、継続条件、および増分に分かれています。
ループは、継続条件が TRUE になる間継続し、ループの最後で増分が実行されます。
// 仮想ブロックを滑らかに上方向(正のz方向)に移動します。
4.2.2 do-while ループ
do-while ループ構造は、少なくとも 1 回は演算を実行したいが、何回実行するかがわからないときに最も便利です。
構文は、Java や C と同じです。
簡単に述べると、while の後にある文が TRUE になる間、{ } 内のコードを実行します。
// このオブジェクトに属するすべての持ち物の名前を出力します。
4.2.3 while ループ
while ループは do-while ループのように動作しますが、{ } 内を一度も実行せずにループを終了することができます。
mention_inventory_type(integer type)
4.3 ジャンプ
ジャンプを使用すると、関数やイベントハンドラの新しい位置へ移動できます。
他の関数や他のイベントハンドラの中にはジャンプできません。
通常は、if..else 文では面倒な場合に、ジャンプを使用します。
たとえば、いくつかの条件を事前にをチェックし、そのどれにも当てはまらない場合に終了します。
attach_if_ready(vector target_pos)
4.4 状態変化
状態変化を利用すると、デフォルト状態とユーザー定義状態の間でスクリプトを遷移させて、LSL 仮想マシンの柔軟な状態マシンの中を移動できます。
独自のスクリプトを定義するには、名前の前にキーワード'state'を付け、'{'と'}'でイベントハンドラを囲みます。
新しい状態に遷移するには、'state < 状態名 >'で新しい状態を呼び出します。
default
第5章 状態
すべてのスクリプトには、スクリプトが起動するときに最初に入る 'default' 状態が必要です。
状態には、LSL 仮想マシンがトリガするイベントハンドラが入ります。
すべての状態に少なくとも 1 つのイベントハンドラが必要です。イベントハンドラのない状態はありません。
状態が変化すると、すべてのコールバック設定が保持され、保留中のすべてのイベントが消去されます。
たとえば、デフォルト状態に listen コールバックを設定し、state_exit() 中に削除しないと、デフォルト状態で設定されたフィルタを新しい listen イベントが渡す場合、新しい状態で listen コールバックが呼び出されます。
5.1 state_entry()
state_entry イベントは、プログラムの起動を含めて新しい状態に入るときに発生し、常に最初に処理されるイベントです。
このイベントハンドラは、データを取りません。
通常、オブジェクトを有用な状態に入れるために、状態の state_entry() コールバックでタイマーやセンサーなどのためにコールバックを設定します。
警告
持ち物からオブジェクトを rez すると state_entry() コールバックが呼び出されるというのは、間違いです。
持ち物の中にオブジェクトを derez すると、スクリプトの現在の状態が保存されるため、rez 中に state_entry() が呼び出されることはありません。
オブジェクトが作成されるたびに起動コードを提供する必要がある場合は、グローバル関数を作成し、state_entry () コールバックと on_rez() コールバックから、そのグローバル関数を呼び出す必要があります。
// グローバル初期化関数
5.2 state_exit()
state_entry イベントは、state コマンドを使用して別の状態に遷移するときに発生します。
これは、新しい状態の state_entry イベントの前に処理されます。
現在の状態では必要だったが次の状態では必要でないイベントを消去する必要がある場合は、state_exit() を提供します。
default
オブジェクトが削除されるとき、state_exit() ハンドラは呼び出されません。すべてのコールバック、ハンドラ、サウンドなどは、自動的に消去されます。
5.3 状態とグローバル変数
状態と 1 組のグローバル変数は同じ目的を達成し、それぞれ一方を他方で表現することができます。
一般に、状態は比較を行わずにスクリプトの状態を想定できるので、グローバル変数より状態の使用を優先します。
スクリプト内の比較が少ないほど、コード文がすっきりします。
第 6 章 数学関数
6.1 関数一覧
表 6-1 三角関数
表 6-2 ベクタ関数
表6-3 回転関数
第 7 章 文字列
7.1 関数一覧
表7-1 文字列関数
第 8 章 リスト
8.1 関数一覧
表8-1 リスト関数
第 9 章 通信
9.1 関数一覧
表 9-1 InWorld 関数
表 9-2 メッセージング関数
第 10 章 持ち物
10.1 関数一覧
表 10-1 持ち物関数
第 11 章 乗り物
乗り物は、LSL 全体で使用できる新しい機能です。
この章では、乗り物の動き、乗り物を記述するときに使用する用語、および使用できる API などの基本事項について説明します。
スクリプト付きのオブジェクトを動かすには、いくつかの方法があります。
その 1 つの方法が、オブジェクトを「乗り物」に変える方法です。
この機能を使用すると、滑走、滑空、飛行、浮遊など、さまざまな動きを実現できます。
たとえば、次のようなことを実行できます。
11.1 概要
スクリプト付きの各オブジェクトは、llSetVehicleType、llSetVehicleFloatParam、llSetVehicleVectorParam、llSetVehicleRotationParam、llSetVehicleFlags、および llRemoveVehicleFlags ライブラリコールで設定できる 1 つの乗り物動作を持つことができます。
これらのスクリプトコールについては後で詳しく説明しますが、ここでは乗り物の動きを調整できるいくつかのパラメータがあることを覚えておいてください。
選択する値に応じて、乗り物はボートのように滑走したり、そりのように乗ることができます。
乗り物フラグを設定すると、一部のデフォルト動作を変更することができます。
一部のフラグは、特定の動作が有効なときだけ効果があります。
たとえば、VEHICLE_FLAG_HOVER_WATER_ONLY を使用すると、乗り物は土地の高さを無視しますが、乗り物が滑空しているときだけ意味があります。
11.2 警告
乗り物はセカンドライフ 1.1 から導入され、安定性やユーザーの安全性を確保するために、必要に応じて一部の動作の詳細が変更される場合があります。
特に、おそらく付録に記載されている制限値やデフォルトの多くが変更される可能性があり、長期的に依存しないようにしてください。
特に llSetBuoyancy、llSetForce、llSetTorque、および llSetHoverHeight など、オブジェクトに衝撃や力を加える一部の他のスクリプトコールと乗り物動作を組み合わせないようにしてください。
おそらく以下の方法で不安定になることはありませんが、その動作が乗り物と競合し、希望した動きにならない場合があります。そのため、llLookAt、llRotLookAt、llMoveToTarget、および llTargetOmega を使用するときは注意してください。
乗り物の動きにバグがあると思われる場合は、乗り物とスクリプトのコピーにコメントか、問題を説明したノートカードを添えて、Andrew Linden にその問題に報告してください。
そのとき、"Bugged Vehicle XX" と指定してください。XX は、あなたのセカンドライフでのイニシャルです。
できるだけ早急に乗り物とスクリプトを調査します。
11.3 定義
通常、"roll" (横揺れ)、 "pitch" (縦揺れ)、 "yaw" (偏揺れ)という用語は、飛行機やボートの回転モードを記述するために使用されます。
それぞれ、ローカルの x 軸、 y 軸、 z 軸のまわりの回転に対応しています。
任意の軸のまわりの正の回転方向を定義するために、物理の入門で導入される右手の法則が使用されます。
右手の法則を使用する方法の例として、横揺れ軸のまわりの正の回転を考えます。
このような回転で飛行機の動きがどうなるかを知るには、親指が正の x 方向を向くようにして右手の親指を横揺れ軸と並行になるように置き、4 本の指をこぶし状にまるめます。
あなたの指は、飛行機が回転する方向を指します。
乗り物の動きを制御するパラメータの多くが、次の形式を取ります。
VEHICLE_BEHAVIOR_TIMESCALE
通常、動きの「時間スケール」は、押す、曲げる、乗り物に影響するその他の動作の時間として理解することができ、希望する動きと実際の動きの差は 1/e (e は自然指数 = 約 2.718281828)まで縮小されます。
すなわち、それは、希望する動きになるまで指数的に減衰する時間スケールです。
乗り物の応答性を高めたいときは、1 秒以下の短い時間スケールを使用し、応答性をなくしたい場合は、300 (5 分)以上の長い時間スケールを使用します。
なお、安定性の理由で、許容される時間スケールには下限があり、それは 1/10 秒程度です。
時間スケールを 0 に設定しても安全です。
常に最小値に等しくなります。
1 日かかるような大きな時間スケールを設定すると、実質的に時間スケールを持つ任意の機能を無効にすることができます。
11.4 乗り物の種類を設定する
乗り物のパラメータを設定する前に、まず乗り物の動きを有効にする必要があります。
それには、任意の VEHICLE_TYPE_*llSetVehicleType を呼び出します。ただし、VEHICLE_TYPE_NONE は乗り物を無効にします。
現在使用できる種類については、乗り物の種類の定数の項を参照してください。
使用できる種類は、今後も追加される予定です。
乗り物の動きを有効にするには、乗り物の種類を設定する必要があり、すべてのパラメータがデフォルト値に設定されます。
記載されている乗り物の種類ごとに、対応する等価なコードが長い形式で提供されています。
ただし、乗り物の種類にかかわらず、デフォルトが最適設定ではありません。そのため、将来変更されることがあります。
指定されるまで、これらの値が定数であるとは考えないでください。
独自の乗り物や実験的な乗り物を作りたい場合も、まずデフォルトの種類のどれかを使用して乗り物の動きを有効にする必要があります。その後は、許容範囲の中で任意のパラメータやフラグを変更することができます。
乗り物の種類を設定しても、自動的にオブジェクトを制御したり、移動できるわけではありません。
ただし、オブジェクトが自由に動ける状態で丘の上に駐車しているときに乗り物の動きを有効にすると、滑り落ちていく場合があります。
私たちは、より良好な新しいデフォルトの乗り物の種類を求めています。
自動車、ボート、その他のデフォルトの乗り物用の良好なパラメータの組み合わせを見つけたと思われる場合は、スクリプトかノートカードで設定リストを Andrew Linden にお知らせください。
11.5 線形屈折と角度屈折
現実の乗り物の共通の特徴は、優先運動軸に沿って動く傾向があることです。
すなわち、車輪、翼、形状、または推進方法のために、乗り物のローカルフレーム内で静的な(=変化しない)軸に沿って推進するか、方向転換する傾向があります。
この一般的な特徴が乗り物のクラスを定義し、このカテゴリに属する共通の投げ槍が「乗り物」です。背中にひれがあり、空気にふれると前進するように位置調整します。この位置調整のことを「角度屈折」と呼びます。
車輪を持つ乗り物は、いくぶん違います。スケートボードをある方向に押すと、自由に転がる方向に方向転換する傾向があります。この効果のことを「線形屈折」と呼びます。
そのため、典型的なセカンドライフの乗り物は、優先運動軸に沿って線形屈折または角度屈折を示すオブジェクトです。
デフォルトの優先運動軸は、乗り物のルートプリミティブのローカルフレームのローカル x 軸(その場所)、y 軸(左方向)、および z 軸(上方向)です。
屈折の動きは x 軸に相対的な動きです。線形屈折は、正のローカル x 軸に揃うまで速度を回転させる傾向があり、角度屈折は、その x 軸が移動する方向を向くように方向転換する傾向があります。
他の軸は、乗り物のローカル z 軸が世界の z 軸(上方向)を向くように維持する vertical attractor のような後で説明する乗り物の動きに関連しています。
乗り物の軸は、VEHICLE_REFERENCE_FRAME パラメータを使用して、オブジェクトの実際のローカル軸のまわりに回転することができます。ただし、これは拡張機能であり、後の項で詳細に説明します。
乗り物によっては、多数の線形屈折や角度屈折を持つことが望ましい場合があります。
屈折の速度は、llSetVehicleFloatParam スクリプトコールを使用して関連パラメータを設定して制御します。
いずれの屈折にも、屈折を完了する速度を決定する「時間スケール」があります。
基本的に、時間スケールとは、屈折が完了するまで指数減衰する時間係数です。
したがって、時間スケールが小さいほど、乗り物の屈折が早く完了します。
たとえば、典型的な投げ槍の場合、角度屈折の時間スケールは 2 秒、線形屈折は数秒です。そのため、方向を変える前に方向転換する傾向があります。
投げ槍の屈折の時間スケールを設定するには、以下の行を使用できます。
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 2.0);
いずれの屈折にも、0.0 〜 1.0 の範囲の "efficiency" (効率)パラメータがあります。
他の乗り物の動きの他の効率パラメータと異なり、屈折効率は "bouncy" と "damped" の間で変化せず、"no deflection whatsoever" (0.0)と "maximum deflection" (1.0)の間で変化します。
すなわち、屈折時間スケールのように動作します。ただし、0.0 〜 1.0 の範囲に正規化されます。
11.6 乗り物を動かす
乗り物は、有効にすると、外部の力や llApplyImpulse のようなスクリプトコールで押したり、回転させることができます。ただし、動きを容易にし、滑らかにするために、線形推進力と角度推進力が内蔵されています。
乗り物の方向は、llSetVehicleVectorParam コールを使用して設定することができます。
たとえば、乗り物をローカル x 軸(デフォルトの眺める方向)に沿って秒速 5m で動かすには、スクリプトに次の行を入れます。
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <5, 0, 0>);
乗り物の移動速度が過剰にならないように、線形推進力は毎秒 30m を超えないように制限されています。
なお、これは物理的なエンジンの制約のために制限されており、可能でれば後で引き上げられる場合があります。
推進速度を設定するだけでは、面白い乗り物にはなりません。
たとえば、自動車がただちに最高速度に達するようにしたい場合があり、ボートがゆっくりと最高速度に達するようにしたい場合があります。
この効果を制御するには、VEHICLE_LINEAR_MOTOR_TIMESCALE パラメータを使用できます。
基本的に、推進力の「時間スケール」は、乗り物が指数関数的に最高速度まで加速する時間定数です。
乗り物の線形速度を最大可能速度に設定して発進すると、どうなるでしょうか。
そのまま走り続け、決して停止しないでしょうか。
必ずしも、それではありません。自動「推進減衰」が内蔵されているため、すべての推進力が設定後にしだいに減衰していきます。
線形推進ベクタを設定するたびに、VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE で決定される時間スケールで、"grip" がただちに指数関数的に減衰しはじめます。
そのため、十分な時間が経過すると、推進効果が消滅します。
この減衰時間スケールには、2 つの目的があります。
最初に、120 秒を超える値を設定できないため、また常に有効になっているため、(キーボードコマンドやスクリプトの論理ループで)アクティブな制御を行わずに永久に走り続けないことが保証されます。
2 番目に、単純な衝撃モデルを使用して、一部の乗り物を押し続けることができます。
すなわち、特定のキーを押したり、離したときに推進力のオンとオフを切り替える代わりに、減衰時間スケールを短く設定して、特定のキーを押したり、離したときに推進力をオンにすると、自動的に減衰させることができます。
推進力のベクタを設定すると推進力の効率がリセットされるため、ベクタの長さを 0 に設定することと完全に減衰させることは異なります。
最初の場合、乗り物は 0 の速度に達しようとし、2 番目の場合、推進力が無効になります。
2 つの推進力時間スケールの名前は非常に似ていますが、効果が異なるため、混同しないように注意してください。
VEHICLE_LINEAR_MOTOR_TIMESCALE は、推進力が優先する時間であり、VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE は、推進力の「効果」が 0 に減衰する時間です。
片方を変更しているときに他方を設定した場合、満足できる結果になりません。
また、推進力の減衰時間スケールが通常の時間スケールより短い場合、推進力ベクタの効果が減ります。
11.7 乗り物を操縦する
線形推進力と同様、方向と大きさを設定できる、常に有効な角度推進力もあります。
たとえば、ローカル z 軸(上方向の軸)の周りに毎秒 5 度で乗り物を回転させるには、スクリプトに次の行を追加します。
vector angular_velocity = <0, 0, 5 * PI / 180>;
角度推進力の大きさは、最大で毎秒 2 回転(4*πラジアン/秒)に制限されています。
また、線形推進力と同様、VEHICLE_ANGULAR_MOTOR_TIMESCALE という効率パラメータと、デフォルトで最大可能値 120 秒に設定される VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE という推進力減衰パラメータがあります。
おそらく乗り物を操縦するときは、あまり遠くで曲がったり、あまり長い時間かかって曲がるのは望ましくないでしょう。
角度推進力を使用してそれを行うには、たとえば、減衰時間スケールを長いまま残し、(推進力をオフにしたときに乗り物の速度を早く下げるために)かなりの量の角度摩擦を有効にし、キーを押したときに角度推進力を大きなベクタに設定し、キーを離したときに 0 に設定します。
あるいは、VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE を短い値に設定し、キーを押したときにより衝動的な方法で乗り物を押し(オプションで、キーを離したときに推進力を 0 に設定し)、一定の角度摩擦でなく、推進力の効率の自動的な指数減衰を利用します。
角度推進力を 0 に設定することと、角度推進力を減衰させることは異なります。
推進力が完全に減衰すると、乗り物の動きに影響しなくなり、0 に設定すると、乗り物の "grip" がリセットされ、乗り物の角速度が 0 まで次第に減衰します。
一部の乗り物では、「傾斜機能」を使用して曲がることができます。
「傾斜」は、飛行機やバイクが曲がるときに発生します。
傾斜する乗り物が横揺れ軸のまわりに曲がると、偏揺れ軸の周りに回転します。
傾斜は、次項で説明する "vertical attractor" を使用するときだけ使用できます。
11.8 Vertical Attractor
ボートのような一部の乗り物は、常に上面が上を向くように維持する必要があります。
それには、乗り物のローカル z 軸を世界の z 軸(上方向)に揃える "vertical attractor" 機能を有効にします。
この機能を利用するには、VEHICLE_VERTICAL_ATTRACTION_TIMESCALE を設定して上向きに揃える周期を制御し、VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY を設定して減衰を制御します。
効率を 0.0 に設定すると、上向きに揃える力が平衡状態付近で揺れ動き、効率を 1.0 に設定すると、上向きに揃える力が指数減衰で平衡状態に達します。
llSetVehicleVectorParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 4.0);
vertical attractor を無効にするには、その時間スケールを 300 秒以上に設定します。
なお、デフォルトで、vertical attractor は、乗り物の飛び込みや登坂を防止します。
そのため、飛行機を作る場合は、VEHICLE_FLAG_LIMIT_ROLL_ONLY ビットを設定して、attractor を縦揺れ軸の周りで自由に回転させます。
llSetVehicleFlags(VEHICLE_FLAG_LIMIT_ROLL_ONLY);
11.9 傾斜
傾斜の動きを出すには、vertical attractor 機能を有効にする必要があります。
傾斜の動きは、次のとおりです。
乗り物を横揺れ軸の周りで回転させて偏揺れ軸の周りに角速度を生成し、乗り物が曲がるようにします。
偏揺れ効果の大きさは、VEHICLE_BANKING_COEF (横揺れ回転の角度)に比例し、場合によっては乗り物の優先運動軸方向の速度に比例します。
VEHICLE_BANKING_COEF は、-1 〜 +1 の範囲で変更できます。
VEHICLE_BANKING_COEF が正の場合は、横揺れ軸の周りの(右手の法則で)正の回転が、偏揺れ軸の周りに(負の)トルクを発生し、現実の飛行機やバイクの動きのように、乗り物が右に曲がります。
傾斜係数を負にすると、乗り物が曲がりの外側に来ます(これは現実的ではありませんが、乗り物に面白い効果が出ます)。
VEHICLE_BANKING_MIX は、物理法則に従わずに乗り物を傾斜させることができる仮想的なパラメータです。
たとえば、現実のバイクを考えてみましょう。
現実のバイクが曲がるには、前進している必要があります。一方、ビデオゲームのバイクは、キーボードやゲームコントローラのインターフェースに制限があるため、コントロールしやすいように、通常、止まったままその位置で曲がるように設定されます。
VEHICLE_BANKING_MIX を使用すると、完全停止状態(0.0)から完全前進状態(1.0)の範囲で調整して、現実の傾斜と仮想の傾斜を組み合わせることができます。
乗り物の傾斜は、停止状態では横揺れ軸の周りの回転だけに依存し、前進状態では横揺れ軸方向の速度に比例します。
最適な組み合わせの値は、試行錯誤で見つける必要があります。
傾斜の動きが世界の z 軸の周りの既存の角速度を超えるまでにかかる時間は、VEHICLE_BANKING_TIMESCALE で決定されます。
そのため、乗り物を早く傾斜させたい場合は、傾斜の時間スケールを 1 秒以下に設定し、ゆっくり傾斜させたい場合は、数秒に設定します。
11.10 摩擦時間スケール
VEHICLE_LINEAR_FRICTION_TIMESCALE は、乗り物が乗り物の基準フレームの 3 つのローカル軸に沿って完全に停止するまでの時間スケールを定義するベクタパラメータです。
各軸に沿う時間スケールは、それぞれ独立しています。
たとえば、一般に地面を滑走する自動車は、(前進や落下が簡単になるように) x 軸と z 軸に沿う摩擦が非常に小さく、y 軸に沿う摩擦が大きくなります。
llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <1000, 1000, 3>);
なお、時間スケールが長いほど摩擦が弱くなるため、実質的にすべて線形摩擦を無効にするには、すべての時間スケールを大きな値に設定します。
線形摩擦をスカラとして設定することができ、すべての時間スケールを同じ値に設定する効果があります。
次の両方のコードは等価であり、摩擦が無視されます。
// すべての線形摩擦時間スケールを 1000 に設定します。
// 上記より少ない文字数で、すべての線形摩擦時間スケールを 1000 に設定します。
また、VEHICLE_ANGULAR_FRICTION_TIMESCALE は、乗り物が x 軸、y 軸、および z 軸の周りの回転を停止するまでの時間スケールを定義するベクタパラメータです。設定したり、無効にする方法は、線形摩擦と同じです。
11.11 浮力
乗り物は、llSetBuoyancy コールから独立した浮力機能を内蔵しています。
2 つの浮力を組み合わせないでください。
乗り物に浮力を与えるには、VEHICLE_BUOYANCY パラメータを 0.0 (浮力なし)〜 1.0 (完全な無重力)の範囲で設定します。
浮力の動きは、滑空から独立していますが、VEHICLE_HOVER_HEIGHT から大きく外れずに滑空するようにするには、VEHICLE_BUOYANCY を 1.0 に設定する必要があります。
乗り物の浮力と llSetBuoyancy スクリプトを組み合わせないでください。
オブジェクトが空中に浮かび上がることになります。
11.12 滑空
滑空の動きは、VEHICLE_HOVER_TIMESCALE を 300 秒未満の値に設定すると有効になります。時間スケールを300 秒以上の値に設定すると、滑空が完全に無効になります。
ほとんどの乗り物は、数秒未満の短い時間スケールのとき、良好に動作します。
時間スケールが短いほど、乗り物が目標の高さに早く到達します。
なお、VEHICLE_LINEAR_FRICTION_TIMESCALE の値が、滑空の速度に影響する場合があります。
滑空は、浮力から独立しています。ただし、VEHICLE_BUOYANCY は、1.0、に設定する必要があります。そうしないと、重力加速度を打ち消すほど大きく VEHICLE_HOVER_HEIGHT を設定するまで、乗り物が地面から浮上しません。乗り物は、決して目標の高さまで到達しません。
VEHICLE_HOVER_EFFICIENCY は、はずむ(0.0)〜滑らか(1.0)の範囲にあると考えることができます。
乗り物は、はずむ範囲にある場合、目標の高さより少し低い高さで滑空する傾向があり、VEHICLE_HOVER_TIMESCALE がはずむときのおおよその振動周期になります(実際の周期は、時間スケールよりいくぶん長くなる傾向があります)。
性能の理由から、セカンドライフの物理エンジンが改良されるまで、乗り物は地面と水の上しか滑空できません。したがって、橋や家のようなプリミティブで作られたオブジェクトの上は滑空できません。
デフォルトで滑空の動きは地面と水の上の滑空ですが、一部のフラグを設定すると変更できます。
ボートを作りたい場合は、VEHICLE_HOVER_WATER_ONLY フラグを設定する必要があります。また、ホーバークラフトを水中で運転したい場合は、代わりに VEHICLE_HOVER_TERRAIN_ONLY フラグを使用します。
最後に、潜水艦や風船を作りたい場合は、VEHICLE_HOVER_GLOBAL_HEIGHT を使用します。
なお、フラグは、相互に独立しています。ただし、競合する 2 つのフラグを設定すると、その動作は保証できません。
フラグを設定するには、llSetVehicleFlags() スクリプトコールを使用します。
VEHICLE_HOVER_HEIGHT は、乗り物が地面や水の上を滑空する高さ(これを「グローバルの高さ」と呼びます)を決定し、最大値は 100m です。
なお、滑空の目的上、乗り物の「中心」は、慣れていない目には常に明白になるとは限らない「重心」になり、重心はアバターが乗り物に座ると変化します。
11.13 基準フレーム
乗り物は、x 軸(その位置)、y 軸(左方向)、および z 軸(上方向)を使用して、移動する優先方向と上方向を認識します。
デフォルトで、これらの軸は、オブジェクトのルートプリミティブのローカル軸と同じです。ただし、これは、乗り物のルートプリミティブが、デフォルトで、設計された乗り物の x 軸(その位置)、y 軸(左方向)、および z 軸(上方向)と一致する方向を向く必要があることを意味します。
しかし、乗り物のオブジェクトに、乗り物全体が移動する向きと異なるルートプリミティブの向きがすでに組み込まれている場合は、どうなるでしょうか。
この場合、VEHICLE_REFERENCE_FRAME パラメータが役に立ちます。このパラメータを設定すると、乗り物の軸を自由に変更できます。
例として、大きな円柱形のロケットを作り、先端部には円錐形を使用し、箱型を引き伸ばした「ひれ」をいくつか付け、円柱形をルートプリミティブとして全部をリンクした場合を考えます。
理想的には、ロケットは、先端部を先頭にして移動します。ただし、円柱形の軸は、そのローカル z 軸に対称であり、角度屈折で前方に屈折する乗り物のデフォルトの(その位置)軸は、ローカル x 軸であり、円柱形の湾曲表面の外を向いています。
次のスクリプトコードは、ローカル z 軸が(その位置)軸になり、負のローカル x 軸が(上方向)軸になるように、乗り物の軸を回転させます。
// 乗り物のフレームをローカル y 軸(左方向軸)の周りにπ/2 回転させます。
基準フレームパラメータを使用する別の例は、飛行中の安定性のために vertical attractor を使用し、VTOL (垂直離着陸機)を使用する飛行物体です。
飛行中は飛行物体の胴体軸が上を向き、着陸時には先端部が上を向く必要があります。
乗り物を着陸させるには、vertical attractor が有効な間に、既存の VEHICLE_REFERENCE_FRAME を左方向軸の周りに約π/2 回転させると、先端部が空を向くように乗り物の姿勢が変化します。
乗り物は、摩擦の効果で、または滑空の効果を減らして、着陸地点に降下できます。
付録A Lindenライブラリ関数
Registry Cleaner - Reliable, Award Winning Program.
Quickly/Easily Clean Your Registry!
Error Nuker -a powerful utility that will scan the Windows Registry to identify errors and ways to optimize the performance of the Windows Registry.
Unlike other similar tools, Error Nuker is very careful with the registry ? it never deletes a registry entry if this could harm your system...
CD |
DVD |
|