ソラマメブログ

2008年05月30日

【スクリプト】ヴィークル(乗り物)の基本形の解説

サンプルスクリプトの解説です。
スクリプトと一つにして投稿すると長くなるので、分割しました。
なるべくスクリプト中にコメントを入れるようにしていますので、そちらも参照してください。

----------------------------------------------------
【オブジェクトの制限】
・物理オブジェクトでなければならない(非物理でもスクリプトで物理オブジェクトにステータスを変える)
・乗り物本体、乗員(1アバターが1プリム計算)の合計プリム数が31プリム以下
(複数のアバターが乗るなら、その分プリム数を少なくしなければならない)

----------------------------------------------------
【スクリプトの基本的な流れと各イベントの処理】
●state_entryイベント
・初期設定(乗り物のパラメーター設定)

●on_rezイベント
・スクリプトのリセット

●touch_startイベント(無くてもよい)
・情報表示

●changedイベント(座った/立った)
・座った場合
アニメーションとキーコントロールのパーミッションの確認
・立った場合
アニメーション停止
キーコントロール停止

●run_time_permissionsイベント(パーミッションの取得)
・アニメーション開始
・使用するキーの設定

●controlイベント(キー入力)
・キーに対応したパラメーターを設定

----------------------------------------------------
【乗り物のパラメーターについて】
乗り物の種類ごとに基本的なパラメーターがリンデンから示されています。
パソコンのスタートメニューから「すべてのプログラム」→「Second Life」→「SL Scripting Language Help」(普通にインストールするとc:\Program Files\SecondLife\lsl_guide.htmlです)を開くとLinden Scripting Language Guideというハイパーテキストが開きます(ホームページの形式)。
最後の方に「C.26. Vehicle Types」という項があり、その中に各種乗り物の基本的なパラメーター設定が記載されています。
これを自分のスクリプトに組み込んで、実際に操作してみてパラメーターを微調整していけば、自分好みの乗り物が作れるわけです。

サンプルではAIRPLANEを使用しています(一部パラメーターは調整しています)。

----------------------------------------------------
【複数アバターが乗る場合の注意点】
複数のアバターが乗れる場合、アバターが乗った/立った場合のイベント(changed)に気を付けなければなりません。

例えば、2人乗りの車があって、運転席と助手席があったとします。
運転席にAさんが座ったときにchangedイベントが発生し、無事座れたとします。次に助手席にBさんが座ったときに、またchangedイベントが発生します。
このときにAさん側の処理でこのchangedイベントは自分のアバターのものではないということをチェックしなければなりません。
また、2人が無事に乗っていたとして、Aさん(Bさんでもいいですが)が先に立った場合もchangedイベントが発生しますが、このときに残されている側は自分が立ったのではないと分からなければなりません。
この辺をきちんと把握していないとパーミッションが無くなったり(助手席の人が運転するような事態になる)、アニメーションが止まってしまったりします。

サンプルではsitting_keyという変数に座っているアバターのキーを保持し、changedイベントでllAvatarOnSitTargetで取得したキーと一緒に判定に使っています。

    sitting_key                 NULL_KEY    NULL_KEY    アバター        アバター
    llAvatarOnSitTarget   NULL_KEY    アバター         NULL_KEY    アバター
    状況                           ありえない       座った           立った            ありえない

----------------------------------------------------
【キーボード入力の判定の仕方】
(キーというとUUIDのキーと混同しそうですが、ここではキーボードのキーという意味で使います)
キー入力で操作に必要なキーはllTakeControlsで指定します(当然、パーミッションが必要です)。
指定したキーが押された場合(押している最中、放した時も)はcontrolイベントが発生します。このイベントの引数としてlevelとedgeがあり、ビット毎にキーの種別を表します。
例えばCONTROL_FWD(↑キーまたはWキー)という定数が用意されていますが、この値は0x01(16進数)です。
ビットで表現すると00000001(2進数)で一番左の桁が↑キー(またはWキー)の情報ですよという意味になります。

// 書き忘れていたので追記(2005.05.30) ここから
特定のビットだけに着目すると、
    level   edge    状態
      0       0       押していない
      1       1       押した時
      1       0       押している最中
      1       0       押している最中
      1       0       押している最中
      1       0       押している最中
      0       1       放したとき
      0       0       押していない
となります。
経験上、押しっぱなしにしているとこのイベントは1秒間に4~7回くらい発生します。
// ここまで

実際に入力されたキーによってllSetVehicleVectorParamでVEHICLE_LINEAR_MOTOR_DIRECTIONとVEHICLE_ANGULAR_MOTOR_DIRECTIONにパラメーターを指定します。
アバター操作と同じ感覚ですと↑↓キーは前後、←→は左右(向きを回転するか、軸を倒すかはパラメーター次第)、Up/Downは上下または平面しか動かない乗り物ならギアとなります。
VEHICLE_LINEAR_MOTOR_DIRECTIONで指定するとベクトルの方向に進み、VEHICLE_ANGULAR_MOTOR_DIRECTIONで指定すると、軸を基準に回転します。

サンプルで実際に設定しているパラメーターを例にすると、

・↑↓キーでそれぞれLINER_FORWARD = < 5.0, 0.0, 0.0>とLINER_BACK = <-3.0, 0.0, 0.0>を設定しています。これは乗り物を基準にして↑キーでX軸方向+5、↓キーでX軸方向-3の力を加えます。

・Upキー、Downキーの場合は、LINER_UP = < 0.0, 0.0, 5.0>とLINER_DOWN = < 0.0, 0.0, -3.0>を設定しています。Z軸方向に5.0(または-3.0)の力を加えます。

・←→の場合は、ROLL_RIGHT = < 0.0, 0.0, -1.0>とROLL_LEFT = < 0.0, 0.0, 1.0>を設定しています。これは乗り物を基準にしてZ軸を軸にして-1.0(または1.0)の回転の力をかけます。感覚としては平面的に回ります。

・Shift+←→の場合は、BANK_RIGHT = <-1.0, 0.0, 0.0>とBANK_LEFT = < 1.0, 0.0, 0.0>を設定しています。この場合はX軸を軸として回転の力をかけますので、感覚としては倒れ込む感じです。

このように各キー入力によってmotor_linearとmotor_angularという変数に値を設定し、最後にllSetVehicleVectorParamでパラメーターを設定しています。



この記事へのトラックバックURL

http://sasapy.slmame.com/t257381