掲載日時: 2008-02-14 08:00

Second Life 新世界的ものづくりのススメ--その37:エンジン6

いよいよ、エンジンスクリプトも今回で最後。つまり、第20回から続いたバイクスクリプトの説明がこれで終了する。今回は、バイクに乗ることで実行されるアニメーションやキーボード操作による動作について、指定方法を解説する。

著者 : 大槻透世二(サイバーアドベンチャー)

URL : https://japan.zdnet.com/article/20367167/

(前回よりつづく)

「ほら、見て」
入場をすませ、ゲートを通った俺たちは、噴水広場に出た。
さくらに促され見た光景は、いきなりの行列、行列、行列。

そしてそこには見慣れたキャラクターがいた。

プーさんと写真を撮ろう、そしてミッキーと写真を撮ろう。

そんな記念写真を求めて親子連れ、そしてカップル達は並んでいた。
「一緒に撮ってみよっか」

思いがけないさくらの言葉に俺は嬉しいのか、嬉しくないのか、
複雑な感情を抱いたまま列へと並んだ。
あぁ、大好物のラーメン屋の行列だってあまり並んだことがないのに。。。そんなため息をよそに普段見せない笑顔で待つさくらを、 俺は横で見ていた。

……続きは、ブログ『「Second Love Story」〜あの頃の僕たちに〜』へ。

前回の復習

 前回は、エンジンスクリプトを構成する次の4イベントのうち、2の「changed()」イベントを見ることによって「if〜else」構文を勉強した。「if〜else」構文は、「if (A) B else C」という形式で「Aという状態が発生した場合はB、その他の場合はC」という意味になる。ここでは、Aという状態の場合とその他の場合を足すと100%となる。

  1. 「state_entry ()」イベント
  2. 「changed ()」イベント
  3. 「run_time_permissions ()」イベント
  4. 「control ()」イベント

 「if〜else」構文を使うことで、エージェント(アバター)がバイクに乗ってきたときに、その存在判定やオーナー判別を実行させた。また、「llSeStatus」によって物理モードをONにしたり、関数「llRequestPermissions」によってアニメーションをONにしたりもした。

 「changed()」イベントのソースコードを下図で復習してみよう。

「changed()」イベント ※クリックすると図全体が見られます

 さらに、「if〜else」構文の概念図は下図のようになっていた。

「changed()」イベント構成図 ※クリックすると図全体が見られます

 さて、今回は、残りの3の「run_time_permissions ()」イベントと4の「control ()」イベントを見ることにしよう。

3.「run_time_permissions ()」イベント

 「run_time_permissions ()」イベントは下図のようになっている。

「run_time_permissions ()」イベント

 このイベントは、日本語版LSL Wikiによれば、「『agent(バイクに乗ってきたアバター)』に対し『llRequestPermissions』を利用してパーミッションのリクエストをした場合に呼ばれる」と定義されている。さらに詳細をLSL Wikiで見てみると下図のようになっている。

「run_time_permissions ()」 ※クリックすると図全体が見られます

 上図のように、「(integer perm)」部分には赤枠内にある「PERMISSION_TRIGGER_ANIMATION」や「PERMISSION_TAKE_CONTROLS」が入るのだが、この2つの定数は入力しなくても自動的に有効になるようだ。つまり、アニメーションやコントロールを有効にしたいときには、下図のような構文を書き、「run_time_permissions()」イベント内の「////」部分に実行文を入れるだけでよい。

「run_time_permissions()」イベント構文

許可をもらい、与える「llRequestPermissions」

 つまり、「run_time_permissions ()」イベントは、前項で述べたその定義から、関数「llRequestPermissions」の後に呼び出されて実行される。そして、このイベント内で何を実行するのかというと、「llStartAnimation()」と「llTakeControls()」が実行されることになる。

 しかし、それには条件がある。その際に前のイベントである「changed ()」イベント内の「PERMISSION_TRIGGER_ANIMATION」と「PERMISSION_TAKE_CONTROLS」が実行されることによって、下図のように「llStartAnimation()」と「llTakeControls()」が使用可能になる(「llRequestPermissions」「PERMISSION_TRIGGER_ANIMATION」「PERMISSION_TAKE_CONTROLS」については第36回を参照)。

※クリックすると図全体が見られます

「組み込み」(ビルトイン)アニメーション

「llStartAnimation()」

 さて、最初に「llStartAnimation()」という関数を見ようと思う。いつものように、LSL Portalを参照しよう。

「llStartAnimation()」 ※クリックすると図全体が見られます

 上図の「(string anim)」部分に現在、「("motorcycle_sit")」が入っている。ここにはデータとしてストリング型、つまり、文字列が入るので、形式としては問題ない。しかし、実は、「anim」は「an item in inventory(インベントリー内アイテム)」と定義されている(上図赤枠内)。つまり、プリム内のインベントリーに入っているアイテムを参照するよう決められている。

 しかし、実際には下図左のように、このプリム内のインベントリーである「コンテンツ」には現在、スクリプトファイルしか入っていない。本来であれば、下図右のようにアニメーションファイルを「プリム内コンテンツフォルダ」に入れる必要がある。

「プリム内コンテンツフォルダ」

 実は、このアニメーションは、「組み込み」(ビルトイン)されているために、わざわざ「プリム内コンテンツフォルダ」内に入れる必要がないのである(「組み込み」の意味については第23回を参照)。

 このようにユーザーがわざわざ作って入れておかなくてもいいよう、Linden Lab側でアニメーションまで用意してくれているのだ。LSL Portalを参照すると、下図のように、多くのアニメーションが既に組み込まれているのがわかる。

