今年のLSLCONが無事終わりました。
振り返ればいろいろ準備不足な点がまだまだ浮かんでしまいますが、それでも、私は今年のLSLCONで自分が担当した作業に、自信を持って合格点をつけたいです。
このようなイベントは、決して誰か一人の人間が努力して運営できるものではありません。
特にLSLCONでは、多くの展示作品の出品に支えられている部分が大きいです。
運営メンバーだけでなく、より多くの人が、「来年もLSLCONがあるといいよね」と考え、行動することで、このイベントが継続していくはずです。
私は、(セカンドライフが続いている限り) LSLCONが続いて欲しいなと強く願っています。
10月になりました。私にとっては「LSL Conventionの月」です(笑
2007年に始まったこのイベントも今年で3回目です。
私は、昨年に続き今年も運営っぽい位置でこのイベントに参加しています。昨年あたりからの強いSL逆風?で、「今年は展示作品の応募は寂しくなるんじゃないかなぁ」などと弱気な予測を立てていたのですが、蓋を開けてみると60作品以上も応募があり、まだまだセカンドライフでスクリプトを書いている人はたくさんいるんだなぁと驚いていたりもします。
さて、そんなLSLCONですが、スクリプターさんから「前に見に行ったけど驚くようなスゴイ作品はなかった」というような声をたまーに耳にすることがあります。展示への出品をお願いしても、そういった理由で参加していただけない方などもいらっしゃるようで、ちょっと残念に思ったりしていました。(私たちの説明がまだまだ至らないという理由もあると思います)
ただ、正直に書きますと、私自身も2007年に第1回LSLCONのただの観客だった頃は、同じような感想を持っていました。
実際のところ、一通り「LSLでできること」が分かってしまうと、スクリプト作品を見て「そんなことができるのか!」と驚くことはほとんどなくなり、「あー、これはあの関数を使ってごにょごにょ」と作り方まで分かってしまうんですよね。そして、「自分にも作れるし、たいしたことないなぁ」という感想ばかりになってしまいがちです。
では何故、私や他の運営スタッフが自分たちの多大な時間を割いてこのイベントを続けているのでしょうか。
LSLではいろいろな事ができるので、展示作品はいくつかのカテゴリーに分かれています。例えば「アミューズメント」だったり「ツール」だったり。そして、特定の分野、例えば「乗り物」に特化したスクリプトばかりを書いている人もいれば、全般的にいろいろやっていたりする人もいたり、アニメーション関連ばかりをやっている人もいたりします。そのようないろいろな人の作品が一堂に会するのがLSL Conventionの展示です。
特定の分野に特化したスクリプトばかりを書いている人には、その分野での何らかのノウハウだったり、こだわりなどがあったりします。また、スクリプトを使うユーザーも様々で、分野によってはユーザーが「使いやすい」「一般的」と捉える機能に差があったりもします。
このような、機能的にただLSLの関数などを組み合わせて機能を実現するという部分以外のノウハウだったり、目線や価値観などを、得ようと思う人にとってはたくさん得られるのがLSL Conventionの展示(およびイベントそのもの)だと私は考えています。
このように書くと、何かを求めているスクリプターにとっては「不親切なイベント」なのかもしれませんね。
でも、「受け身のままでは楽しめない」という点は、Second Life住人なら頷いていただける方が多いんじゃないかと私は思っています。
スクリプトを書いている方なら、是非とも会場に足を運んでいただいて、スクリプター同士で苦労話に花を咲かせたりしてみてはいかがでしょうか?
そんなLSL Convention Japan 2009は、10月10日(土)からです!
お楽しみに!
※「運営に参加するともっと楽しいよ」という話もいつか書きます・・・いつか・・・;;
関連ブログ・リンク:
私は本を読むのが遅い+普段の生活ではあまり本を読まないのですが、たまに電車移動があると、何かしらの本を読みます。(自宅最寄り駅から名古屋駅まで1時間あるので、本を読むには最適なのです)
先日のOSC NagoyaやPHPカンファレンスへの東京遠征の電車移動の時間で、ようやく「アーキテクチャの生態系」を読み終えました。この本の内容は多くのSecond Lifeユーザーには興味深いものだと思います。以下私の感想などをまとめてみます。
■「アーキテクチャ」とは何か
本書のタイトルでも使用されている「アーキテクチャ」という言葉ですが、これは本を読んでいただくのが一番なのですが、例えば以下のような説明がなされています。
ネット上のウェブサービスもまた、情報技術(IT)によって設計・構築された、人々の行動を制御する「アーキテクチャ」とみなすことができます。
(第一章 アーキテクチャの生態系とは? P14)
この説明ではネットサービスに限定した言い方をしていますが、もっと広義に、例えば「飲酒運転を減らすために、飲酒運転の罰金を増やす」というのもアーキテクチャの1つだと書かれています。
つまり、「~してはならない」と言葉だけでルールやマナーをあいまいに伝えるのではなく、「~しなければ××というペナルティがある」という、より厳密でシステマティックな方法を採用して人間の行動を制御している仕組みをアーキテクチャと呼んでいるようです。
■アーキテクチャの視点でサービスを比較
本書の面白いところは、こういった「アーキテクチャ」という視点でいくつかのサービスを比較している点でしょう。例えば以下のようなサービス(システムおよび現象)がアーキテクチャという視点で細かく分析されています。
ニコニコ動画をやや持ち上げすぎな印象もありますが、それを差し引いても、この「アーキテクチャ」という視点での分析はとても興味深いです。(2ちゃんねるやニコニコ動画が良くできている、と改めて思わされます)
■感想
昨今では、セカンドライフがマーケティングや経済関係のブログなどに取り上げられる際には、必ずと言っていいほど「過疎」「人がいない」といったキーワードとともに語られます。閑散としている(人口密度が低い)ことの善し悪しそのものについてはここでは論じませんが、本書の分析では、セカンドライフのような仮想世界サービスは「閑散としてしまうアーキテクチャ」であると分析されており、そのようになってしまう(見えてしまう)のは必然ということになっています。
この点は、セカンドライフである程度「生活」したユーザー(住人と呼びましょう)なら、以下のような反論をしたくなると思います。
たしかにその通りなのですが、これらはほとんどが「セカンドライフの外側」のサービスであって、セカンドライフそのものの仕組みではないんですよね。もちろん、セカンドライフにも検索の機能が内蔵されていて、それを使ってお店や人気の場所、グループなどを探すことはできます。ですが、(全体としては)これらの機能はあまり上手く活用されていないと私は考えています。
また、この検索機能が今の延長線上で強化(例えば日本語が*普通に*使える、など)されたとしても、やはり「ユーザーが能動的に探す」ことをしなければならない点は変わりませんよね。
「ではどうなっていればよいのか」というところまでは、具体的にイメージするのは難しいのですが、例えばFriendFeedで「友達がコメントした(自分の購読者じゃない人の)エントリが見える」というようなアーキテクチャにヒントがあるんじゃないかと私は考えています。
そのような「人と人とのつながりを支援する仕組み」だったり、「人の活動の見える化(作ったモノそのものという以外で)」などが「アーキテクチャ」として組み込まれたサービスが、次の世代のメタバースなんじゃないかなと私は想像しています。
※こういった追加機能や仕組みをサードパーティがアレコレできるというのがSecond Lifeの(そしてTwitterの)良い点なのでしょうけど、サードパーティ製のものはそのままでは「アーキテクチャ」にはなれないんですよね。サービスの全ユーザーがそれを使っているという状態にならない限り。
「次の世代のアーキテクチャ」を持つ仮想世界にセカンドライフが進化するのか、それとも他のサービスが出てくるのか、またはセカンドライフが今のアーキテクチャのまま広く受け入れられるようになるのか、結論が出るには数年かかりそうですね。
書評リンク:
セカンドライフのメイングリッドのサーバー(SIM)のバージョンアップが今月行われて、1.27になりますが、このバージョンアップにはLSL関連で久々に大きな機能追加が行われています。それが「HTTP-IN」と呼ばれている機能です。
HTTP-INは何か?というのを端的に説明すると、「これまでのXML-RPCをHTTPでできるようにした」ものです。
具体的には、以下のようなことができるようになります。
HTTP-INで割り当てられるURLは、例えば以下のようなものです。
このURLの「sim3893」という部分は、リージョンのホストに対応しています。つまり、SIMが変わればURLも変わります。
実際には、URLのハンドリングがちょっと難しいので、そこを理解しておかないと利用するのが難しそうです。以下に、URLが無効になってしまう例を挙げます。
このように、URLが頻繁に変わってしまいます。
以下、HTTP-IN関連で追加された関数・イベント・定数の一覧です。
現在はまだNew Script SIMはバージョンアップされていないようなので、今日のスクリプターの会ではどこかバージョンアップされているSIMに移動して、HTTP-INをアレコレ試してみたいですね。
関連リンク:
さて、ドアシリーズもこのエントリで多分最後ですが、先のエントリのドアを「滑らかに(ゆっくり)開閉する」バージョンを作成してみました。
どういった動きなのかは、以下のムービーをご確認ください。
スクリプトは、以下のようになっています。タイマーによるドアの動き制御が追加されています。また、それに合わせてステート分割も行いました。
///////////////////////////////////////////////////////////////////// // ドアのサンプルスクリプト(door3.lsl) // タッチしたアバターの位置によって開く向きが変わる // 滑らか開閉バージョン // Released into the public domain by Hidenori Glushenko ///////////////////////////////////////////////////////////////////// // 初めに「door_init.lsl」スクリプトでプリムを変形させておいてください。 ///////////////////////////////////////////////////////////////////// rotation DOOR_ROT_ORG; // ドアの基準回転 float DOOR_DIV_EULER = 150.0; // ドアの開閉角度 float DOOR_OPEN_SEC = 10.0; // ドアが開いている時間(秒) float DOOR_MOVE_TARGET; integer TIMER_COUNT; integer TIMER_MAX = 40; // ドアの開閉速度 // 大きいとゆっくり default { state_entry() { llSetBuoyancy(1.0); llMinEventDelay( 0.01 ); llSetStatus(STATUS_PHANTOM, FALSE); llSetStatus(STATUS_BLOCK_GRAB, TRUE); state DoorClose; } } state DoorClose { touch_start(integer total_number) { DOOR_ROT_ORG = llGetRot(); // タッチしたアバターの位置関係を調べる vector av_offset = (llDetectedPos(0)-llGetPos())/DOOR_ROT_ORG; float av_offset_z = av_offset.z; // 位置関係に応じた回転を計算 DOOR_MOVE_TARGET = (av_offset_z/llFabs(av_offset_z)) *DOOR_DIV_EULER; state DoorOpen; } } state DoorOpen { state_entry() { TIMER_COUNT = 0; llSetTimerEvent(0.05); llSetStatus(STATUS_PHANTOM, TRUE); } touch_start(integer total_number) { // タッチされたらタイマー間隔を戻す llSetTimerEvent(0.05); } timer() { rotation rot; integer count = ++TIMER_COUNT; // 閉まる時用の変数補正 if (TIMER_COUNT > TIMER_MAX) { count = 2*TIMER_MAX - count; } // 閉まり始めた時の処理 if (TIMER_COUNT == TIMER_MAX + 1) { llSetStatus(STATUS_PHANTOM, TRUE); llSetTimerEvent(0.05); } // 現在のカウンタ変数から、角度を求める float x = PI_BY_TWO*count/(float)TIMER_MAX; float new_rot_euler = DOOR_MOVE_TARGET * llPow(llSin(x), 2.0); llRotLookAt(rot = (llEuler2Rot(<0.0,new_rot_euler,0.0> *DEG_TO_RAD))*DOOR_ROT_ORG,1.0,1.0); // 開ききったら止める if (TIMER_COUNT == TIMER_MAX) { // タイマー間隔を切り替える llSetTimerEvent(DOOR_OPEN_SEC); llSleep(0.2); llSetStatus(STATUS_PHANTOM, FALSE); llSetStatus(STATUS_PHYSICS, TRUE); // 角度反映処理 llSetStatus(STATUS_PHYSICS, FALSE); // 角度反映処理 llSetRot(rot); // 閉まったら状態を変更してステート遷移 } else if (TIMER_COUNT >= (TIMER_MAX*2)) { llSleep(0.2); llSetStatus(STATUS_PHYSICS, TRUE); // 角度反映処理 llSetStatus(STATUS_PHYSICS, FALSE); // 角度反映処理 llSetRot(DOOR_ROT_ORG); state DoorClose; } } state_exit() { llSetStatus(STATUS_PHANTOM, FALSE); llSetTimerEvent(0.0); } }
ドアの開閉の動きは、llRotLookAt関数を使用しています。
この関数を使用すると、オブジェクトを(ディレイなく)回転させることができます。(回転がllTargetOmegaと同じようにビューア側での処理になるため)
ただし、これまたllTargetOmegaと同じように、サーバー上でオブジェクトが回転しているわけではないため、開いた状態をシミュレータ側に反映させる処理が必要になります。
また、現在はドアの動きをsinの2乗(llPow(llSin(x), 2.0) (xは0~π/2)という計算式を使っていますが、ここを変更すると、開く動きを変えられます。
タイマーでドアの角度を処理していく部分は、いろいろな書き方が考えられる部分で、もっとうまいやり方がありそうです。「こうするのがいい」というのがあれば、是非教えてください!
関連エントリ(ドアシリーズ):