「組み込み」アニメーション ※クリックすると図全体が見られます

キーボード、マウス操作は「llTakeCotrols」

 次に「llTakeControls()」だが、こちらはキーボードとマウス操作によって、バイク全体を動かす役割を持つ。

「llTakeControls()」

 「llTakeControls()」の定義については、情報が豊富な日本語版LSL Wikiを参照しよう。下図の赤枠部分が上図のソースコードで指定されている。これにより、例えば「CNTROL_FWD」を指定することで、前進操作がキーボードのWキーで可能になる。

「llTakeCotrols」 ※クリックすると図全体が見られます

 さらに、「llTakeControls()」の定義にある「integer acceptl, integer pass_on」については下図に記載されているが、通常のキーボード操作であれば赤枠内の設定で問題がない。

acceptlとinteger pass_on ※クリックすると図全体が見られます

4.「control ()」イベント

 「control ()」イベントは下図のようになっている。

「control ()」イベント

 この「control ()」イベントはキーボードのキーが押されるたびに実行されるが、それぞれの実行内容が場合分けされて示されている。LSL Wikiによれば、このイベントの内容は下図のようになり、バイクの挙動をキー操作によってどうコントロールするかが定義されている。

「control ()」イベント ※クリックすると図全体が見られます

 今回のソースコードでは、「integer held」部分が「integer level」となっている。これにより、キーが押されているか、押されていないかをチェックしている。押されている場合には、下図のように処理が実行される。

キーが押されている場合の処理 ※クリックすると図全体が見られます

 前進および後退の場合、「VEHICLE_LINEAR_MOTOR_DIRECTION」という直線速度が、前進は200の速度、後退は-10の速度で実行される。

 ここで、このソースコードの最後の処理を見て欲しい。「angular_motor」は、「control ()」イベントが始まってすぐにベクター型データとして定義された変数だが、結局、この「llSetVehicleVectorParam()」内にある「VEHICLE_ANGULAR_MOTOR_DIRECTION」を実行する際のデータを示している。

「llSetVehicleVectorParam()」

ベクター型データ

 ベクター型のデータとはで表せるようなデータであり、例えば、空間座標や色(RGB)等で使われる。

vector angular_motor = <100,10,0>

と定義した式は、実は次のようにも表すことができる。

vector angular_motor ;
angular_motor.x = 100
angular_motor.y = 10
angular_motor.z = 0

 ここではこのベクターデータの式をこのようにX、Y、Z要素に分解している。少しとまどったかもしれないが、ベクターデータの特徴として覚えておこう。

自己代入演算子

 さらにもう1つ見慣れない表現がある。「angular_motor.x += 100」の「+=」だ。

 この見慣れない記号は「演算子」といい、プログラム内の演算をする記号だ。これは日本語版LSL Wikiによれば、自己代入演算子といい、右辺を左辺へ代入するものだ。

 さらにLSL Wikiの別の説明によれば、

x = x + 100

という式は、

x += 100

へと置き換えることができる。

 つまり、xは処理のたびに100ずつ増えていくことになる。

 今回の場合、例えば、「angular_motor.x += 100;」なら、「angular_motorのx要素がボタンを押すたびに増えていく」というようになる。

 これでバイクは終わりだ。シーズン2も今回で終了となる。エンジンスクリプトだけでも6回に渡って、イベントごとに分解して解説してきたが、難しかっただろうか。これをおおよそ理解できれば、少しだけLSLに慣れてきた証拠だ。

 「イベント」や「ステート」、「関数」や「組み込み」の概念、さらには「演算子」や「if〜elseによる条件と場合分け」などいろんな要素が詰まっているのでぜひ、がんばって欲しい。

 次回からはLSLを離れて、「ジェスチャー」と「アニメーション」の作り方へ入ろう。新たなる展開だ。それでは、次回もお楽しみに

(編集部からのお知らせ:2007年2月15日より連載が始まった「Second Life 新世界的ものづくりのススメ」は、次回からブログとして再登場します。ブログの開始は2月28日を予定しています。お楽しみに)

大槻透世二氏
大槻透世二サイバーアドベンチャー(株)
代表取締役社長/CEO

デジタルハリウッド大学院
次世代インターフェース研究室 研究員
Second Life研究室 研究員/プロデューサー
Linden社推薦 Second Lifeセミナー講師

東北大学心理学専攻卒業。1年間のLA留学を経て、ソリッドレイ研究所でバーチャルリアリティのシステムインテグレーション、立体映像システム構築、HMDシステム構築などを経験。IT系コンサルティング会社を経て、デジタルハリウッド大学大学院コンテンツマネジメント修士課程修了(MCA)。その後、Linden Lab本社にてSecond Lifeカリキュラムのトレーニングを受ける。現在デジタルハリウッドにて「Second Life」セミナーを開催。また、バーチャルリアリティ、メタバース関連のシステム開発/プロデュースを行うサイバーアドベンチャー(株)を設立し、そのCEO職に就いている。

ZDNET Japanは、Ziff Davisからのライセンスに基づき株式会社4Xが運営しています。
ZDNET Japan is operated by 4X Corp under license from Ziff Davis.

Copyright © 2026 4X Corp, Inc. All rights reserved. No reproduction or republication without written permission.