1週間前に GION で行われた GION FINAL LIVE 「祇園終宴花霞」 のビデオをつくりました~。
サミーさんのブログにはすでに数名の方のビデオが紹介されていますね。
最初、「洛陽」を使おうと思ったのですが他の方が結構使われていたので GIONISM で作ってみました。
霞、夢 といったイメージで、なんか、夢だったかなぁ、、と思うようなビデオにしてみようといろいろやってみました。
Live ステージのグロウの使い方が素敵だったので、それを活かせれば、、、とちょっとチャレンジもしてみました。
いままで Windows Movie Maker でしたが、はじめて Ulead Video Studio を使ったので、、、まだよく使い方を把握してません(笑
ただ、さすが有料ソフト、エフェクトとかはたくさんあって迷うくらいです。
お楽しみください~。
2008年11月30日日曜日
2008年11月29日土曜日
雷神のド派手ナイト & アンリアル -レンダリング コスト-
club 雷神の「ド派手ダンスナイト」、、、私には無理・・・でした(笑
カメラワークできません^^
で、ちょっとアバターのレンダリング コストをみてみたら。。。
一番軽かったのは kenji さんで 500... うーん、kenji さん 200 人分w
こんなことやってたら落ちました・・・
だって、フロアまともにみられない^^
前はもっとサクサク動いていたような気がするんですけど。。。
CPU メーターが振り切っているので、、、これ以上は改善見込めない模様です。
速いパソコン欲しい~。
レンダリング コストについてはこちらを参照してください~。
Linden Official Blog のレンダリング コストの紹介(英語)
wiki.secondlife.com でのレンダリング コストの説明(英語)
レンダリング コストを表示するには、Advanced メニューから [Rendering] - [Info Displays] で [Avatar Rendering Cost] をクリックで、アバターの頭の上にレンダリング コストが表示されます。
簡単にいうと「重い」部類に入ると赤い数字で表示されます。
という私も 2091 で赤数字でしたがw
ま、、ド派手ナイトなのでw
カメラワークできません^^
で、ちょっとアバターのレンダリング コストをみてみたら。。。
一番軽かったのは kenji さんで 500... うーん、kenji さん 200 人分w
こんなことやってたら落ちました・・・
だって、フロアまともにみられない^^
前はもっとサクサク動いていたような気がするんですけど。。。
CPU メーターが振り切っているので、、、これ以上は改善見込めない模様です。
速いパソコン欲しい~。
レンダリング コストについてはこちらを参照してください~。
Linden Official Blog のレンダリング コストの紹介(英語)
wiki.secondlife.com でのレンダリング コストの説明(英語)
レンダリング コストを表示するには、Advanced メニューから [Rendering] - [Info Displays] で [Avatar Rendering Cost] をクリックで、アバターの頭の上にレンダリング コストが表示されます。
簡単にいうと「重い」部類に入ると赤い数字で表示されます。
という私も 2091 で赤数字でしたがw
ま、、ド派手ナイトなのでw
2008年11月28日金曜日
GO! の練習~
この前の GION FINAL の Yaz さんのライブ(サミーさんとこにリンク)でも「皆さ~ん、Go! の練習しましたか~」なんて、Yaz さんが言ってましたが、Yaz さんの supernovasupersonic (通称スパスパ:スーパーノバ スーパーソニック)のナンバーで、みんなで一斉に「GOOOOOO!!!!!!」っていう部分があるんです。はいw
私が前につくった Steam Glider のビデオでもスパスパを使わせていただきましたが、、、なんといってもビデオ編集ソフトは Windows 付属のムービーメーカー(^ ^;, ですし、使っているパソコンはノート PC だし、あ、あと、、、まだまだこの動画編集・構成・撮影のやり方なんて自己流で勉強中なので、、、(センスが無理かも、、、ね、、、と落ち込む日々も多々、、、でも、SL がくれた楽しい趣味です) うまく、GOOOOO!!!!! の部分の効果が出せなかったんですよね。。。
いあ、LINちゃん、ほんとすごいわ。
あんなにアバターが画面の中にいて、パーティクルがたくさんでたら、、、私の PC 確実に 3FPS で止まります。(笑
LIN ちゃんから 3D マウスを教えてもらって使っていますが、やっぱりこういう撮影には必須ですね~。
(軽量化された新しい 3D マウス、、、でてたんですね!)
と、、、いっても、私の場合は人数が多かったりすると「カ、、カックン!」になるので、、、(だからソロのダンスのシーンが多いという話も、、、あるんです、、、ナル度が高いせいではありませ・・ん?)
今日の雷神のテーマは「ド派手ダンスナイト」ということらしいので、、、、って、派手なのあまりない、、、この前の Yaz さんの Live のときも、とあるお友達に「ずいぶん、地味な色の着物ドレスにしたね・・・・」と言われ。うーん(^^;
Yaz さんのスパスパの GO!!!! の練習はこの LIN ちゃんのビデオでどうぞ~(笑
ちなみに、雷神のダンスマシーンは私作成の MLDU です~。(宣伝になっちゃって、すみません・・・)注:ダンスアニメは別ですよ^^;
お試し版とかも OEDO City の Studio4D さんにおいてます。日本語版、英語版両方用意してみました。
で、このビデオ、、、自分の PC / ビューワーで見るより、ちゃんと大人数でシンクロしてる。。。(泣 ><
私が前につくった Steam Glider のビデオでもスパスパを使わせていただきましたが、、、なんといってもビデオ編集ソフトは Windows 付属のムービーメーカー(^ ^;, ですし、使っているパソコンはノート PC だし、あ、あと、、、まだまだこの動画編集・構成・撮影のやり方なんて自己流で勉強中なので、、、(センスが無理かも、、、ね、、、と落ち込む日々も多々、、、でも、SL がくれた楽しい趣味です) うまく、GOOOOO!!!!! の部分の効果が出せなかったんですよね。。。
いあ、LINちゃん、ほんとすごいわ。
あんなにアバターが画面の中にいて、パーティクルがたくさんでたら、、、私の PC 確実に 3FPS で止まります。(笑
LIN ちゃんから 3D マウスを教えてもらって使っていますが、やっぱりこういう撮影には必須ですね~。
(軽量化された新しい 3D マウス、、、でてたんですね!)
と、、、いっても、私の場合は人数が多かったりすると「カ、、カックン!」になるので、、、(だからソロのダンスのシーンが多いという話も、、、あるんです、、、ナル度が高いせいではありませ・・ん?)
今日の雷神のテーマは「ド派手ダンスナイト」ということらしいので、、、、って、派手なのあまりない、、、この前の Yaz さんの Live のときも、とあるお友達に「ずいぶん、地味な色の着物ドレスにしたね・・・・」と言われ。うーん(^^;
Yaz さんのスパスパの GO!!!! の練習はこの LIN ちゃんのビデオでどうぞ~(笑
ちなみに、雷神のダンスマシーンは私作成の MLDU です~。(宣伝になっちゃって、すみません・・・)注:ダンスアニメは別ですよ^^;
お試し版とかも OEDO City の Studio4D さんにおいてます。日本語版、英語版両方用意してみました。
で、このビデオ、、、自分の PC / ビューワーで見るより、ちゃんと大人数でシンクロしてる。。。(泣 ><
2008年11月25日火曜日
位置と回転を理解したい その3
「その2」からのつづきで、、、これが「ネジ」です(笑
このネジに座ることで Sit の Animation をストップし、ネジ自身を透明にして、ダンスを踊る位置決めをしたかったのです。
前回プリムの正面のお話しを書きましたが、このネジの先端が「正面」になります。
正面の向きは常に西をみているわけではありません。クラブやステージなどによっては当然違います。
このネジを整列させながら Rez して、、、というのもスクリプトでやるのですが、Rez された複数のネジをたとえば 45度時計まわりに回転させたいとか、180度逆向きにさせたい、というのをプリムの編集からまわすのではなく、ダイアログのボタンで簡単にどんどん行いたい、と思ったわけです。
いつものごとく、「そんなの知ってるよ~」の人はスルーしてください(笑
クォータニオンは右からなのか左からなのかそれがポイント
rotation (ローテーション)型のクォータニオンについては「そんなもの~でとりあえず理解しましょう」と前回ご紹介しましたが、クォータニオンがすごい!と思ったのは、このシリーズ(?)で何度もでてくる「グローバル座標軸」(東西、南北、天地)と「ローカル座標軸」(前後、左右、上下)の双方を簡単に扱えることでした。
回転(というより「向き・方向」ですね)を指定する方法も、位置を指定するとき同様にグローバル座標をもとに向きを設定するのか、ローカル座標をもとに向きを設定するのかを考慮しなくてはなりません、、、といっても私も最初はピンとこなかった。。。(笑
まずは「軸を中心とした回転」を考えてみます。
これはプリムの [編集] の [回転] の数字をいじるのと同じことです。
このとき回転する方向はセカンドライフは右手座標系なので「右手の法則」(右ねじの法則)を使います。詳しいことは多くの方が記事にされているのでそちらを参考にしてもらって、、、、これも、見る方向で「時計まわり」なのか「反時計まわり」なのか変わるので注意が必要です。回転させる軸のグローバル座標軸の矢印と同じ方向をみて「時計まわり」になります。
これ、、、混乱するんですよね~
天地の軸である Z 軸を例にとると、おおよそプリムを Rez すると図のような状態で回転を試すことになります。
Z 軸を使って45度 [編集] - [回転] で回してみると、、、反時計まわりにまわっているようにみえますよね。
この図をよくみてみると天地の軸である Z 軸は上の方に向かって矢印があります。上記で赤で「回転させる軸のグローバル座標軸の矢印と同じ方向を見る、、、」としたのは、、、つまり、この図の場合は地中からプリムを見上げて時計まわり、ということになるからです。
これは慣れていくしかありませんね。
Z 軸で 45度回したいをベクトルで書こうとすると <0.0, 0.0, 45.0> と書きたくなりますし、[編集] - [回転] でも 45.0 という数値を使いますが、スクリプトではこの角度をラジアンというものにしないと使えません。このあたりの Degree(度) と Radian(ラジアン) の説明もいろいろなところに詳しくあるのでそちらを参照してもらうことにして、LSL で 度からラジアンに変更する方法があるのでそれだけを覚えてしまいます。
<0.0, 0.0, 45.0> * DEG_TO_RAD
これで Z軸45度がラジアンの形にかわります。ラジアンから度に変更するには RAD_TO_DEG という定数をかけてあげればいいのです。
ただ、これだけでは済まないのが回転の難しいところです。
現在の回転(向き)を表す rotation 型の値は llGetRot() でとることができました。
この現在の向きに Z軸を中心とし45度まわった後の「向き」の値を、今度は向きを設定する関数の llSetRot に渡せばよい、、、ということになりますね。
そのため llEuler2Rot という関数を使って <0.0, 0.0, 45.0> のベクトル型の値をラジアンにしてから <x, y, x, s> のローテーション型に変換してあげます。
rotation q = llEuler2Rot(<0.0, 0.0, 45.0>*DEG_TO_RAD);
これで返された q というローテーション型の値を現在の位置に、、、、積算します。加算するのではなくてかけるのです。
rotation newRot = llGetRot()*q;
この newRot は現在の向きからグローバル座標軸の z を中心に 45度 まわしたあとの向きになります。よって、
llSetRot(newRot);
で、向きを変更できました。
クォータニオンがすごいのは、、、上記の例はグローバル座標軸もローカル座標軸も重なっている場合ですが、たとえば図のように傾いていた場合で、プリムの上下軸(つまり傾いているローカル座標軸)を中心に同じく45度まわしたい場合は、
rotation newRot = q * llGetRot();
と、今度は q を左からかけてあげるだけでローカル座標軸を中心とした回転後の向きを算出できるからです。
余談ですが、このローカル座標の前後、左右、上下の軸をピッチ (picth)、ロール (roll) 、ヨー (yaw) と呼ぶそうです。(注1)
クォータニオンすごすぎ・・・(笑
ちなみに、、回転する量を <30.0, 45,0, 20,0> と指定した場合、X, Y, Z の順番ではなく、Z軸で20度、Y軸で45度、X軸で30度という順番で回転した結果を表すことに注意です。位置の指定と違って回転の場合はこの順番で結果の向きが変わります。
これで「ネジ」の場合はおおよそやりたいことができるようになったのですが、、、今度は「向きを指定する」といっても角度がわからないときもあるわけ、、、ですよね。
たとえば、近くのアバターの方向を向くとか、太陽の方向を向くとか、、そういう指定もありえます。
だんだん、ネジから離れていくのですが(笑 木漏れ日、太陽光、月光を表現しているプリムも何度も見たことがあるのでちょっと調べようと思ったのですが、、、これがまた(笑
つづく・・・
追記(注1)
誤解がありそうな表現なので、、、ピッチ(前後)の角度、つまり飛行機に乗った状態を想像して、上方に向かったり、下方に向かったりするのは「ピッチ角」を変える、というようですが、軸中心で考えると、ローカル座標軸のY軸をまわしています。同じようにロール(左右)は X 軸を回転させて角度を変えることで右に傾いたり、左に傾いたりします。ピッチの軸が前後のX軸ではないんですよね。
このネジに座ることで Sit の Animation をストップし、ネジ自身を透明にして、ダンスを踊る位置決めをしたかったのです。
前回プリムの正面のお話しを書きましたが、このネジの先端が「正面」になります。
正面の向きは常に西をみているわけではありません。クラブやステージなどによっては当然違います。
このネジを整列させながら Rez して、、、というのもスクリプトでやるのですが、Rez された複数のネジをたとえば 45度時計まわりに回転させたいとか、180度逆向きにさせたい、というのをプリムの編集からまわすのではなく、ダイアログのボタンで簡単にどんどん行いたい、と思ったわけです。
いつものごとく、「そんなの知ってるよ~」の人はスルーしてください(笑
クォータニオンは右からなのか左からなのかそれがポイント
rotation (ローテーション)型のクォータニオンについては「そんなもの~でとりあえず理解しましょう」と前回ご紹介しましたが、クォータニオンがすごい!と思ったのは、このシリーズ(?)で何度もでてくる「グローバル座標軸」(東西、南北、天地)と「ローカル座標軸」(前後、左右、上下)の双方を簡単に扱えることでした。
回転(というより「向き・方向」ですね)を指定する方法も、位置を指定するとき同様にグローバル座標をもとに向きを設定するのか、ローカル座標をもとに向きを設定するのかを考慮しなくてはなりません、、、といっても私も最初はピンとこなかった。。。(笑
まずは「軸を中心とした回転」を考えてみます。
これはプリムの [編集] の [回転] の数字をいじるのと同じことです。
このとき回転する方向はセカンドライフは右手座標系なので「右手の法則」(右ねじの法則)を使います。詳しいことは多くの方が記事にされているのでそちらを参考にしてもらって、、、、これも、見る方向で「時計まわり」なのか「反時計まわり」なのか変わるので注意が必要です。回転させる軸のグローバル座標軸の矢印と同じ方向をみて「時計まわり」になります。
これ、、、混乱するんですよね~
天地の軸である Z 軸を例にとると、おおよそプリムを Rez すると図のような状態で回転を試すことになります。
Z 軸を使って45度 [編集] - [回転] で回してみると、、、反時計まわりにまわっているようにみえますよね。
この図をよくみてみると天地の軸である Z 軸は上の方に向かって矢印があります。上記で赤で「回転させる軸のグローバル座標軸の矢印と同じ方向を見る、、、」としたのは、、、つまり、この図の場合は地中からプリムを見上げて時計まわり、ということになるからです。
これは慣れていくしかありませんね。
Z 軸で 45度回したいをベクトルで書こうとすると <0.0, 0.0, 45.0> と書きたくなりますし、[編集] - [回転] でも 45.0 という数値を使いますが、スクリプトではこの角度をラジアンというものにしないと使えません。このあたりの Degree(度) と Radian(ラジアン) の説明もいろいろなところに詳しくあるのでそちらを参照してもらうことにして、LSL で 度からラジアンに変更する方法があるのでそれだけを覚えてしまいます。
<0.0, 0.0, 45.0> * DEG_TO_RAD
これで Z軸45度がラジアンの形にかわります。ラジアンから度に変更するには RAD_TO_DEG という定数をかけてあげればいいのです。
ただ、これだけでは済まないのが回転の難しいところです。
現在の回転(向き)を表す rotation 型の値は llGetRot() でとることができました。
この現在の向きに Z軸を中心とし45度まわった後の「向き」の値を、今度は向きを設定する関数の llSetRot に渡せばよい、、、ということになりますね。
そのため llEuler2Rot という関数を使って <0.0, 0.0, 45.0> のベクトル型の値をラジアンにしてから <x, y, x, s> のローテーション型に変換してあげます。
rotation q = llEuler2Rot(<0.0, 0.0, 45.0>*DEG_TO_RAD);
これで返された q というローテーション型の値を現在の位置に、、、、積算します。加算するのではなくてかけるのです。
rotation newRot = llGetRot()*q;
この newRot は現在の向きからグローバル座標軸の z を中心に 45度 まわしたあとの向きになります。よって、
llSetRot(newRot);
で、向きを変更できました。
クォータニオンがすごいのは、、、上記の例はグローバル座標軸もローカル座標軸も重なっている場合ですが、たとえば図のように傾いていた場合で、プリムの上下軸(つまり傾いているローカル座標軸)を中心に同じく45度まわしたい場合は、
rotation newRot = q * llGetRot();
と、今度は q を左からかけてあげるだけでローカル座標軸を中心とした回転後の向きを算出できるからです。
余談ですが、このローカル座標の前後、左右、上下の軸をピッチ (picth)、ロール (roll) 、ヨー (yaw) と呼ぶそうです。(注1)
クォータニオンすごすぎ・・・(笑
ちなみに、、回転する量を <30.0, 45,0, 20,0> と指定した場合、X, Y, Z の順番ではなく、Z軸で20度、Y軸で45度、X軸で30度という順番で回転した結果を表すことに注意です。位置の指定と違って回転の場合はこの順番で結果の向きが変わります。
これで「ネジ」の場合はおおよそやりたいことができるようになったのですが、、、今度は「向きを指定する」といっても角度がわからないときもあるわけ、、、ですよね。
たとえば、近くのアバターの方向を向くとか、太陽の方向を向くとか、、そういう指定もありえます。
だんだん、ネジから離れていくのですが(笑 木漏れ日、太陽光、月光を表現しているプリムも何度も見たことがあるのでちょっと調べようと思ったのですが、、、これがまた(笑
つづく・・・
追記(注1)
誤解がありそうな表現なので、、、ピッチ(前後)の角度、つまり飛行機に乗った状態を想像して、上方に向かったり、下方に向かったりするのは「ピッチ角」を変える、というようですが、軸中心で考えると、ローカル座標軸のY軸をまわしています。同じようにロール(左右)は X 軸を回転させて角度を変えることで右に傾いたり、左に傾いたりします。ピッチの軸が前後のX軸ではないんですよね。
2008年11月22日土曜日
明るすぎるアバターが傍にいたら・・・
本日、GION FINAL イベントとして Yaz Rockett ライブが行われます。
祇園プロデューサーのさみーさんのブログにも書かれていますが、3つのお願いがあります。
・光源(フェースライトなど)使用禁止
・ド派手なパーティク使用禁止
・HUD(スクリプト類)使用禁止
特に、、、時々ものすごく明るいフェースライトをつけているアバターがいますよね。。。(それも、、、1つじゃなくて、3つも4つもつけている、、、つけているアバターは気がついてないかもしれませんが、、、)
WindLight 以前、Windlight 直後はフェースライトがものすごく重要だった(調整が難しい、、、)のですが、最近は SIM にある光源だけでも良い感じになってきましたし、逆に光源がいっぱいある状況だと白浮きすることのほうが多くなりましたね。
今回のようなイベントだと、フロアの光源もきちんと計算されるでしょうし、暗すぎることはないと思うので、フェースライトはぜひ外して参加したいですね。フェースライトをつけたアバターがあつまると光源がいっぱいある状況になってしまいますし。
でも、、、知っているアバターならともかく、知らないアバターに「フェースライトを外してください」って注意するのは勇気がいります。無用なトラブルも起こしたくない、、、というのが本音。会場にもたぶん注意事項としてあるわけだから、もともとあまりそういうことを気にしない、気にしたくないアバターだと、、、めんどうですし。(もちろん、気がつかなかった、、もあるでしょうが)
そういう時は、以前 Torley のビデオで紹介されていた方法で楽しみましょう。
フェースライトだけじゃなくて、アバターから出ているパーティクルに対しても同じように対処できます。
装着しているプリムのライトを消す方法(フェースライトを消す方法)
この方法は自分も含めてアバターに装着されているプリムの光源(ライト)を消します。
以下はフェースライトをつけた状態で、必要になるメニューを出したスクリーンショットです。
1. CTRL+ALT+D(Win)で Advanced メニューバーを表示する (Mac は Opt + Ctrl +D)
2. Advanced メニューの [Rendering] をクリックする
3. Rendering メニューの [X Attached Lights] をクリックする。
すると、X が消えた状態になります。それが以下です。
フェースライトが消えましたね。(ただし、、、自分のフェースライトは、自分が外さない限り、他の人にとっては光源となっているので、自分のフェースライトを消したい場合は、フェースライトをオフにする、はずすなどをしてくださいね。)
ピアスのパーティクルが上の SS では光っていますが、これも [X Attached Particles] をチェックすることで消すことができます。
これは覚えておきたいうれしい機能ですね。
祇園プロデューサーのさみーさんのブログにも書かれていますが、3つのお願いがあります。
・光源(フェースライトなど)使用禁止
・ド派手なパーティク使用禁止
・HUD(スクリプト類)使用禁止
特に、、、時々ものすごく明るいフェースライトをつけているアバターがいますよね。。。(それも、、、1つじゃなくて、3つも4つもつけている、、、つけているアバターは気がついてないかもしれませんが、、、)
WindLight 以前、Windlight 直後はフェースライトがものすごく重要だった(調整が難しい、、、)のですが、最近は SIM にある光源だけでも良い感じになってきましたし、逆に光源がいっぱいある状況だと白浮きすることのほうが多くなりましたね。
今回のようなイベントだと、フロアの光源もきちんと計算されるでしょうし、暗すぎることはないと思うので、フェースライトはぜひ外して参加したいですね。フェースライトをつけたアバターがあつまると光源がいっぱいある状況になってしまいますし。
でも、、、知っているアバターならともかく、知らないアバターに「フェースライトを外してください」って注意するのは勇気がいります。無用なトラブルも起こしたくない、、、というのが本音。会場にもたぶん注意事項としてあるわけだから、もともとあまりそういうことを気にしない、気にしたくないアバターだと、、、めんどうですし。(もちろん、気がつかなかった、、もあるでしょうが)
そういう時は、以前 Torley のビデオで紹介されていた方法で楽しみましょう。
フェースライトだけじゃなくて、アバターから出ているパーティクルに対しても同じように対処できます。
装着しているプリムのライトを消す方法(フェースライトを消す方法)
この方法は自分も含めてアバターに装着されているプリムの光源(ライト)を消します。
以下はフェースライトをつけた状態で、必要になるメニューを出したスクリーンショットです。
1. CTRL+ALT+D(Win)で Advanced メニューバーを表示する (Mac は Opt + Ctrl +D)
2. Advanced メニューの [Rendering] をクリックする
3. Rendering メニューの [X Attached Lights] をクリックする。
すると、X が消えた状態になります。それが以下です。
フェースライトが消えましたね。(ただし、、、自分のフェースライトは、自分が外さない限り、他の人にとっては光源となっているので、自分のフェースライトを消したい場合は、フェースライトをオフにする、はずすなどをしてくださいね。)
ピアスのパーティクルが上の SS では光っていますが、これも [X Attached Particles] をチェックすることで消すことができます。
これは覚えておきたいうれしい機能ですね。
2008年11月21日金曜日
GION FINAL・・・
ご存知の方も多いでしょうが、Linden の HP でも紹介されている GION(祇園) SIM が予定されていたプロジェクト終了ということで今月にてクローズされるようです。
サミーさんとこのブログ
GION のファイナル ライブは、、、Yaz Rockett です!
Yaz Mania グループには Yaz さんから POP も配られ、、、先週末につくった白虎(Byakko)の高台公園クリスマス仕様にも看板をおいてみました。
GION で行われた前の Yaz さんのライブは 3 回くらい落ちながら、、、なんとか Fraps で動画をとってまとめたのがこれ。
GION のオーナーのサミーさんにも褒められて(w)、動画作成の楽しさを感じさせてくれた貴重な体験でもありました。
また新しいプロジェクト、、、期待したいものですね。
サミーさんとこのブログ
GION のファイナル ライブは、、、Yaz Rockett です!
Yaz Mania グループには Yaz さんから POP も配られ、、、先週末につくった白虎(Byakko)の高台公園クリスマス仕様にも看板をおいてみました。
GION で行われた前の Yaz さんのライブは 3 回くらい落ちながら、、、なんとか Fraps で動画をとってまとめたのがこれ。
GION のオーナーのサミーさんにも褒められて(w)、動画作成の楽しさを感じさせてくれた貴重な体験でもありました。
また新しいプロジェクト、、、期待したいものですね。
2008年11月19日水曜日
位置と回転を理解したい その2
前回からの続きです。
llSetPos と llGetPos を使った 西へ1m, 南へ2m, 上に1m の指定方法は理解できました。
次に、「前に1m, 左に2m, 上に1m」という設定をするには、オブジェクトが向いている方向、つまり「回転」を理解しなくてはなりませんでした。「回転」っていうとクルクルまわっているイメージを持ってしまいますが、どっちを向いているかの「方向」だと置き換えて考える必要がありました。
実は、、プリムの正面っていうのは決まっています。立方体にすると第2面が「顔」になります。(笑
西(W) を向いている方向です。 Rez したときの、東西の矢印の方向です。
地図上の東西が X 軸、南北が Y 軸、上下が Z 軸で、それをグローバル座標軸とよびます。グローバル座標軸はどこにいても、どちらを向いていても変わることはありません。一方、前後、左右、上下(ええ、上下も自分が傾いていたら上下軸も傾きますね)はそのときの状態でかわります。この前後、左右、上下を表す軸をローカル座標軸と呼びます。(便宜上、それぞれの軸をグローバル座標軸と同じように、ローカル座標軸の X, Y, Z と呼ばれます。また、この X, Y, Z は右手座標系と呼ばれるものに基づいていて、左手座標系の場合は X, Z, Y となります。他の回転・旋回の記事を参照するときは注意が必要です。。。)
プリムを作成したときはグローバル座標軸とローカル座標軸は一致していますが、プリムが回転してしまったら、グローバル座標軸とローカル座標軸は違うものになりますね。
前後に移動する、というのは東西、南北のグローバル座標軸を使うより、ローカル座標軸の X 軸に沿って移動する、左右に移動するというのはローカル座標軸の Y 軸に沿って移動する、と考えれば簡単そうですよね。
llGetRot を使って向いている方向を取得する
向いている方向、つまり、回転を扱うときに私がつまずいたのがローテーション型 (rotation) というものです。現在の回転の値を取得する llGetRot によって返される値は rotation 型と呼ばれる型の値で、ベクトル(ベクター)型とは違います。クォータニオン (quaternion) とも呼ばれるこの型の説明をネット上で探すと、、、<x, y, z, s> の4つの要素からなる4元数で、ジンバルロックが、三角関数が、虚数が(!)、、、と情報は豊富なのですが、数学をちゃんとやっていないと馴染みの薄い難しい単語が続きます。これをひとつひとつ理解しようとすると、かなり大変です。(それはそれで面白いのですけどね。。。)
ですので、x, y, z, s の4つの数字が意味することにあまり深く入らなくてもいいと思います。
実際、rotation 型に入る 4つの数値を直接いじることは私のやりたい範囲では皆無でした。
とりえあず、、、llGetRot で現在の向いている方向が rotation 型で表現できる、と理解して先に進みます。
(あとで、、、角度とローテーションの関係でもう一度でてくることになります)
(なお、wiki.secondlife.com の回転(ローテーション)についての日本語の記事がこちらになります。)
本題に戻って、llGetRot で今向いている方向がとれたら、次は「前」ですよね。LSL では「前」に進むための移動距離をとる関数が用意されていて、それが llRot2Fwd になります。
これが、、、「位置」と「回転」が違うことを意識していないとごちゃごちゃになる壁かもしれません。
いま、llGetRot() で「どの位置か」は関係なく、向いている方向を表す rotation 型の数値を取得できました。向いている方向がわかったらローカル座標軸にそった前方 1m の位置の情報をとりたい、ということですよね。最終的に llSetPos を使って位置を設定したいなら <x, y, z> のグローバル座標軸の位置情報がほしくなります。
そこで llRot2Fwd を使います。llRot2Fwd に現在の向きの情報を llGetRot() で取得して渡すと、Unit Vector (単位ベクトル)という値を返します。
vector fwdVec = llRot2Fwd(llGetRot());
<x, y, z> のベクトル型のデータを fwdVec にもらっていますが、これは「位置」をあらわす <x, y, z> ではありません。
Unit Vector (単位ベクトル) と呼ばれているのは現在の位置からローカル座標軸に沿って 1m 前に進むための「グローバル座標軸上の」移動方向を表しているのです。今のところから「前に 1m 進む」には東へ Xm、北へ Ym、上に Zm いきなさい、ということです。
最初この llRot2Fwd を知らなくて、三角関数の llSin, llCos を使って 1m 先に進むためのグローバル座標軸の値を算出しようとしていたんです、、、。
ええ、直角三角形の1辺が 1m になるような X 軸と Y 軸の値を、、、もう、十何年ぶりにピタゴラスの定理です(笑
これ、常に地面に垂直にいればいいですが、傾いた時点でかなり面倒なことになりそうなのは理解していました。こんなめんどうなことやらないかも、と思い検索してたら llRot2Fwd を運よく見つけたのでした。
繰り返しになりますが、ローカル座標軸の 前後、左右、上下方向に 1m 進むために、グローバル座標軸上の 東西、南北、天地 での進まなくてはならない移動距離を出してくれるのが、llRot2Fwd, llRot2Left, llRot2Up という便利な関数になるわけです。
そうすると、
1) 現在の向きをllGetRot でとって
2) llRot2Fwd(llGetRot()) と渡して、向いている方向に 1m 進むための東西・南北・天地の値を算出し、
3) 現在の位置を llGetPos でとり、そこに 2) で算出した値を足し、
4) 今の位置から前方 1m のグローバル座標軸上の位置を llSetPos に渡すことができる、
ということですね。 2m 進みたかったら llRot2Fwd を2倍すればよいですし、後方ならば -1 をかければよい、ということです。
これで思い通りの場所にオブジェクトを移動させたり、Rez したりできるようになりそうでした。
が、、、、
今度は Rez したオブジェクトを「右へ90度向かせる」、「反対方向(180度)に向かせる」などの調整をしたくなりました。
ここではじめて「とりあえずこんなもの」と理解していたローテーション型(クォータニオン)の「すごさ」を実感することになりました。
つづく・・・
llSetPos と llGetPos を使った 西へ1m, 南へ2m, 上に1m の指定方法は理解できました。
次に、「前に1m, 左に2m, 上に1m」という設定をするには、オブジェクトが向いている方向、つまり「回転」を理解しなくてはなりませんでした。「回転」っていうとクルクルまわっているイメージを持ってしまいますが、どっちを向いているかの「方向」だと置き換えて考える必要がありました。
実は、、プリムの正面っていうのは決まっています。立方体にすると第2面が「顔」になります。(笑
西(W) を向いている方向です。 Rez したときの、東西の矢印の方向です。
地図上の東西が X 軸、南北が Y 軸、上下が Z 軸で、それをグローバル座標軸とよびます。グローバル座標軸はどこにいても、どちらを向いていても変わることはありません。一方、前後、左右、上下(ええ、上下も自分が傾いていたら上下軸も傾きますね)はそのときの状態でかわります。この前後、左右、上下を表す軸をローカル座標軸と呼びます。(便宜上、それぞれの軸をグローバル座標軸と同じように、ローカル座標軸の X, Y, Z と呼ばれます。また、この X, Y, Z は右手座標系と呼ばれるものに基づいていて、左手座標系の場合は X, Z, Y となります。他の回転・旋回の記事を参照するときは注意が必要です。。。)
プリムを作成したときはグローバル座標軸とローカル座標軸は一致していますが、プリムが回転してしまったら、グローバル座標軸とローカル座標軸は違うものになりますね。
前後に移動する、というのは東西、南北のグローバル座標軸を使うより、ローカル座標軸の X 軸に沿って移動する、左右に移動するというのはローカル座標軸の Y 軸に沿って移動する、と考えれば簡単そうですよね。
llGetRot を使って向いている方向を取得する
向いている方向、つまり、回転を扱うときに私がつまずいたのがローテーション型 (rotation) というものです。現在の回転の値を取得する llGetRot によって返される値は rotation 型と呼ばれる型の値で、ベクトル(ベクター)型とは違います。クォータニオン (quaternion) とも呼ばれるこの型の説明をネット上で探すと、、、<x, y, z, s> の4つの要素からなる4元数で、ジンバルロックが、三角関数が、虚数が(!)、、、と情報は豊富なのですが、数学をちゃんとやっていないと馴染みの薄い難しい単語が続きます。これをひとつひとつ理解しようとすると、かなり大変です。(それはそれで面白いのですけどね。。。)
ですので、x, y, z, s の4つの数字が意味することにあまり深く入らなくてもいいと思います。
実際、rotation 型に入る 4つの数値を直接いじることは私のやりたい範囲では皆無でした。
とりえあず、、、llGetRot で現在の向いている方向が rotation 型で表現できる、と理解して先に進みます。
(あとで、、、角度とローテーションの関係でもう一度でてくることになります)
(なお、wiki.secondlife.com の回転(ローテーション)についての日本語の記事がこちらになります。)
本題に戻って、llGetRot で今向いている方向がとれたら、次は「前」ですよね。LSL では「前」に進むための移動距離をとる関数が用意されていて、それが llRot2Fwd になります。
これが、、、「位置」と「回転」が違うことを意識していないとごちゃごちゃになる壁かもしれません。
いま、llGetRot() で「どの位置か」は関係なく、向いている方向を表す rotation 型の数値を取得できました。向いている方向がわかったらローカル座標軸にそった前方 1m の位置の情報をとりたい、ということですよね。最終的に llSetPos を使って位置を設定したいなら <x, y, z> のグローバル座標軸の位置情報がほしくなります。
そこで llRot2Fwd を使います。llRot2Fwd に現在の向きの情報を llGetRot() で取得して渡すと、Unit Vector (単位ベクトル)という値を返します。
vector fwdVec = llRot2Fwd(llGetRot());
<x, y, z> のベクトル型のデータを fwdVec にもらっていますが、これは「位置」をあらわす <x, y, z> ではありません。
Unit Vector (単位ベクトル) と呼ばれているのは現在の位置からローカル座標軸に沿って 1m 前に進むための「グローバル座標軸上の」移動方向を表しているのです。今のところから「前に 1m 進む」には東へ Xm、北へ Ym、上に Zm いきなさい、ということです。
最初この llRot2Fwd を知らなくて、三角関数の llSin, llCos を使って 1m 先に進むためのグローバル座標軸の値を算出しようとしていたんです、、、。
ええ、直角三角形の1辺が 1m になるような X 軸と Y 軸の値を、、、もう、十何年ぶりにピタゴラスの定理です(笑
これ、常に地面に垂直にいればいいですが、傾いた時点でかなり面倒なことになりそうなのは理解していました。こんなめんどうなことやらないかも、と思い検索してたら llRot2Fwd を運よく見つけたのでした。
繰り返しになりますが、ローカル座標軸の 前後、左右、上下方向に 1m 進むために、グローバル座標軸上の 東西、南北、天地 での進まなくてはならない移動距離を出してくれるのが、llRot2Fwd, llRot2Left, llRot2Up という便利な関数になるわけです。
そうすると、
1) 現在の向きをllGetRot でとって
2) llRot2Fwd(llGetRot()) と渡して、向いている方向に 1m 進むための東西・南北・天地の値を算出し、
3) 現在の位置を llGetPos でとり、そこに 2) で算出した値を足し、
4) 今の位置から前方 1m のグローバル座標軸上の位置を llSetPos に渡すことができる、
ということですね。 2m 進みたかったら llRot2Fwd を2倍すればよいですし、後方ならば -1 をかければよい、ということです。
これで思い通りの場所にオブジェクトを移動させたり、Rez したりできるようになりそうでした。
が、、、、
今度は Rez したオブジェクトを「右へ90度向かせる」、「反対方向(180度)に向かせる」などの調整をしたくなりました。
ここではじめて「とりあえずこんなもの」と理解していたローテーション型(クォータニオン)の「すごさ」を実感することになりました。
つづく・・・
2008年11月17日月曜日
位置と回転を理解したい その1
Computer Graphics やゲームの制作に携わってこられた方にとっては当たり前のことだと思うのですが、なかなかそのエリアとの関連が薄かった人(私含め、、)にとっては、LSL でオブジェクトの位置と回転を理解するのに相当の時間がかかるのではないかと思います。
ネット上に情報はたくさんあるのですが、とにかく専門用語がいっぱいで、記事を読めばまた知らない単語が出て、その繰り返しでなかなか学習が進まないんですよね。
反面、ネットの情報では平面上に3次元に見える絵を書いて苦労しながら説明しているのを見ると、Second Life ってこういうことを理解するには安上がりでお手軽な手段じゃないかな、と思います。高価なソフトを購入しなくてもよいですし、前提の知識が他の環境に比べて比較的に少ないのも敷居を低くしてくれているように思います。(それでも苦労したのですが、、、)
ダンス スクリプトしか興味のない私がなぜ位置と回転なのか、、、実は通称「ネジ」と呼んでいる、Sit することでダンサーのポジション(位置)を決めるためのオブジェクトを作ったときに思いっきりはまっちゃったわけです。
そこでちょっとその時に学習したことを備忘録的にまとめてみよう、と急に思い立ちました。(笑
llSetPos を使った位置の指定
位置を指定する関数としては llSetPos があります。また、LSL を使わなくても、プリムの [編集] で位置の X, Y, Z の値を変えたりしてると思います。
llSetPos はこの X, Y, Z の数値をスクリプトから変更する関数になります。そのため X, Y, Z の3つの数値を扱うために LSL ではベクター型 (vector, ベクトル) という 3 つの数値をひとまとめにした入れ物が用意されています。
vector nowPos;
nowPos というベクター型の入れものを宣言すると上記のようになります。
X, Y, Z にはその SIM の絶対位置が使われます。<0.0, 0.0, 0.0> という位置は SIM の地図上の左下の高度 0 mになります。
現在の位置を取得する関数は llGetPos です。タッチしたら現在の位置から 1m 上に上がるといった動きをするスクリプトは以下のようになります。
default{
state_entry(){
llSay(0,"Hello Avatar!");
}
touch(integer num_detected){
vector nowPos = llGetPos();
llSetPos(nowPos+<0.0,0.0,1.0>); // X, Y は変えず Z だけ現在の位置から 1m 上に設定
}
}
touch イベントの中で現在の位置を取得して、1m 上の位置を指定していますから、タッチするたびに 1m ずつ上にあがっていきます。
現在の位置を state_entry や on_rez の中でとってしまうと、一回目のタッチでは 1m 上にあがりますが、動いた後の位置をとらないので次からはオブジェクトが動かないスクリプトになってしまいます。
ここで X, Y, Z という方向が「絶対位置」として、この3軸が必ず「直交」していることに注意します。
地図上では X 軸は東西、Y軸は南北、Z軸は上下(天地)です。
「今の位置から西に1m, 南に2m, 上に1m移動します」
こういう指示ならば llSetPos(llGetPos()+<-1.0, -2.0, 1.0>) という位置指定でいいのですが、おおよそ移動したい位置を指定するときは
「前に1m, 左に2m, 上方に1m」
こういうことを考えますよね。
そうすると「前ってどっち?」となります。もしかしたら、今向いているのは東北北東の方向で X, Y, Z といった軸に重なっていないかもしれません。
そこで出てくるのが「回転」の考え方になります。
つづく・・・
ネット上に情報はたくさんあるのですが、とにかく専門用語がいっぱいで、記事を読めばまた知らない単語が出て、その繰り返しでなかなか学習が進まないんですよね。
反面、ネットの情報では平面上に3次元に見える絵を書いて苦労しながら説明しているのを見ると、Second Life ってこういうことを理解するには安上がりでお手軽な手段じゃないかな、と思います。高価なソフトを購入しなくてもよいですし、前提の知識が他の環境に比べて比較的に少ないのも敷居を低くしてくれているように思います。(それでも苦労したのですが、、、)
ダンス スクリプトしか興味のない私がなぜ位置と回転なのか、、、実は通称「ネジ」と呼んでいる、Sit することでダンサーのポジション(位置)を決めるためのオブジェクトを作ったときに思いっきりはまっちゃったわけです。
そこでちょっとその時に学習したことを備忘録的にまとめてみよう、と急に思い立ちました。(笑
llSetPos を使った位置の指定
位置を指定する関数としては llSetPos があります。また、LSL を使わなくても、プリムの [編集] で位置の X, Y, Z の値を変えたりしてると思います。
llSetPos はこの X, Y, Z の数値をスクリプトから変更する関数になります。そのため X, Y, Z の3つの数値を扱うために LSL ではベクター型 (vector, ベクトル) という 3 つの数値をひとまとめにした入れ物が用意されています。
vector nowPos;
nowPos というベクター型の入れものを宣言すると上記のようになります。
X, Y, Z にはその SIM の絶対位置が使われます。<0.0, 0.0, 0.0> という位置は SIM の地図上の左下の高度 0 mになります。
現在の位置を取得する関数は llGetPos です。タッチしたら現在の位置から 1m 上に上がるといった動きをするスクリプトは以下のようになります。
default{
state_entry(){
llSay(0,"Hello Avatar!");
}
touch(integer num_detected){
vector nowPos = llGetPos();
llSetPos(nowPos+<0.0,0.0,1.0>); // X, Y は変えず Z だけ現在の位置から 1m 上に設定
}
}
touch イベントの中で現在の位置を取得して、1m 上の位置を指定していますから、タッチするたびに 1m ずつ上にあがっていきます。
現在の位置を state_entry や on_rez の中でとってしまうと、一回目のタッチでは 1m 上にあがりますが、動いた後の位置をとらないので次からはオブジェクトが動かないスクリプトになってしまいます。
ここで X, Y, Z という方向が「絶対位置」として、この3軸が必ず「直交」していることに注意します。
地図上では X 軸は東西、Y軸は南北、Z軸は上下(天地)です。
「今の位置から西に1m, 南に2m, 上に1m移動します」
こういう指示ならば llSetPos(llGetPos()+<-1.0, -2.0, 1.0>) という位置指定でいいのですが、おおよそ移動したい位置を指定するときは
「前に1m, 左に2m, 上方に1m」
こういうことを考えますよね。
そうすると「前ってどっち?」となります。もしかしたら、今向いているのは
そこで出てくるのが「回転」の考え方になります。
つづく・・・
2008年11月9日日曜日
[MLDU] HUD としての装着場所
お試し版が Mod 不可だったので、、、MLDU お試し版に入れたフリーもののアニメーションが消せない、、、というご迷惑をおかけいたしました。。。
取引履歴から Mod 可に修正したものを送らせていただきましたが、その際に以下のご質問をいただきました。
「HUD として画面のどこにでも装着できますか?」
はい。お好きなところに装着できます。
単純に「装着 (Wear)」を選ぶと右上、または下の真ん中に MLDU が装着されますが、これはベンダーにいれる前のテストの状態を記憶しているからです。ですから、ご自身で HUD として装着した場所には次回から「装着(Wear)」でだいじょうぶです。
Rez したときは「ダンス玉」、HUD として装着したときは HUD 玉(笑 でサイズや形状、テクスチャを変更しているのが MLDU のコンテンツフォルダにある「AppearanceChanger」という名前のスクリプトです。このスクリプトは編集可能にしてますので、スクリプト ソースを見ることができます。
このスクリプトが Rez したときは 50cm, 50cm, 50cm のダンス玉にして、装着したときは 5cm, 5cm, 5cm の立方体に変更して Face 4 にテクスチャをつけて、Face 4 がちゃんと正面にきて見えるように回転をさせてます。
また、その際に HUD の装着位置を確認して、画面から HUD が出ないような調整をしています。
もし、HUD が消えてしまったら、こちらの投稿を参考にして調整してください。
HUD 位置調整方法
取引履歴から Mod 可に修正したものを送らせていただきましたが、その際に以下のご質問をいただきました。
「HUD として画面のどこにでも装着できますか?」
はい。お好きなところに装着できます。
単純に「装着 (Wear)」を選ぶと右上、または下の真ん中に MLDU が装着されますが、これはベンダーにいれる前のテストの状態を記憶しているからです。ですから、ご自身で HUD として装着した場所には次回から「装着(Wear)」でだいじょうぶです。
Rez したときは「ダンス玉」、HUD として装着したときは HUD 玉(笑 でサイズや形状、テクスチャを変更しているのが MLDU のコンテンツフォルダにある「AppearanceChanger」という名前のスクリプトです。このスクリプトは編集可能にしてますので、スクリプト ソースを見ることができます。
このスクリプトが Rez したときは 50cm, 50cm, 50cm のダンス玉にして、装着したときは 5cm, 5cm, 5cm の立方体に変更して Face 4 にテクスチャをつけて、Face 4 がちゃんと正面にきて見えるように回転をさせてます。
また、その際に HUD の装着位置を確認して、画面から HUD が出ないような調整をしています。
もし、HUD が消えてしまったら、こちらの投稿を参考にして調整してください。
HUD 位置調整方法
[MLDU] アニメーションが削除できない
お試し版(0L$, 1L$) で以下の不具合がありました。
ただし、製品版 (3人用、6人用、15人用、30人用) は問題ありませんのでご安心してください。
[現象]
・MLDUにアニメーションを移動もしくはコピー
・その後有料のコピー不可のものは再度インベントリ(持ちもの)に戻すことができる
・ところがコピー可のフリーものは消しても、消しても MLDU のコンテンツ フォルダに残り続ける
・なので、不要なダンス アニメーションを消すことができない
[原因]
・MLDU4 お試し版のパーミッションが適切に設定されていませんでした(Mod 可にする必要あり)
[解決方法]
・編集可能にした MLDU4 お試し版を再度入手してください
・取引記録にある方には個別に MLDU4 お試し版の修正したものをお送りしています
[確認方法]
・MLDU4 のパイメニューから [編集] を選んで、テクスチャの編集が可能なものは問題ありません
・OEDO City の Stuido4D さんに設置してあるお試し版ベンダのものが該当します
・すでに OEDO City Studio4D のお試し版は修正したものに差し替えています
お手数をおかけしますが、よろしくお願いします。
そもそも Mod(編集) 可にしていなかったのが大きな原因です。本当にすみませんでした。。。
これだと外観さえ編集できませんもの。
ただ、外観だけではなくて、コンテンツフォルダに「追加(コピー)」できても「削除」できなくなるんですね。
コピー不可の有料のアニメーションは持ち物(インベントリ)に再度 移動できるので大事には至らなかったといえますが、本当に何度も確認してからベンダーとして公開しないとだめですね。
深く反省。
ただし、製品版 (3人用、6人用、15人用、30人用) は問題ありませんのでご安心してください。
[現象]
・MLDUにアニメーションを移動もしくはコピー
・その後有料のコピー不可のものは再度インベントリ(持ちもの)に戻すことができる
・ところがコピー可のフリーものは消しても、消しても MLDU のコンテンツ フォルダに残り続ける
・なので、不要なダンス アニメーションを消すことができない
[原因]
・MLDU4 お試し版のパーミッションが適切に設定されていませんでした(Mod 可にする必要あり)
[解決方法]
・編集可能にした MLDU4 お試し版を再度入手してください
・取引記録にある方には個別に MLDU4 お試し版の修正したものをお送りしています
[確認方法]
・MLDU4 のパイメニューから [編集] を選んで、テクスチャの編集が可能なものは問題ありません
・OEDO City の Stuido4D さんに設置してあるお試し版ベンダのものが該当します
・すでに OEDO City Studio4D のお試し版は修正したものに差し替えています
お手数をおかけしますが、よろしくお願いします。
そもそも Mod(編集) 可にしていなかったのが大きな原因です。本当にすみませんでした。。。
これだと外観さえ編集できませんもの。
ただ、外観だけではなくて、コンテンツフォルダに「追加(コピー)」できても「削除」できなくなるんですね。
コピー不可の有料のアニメーションは持ち物(インベントリ)に再度 移動できるので大事には至らなかったといえますが、本当に何度も確認してからベンダーとして公開しないとだめですね。
深く反省。
2008年11月7日金曜日
[MLDU] 初期ダンス設定方法
MLDU は llStartAnimation/llStopAnimation を指定間隔で行うわけですが、llStartAnimation の指示あとでダンスに参加した Avatar は現在他の人が踊っている Animation に途中から参加することができません。
元々シンクロ(同期)ダンスを踊るための MLDU だったので、おくれて入ってきても、、、同じダンスをおどっても意味がない、という考えのもとでした。
そこで、MLDU3 まではコンテンツ フォルダの中の一番上にあるアニメーションをデフォルト ダンス アニメーションとして取り込んで、danceSlot スクリプトが同期スクリプトの SynchManager から「同期の指示がくるまで」そのダンスを踊らせる仕様でした。
llStartAnimation はプリム内のコンテンツ フォルダにあるダンス アニメーションの「名前」を使ってダンスを踊らせますから、llGetInventoryName を使って、アニメーション タイプのオブジェクトの名前をフォルダから取得していたわけです。
string initAnimName = llGetInventoryName(INVENTORY_ANIMATION,0);
こんな感じでした。
しかし、、、この待ちのダンス、「待っているような」ダンスを躍らせたい、というリクエストがあったわけです。
Sine Wave の dance 14 とか、そんなダンスも存在しているわけで、たしかにそうしたいのもわかるというもの。
そこで MLDU4 では 00:XXXXXXXXXX というノートカードを使っています。
ノートカードを使っているといっても、00:XXXXXXXXXX のノートカードの中身は空です。
つまり、ノートカードの名前の XXXXXXXXXX の部分を使っているわけです。
SynchManager と Animations というスクリプトからノートカードを読み込む方法をとっているにもかかわらず、この「名前」をとる方法にしたのは、、、単純にシンプルにしたかったためです。(というか、、、楽したかった?)
ノートカードの読み込みは dataserver イベントを使っているので軽い処理ではありません。そのため、ノートカードの読み込みが重なってしまうとエラーになることもあったわけです。
この初期ダンスの設定は MLDU4 リセット時に 50 ダンススロットバージョンだと 50 のスクリプトのリセットが走るわけですから、、、なるべくシンプルにしたかったのです。
ということで、、、ノートカード 00:XXXXXXXXXX は初期ダンスを指定するためのノートカードになります。
ブランクが入ってもかまいませんが、正確に名前を入れる必要があります。
もし、XXXXXXXXXXX で指定したダンス アニメーションが無かった場合は、MLDU3 までと同じようにコンテンツ フォルダにある一番上のアニメーションを使用します。
スクリプトとしては以下のようなものを使っています。
string initAnimName = "";
integer numberOfNotecards = llGetInventoryNumber(INVENTORY_NOTECARD); //ノートの数を取得
integer i;
for(i=0;i<numberOfNotecards;++i){ //ノートの数ぶん for をまわします
string tName = llGetInventoryName(INVENTORY_NOTECARD, i);
if(llGetSubString(tName, 0, 2)=="00:"){ //もしノートカードの名前の最初の3つの文字が 00: だったら
string tName2 = llGetSubString(tName, 3, -1); //00: 以降のストリングを取り込み
if(llGetInventoryType(tName2)!=-1){ //その名前のダンスがコンテンツ フォルダに存在していれば
initAnimName = tName2; //初期ダンスとして登録します
} else { //存在してなければ
initAnimName = llGetInventoryName(INVENTORY_ANIMATION,0); //最初のアニメを登録
}
i = numberOfNotecards; // for を終わらせるため max 値をいれます
}
}
//このあとで 00:XXXXXX ノートカードそのものが存在していない場合の処理を。。。
llStringTrim を使って 00: の後のダンス アニメーション名の前後のスペースの削除とかしてませんから、00: に続けてアニメーション名を「名前の変更」でいれてください。
元々シンクロ(同期)ダンスを踊るための MLDU だったので、おくれて入ってきても、、、同じダンスをおどっても意味がない、という考えのもとでした。
そこで、MLDU3 まではコンテンツ フォルダの中の一番上にあるアニメーションをデフォルト ダンス アニメーションとして取り込んで、danceSlot スクリプトが同期スクリプトの SynchManager から「同期の指示がくるまで」そのダンスを踊らせる仕様でした。
llStartAnimation はプリム内のコンテンツ フォルダにあるダンス アニメーションの「名前」を使ってダンスを踊らせますから、llGetInventoryName を使って、アニメーション タイプのオブジェクトの名前をフォルダから取得していたわけです。
string initAnimName = llGetInventoryName(INVENTORY_ANIMATION,0);
こんな感じでした。
しかし、、、この待ちのダンス、「待っているような」ダンスを躍らせたい、というリクエストがあったわけです。
Sine Wave の dance 14 とか、そんなダンスも存在しているわけで、たしかにそうしたいのもわかるというもの。
そこで MLDU4 では 00:XXXXXXXXXX というノートカードを使っています。
ノートカードを使っているといっても、00:XXXXXXXXXX のノートカードの中身は空です。
つまり、ノートカードの名前の XXXXXXXXXX の部分を使っているわけです。
SynchManager と Animations というスクリプトからノートカードを読み込む方法をとっているにもかかわらず、この「名前」をとる方法にしたのは、、、単純にシンプルにしたかったためです。(というか、、、楽したかった?)
ノートカードの読み込みは dataserver イベントを使っているので軽い処理ではありません。そのため、ノートカードの読み込みが重なってしまうとエラーになることもあったわけです。
この初期ダンスの設定は MLDU4 リセット時に 50 ダンススロットバージョンだと 50 のスクリプトのリセットが走るわけですから、、、なるべくシンプルにしたかったのです。
ということで、、、ノートカード 00:XXXXXXXXXX は初期ダンスを指定するためのノートカードになります。
ブランクが入ってもかまいませんが、正確に名前を入れる必要があります。
もし、XXXXXXXXXXX で指定したダンス アニメーションが無かった場合は、MLDU3 までと同じようにコンテンツ フォルダにある一番上のアニメーションを使用します。
スクリプトとしては以下のようなものを使っています。
string initAnimName = "";
integer numberOfNotecards = llGetInventoryNumber(INVENTORY_NOTECARD); //ノートの数を取得
integer i;
for(i=0;i<numberOfNotecards;++i){ //ノートの数ぶん for をまわします
string tName = llGetInventoryName(INVENTORY_NOTECARD, i);
if(llGetSubString(tName, 0, 2)=="00:"){ //もしノートカードの名前の最初の3つの文字が 00: だったら
string tName2 = llGetSubString(tName, 3, -1); //00: 以降のストリングを取り込み
if(llGetInventoryType(tName2)!=-1){ //その名前のダンスがコンテンツ フォルダに存在していれば
initAnimName = tName2; //初期ダンスとして登録します
} else { //存在してなければ
initAnimName = llGetInventoryName(INVENTORY_ANIMATION,0); //最初のアニメを登録
}
i = numberOfNotecards; // for を終わらせるため max 値をいれます
}
}
//このあとで 00:XXXXXX ノートカードそのものが存在していない場合の処理を。。。
llStringTrim を使って 00: の後のダンス アニメーション名の前後のスペースの削除とかしてませんから、00: に続けてアニメーション名を「名前の変更」でいれてください。
2008年11月3日月曜日
[MLDU] 持ち物へのコピーと形状変更
MLDU4 のベンダーを公開しましたが、今までフォルダーのコピーだった販売方法を Pay 方式を使ってオブジェクトをお渡しする形にしました。4つのバージョン(3人用、6人用、15人用、30人用)の販売を1つのベンダーで可能になるのがメリットでした。
ちょっと販売方法が変更になったので、その手順をご紹介します。
また、MLDU4 は Rez したときのダンスボール状態と、装着したときの HUD 状態で形状、サイズ、テクスチャを切り替えるようにしています。その説明も最後のほうでしています。
1) オブジェクト(MLDU4 パッケージ)を地面上に REZ する
ベンダーから MLDU4 を購入すると、持ち物(インベントリ)の Objects フォルダに MLDU4(X) というオブジェクトが渡されます。
X にはお買いいただいた人数の数が入っています。まず、それを REZ できるエリアで地面に REZ します。
REZ したオブジェクト上でパイメニューを表示して「開く」を選択します。
2) 持ち物(インベントリ)にコピーする
オブジェクト・コンテンツのウィンドウが開くので、[持ち物にコピー] ボタンをクリックします。
MLDU4 は no copy なので、以下の警告がでますが、[OK] をクリックします。
3) 持ち物(インベントリ)にフォルダが作成され、オブジェクトが移ったことを確認する
MLDU4(X) (Xには人数が入ります) というフォルダが作成され、フォルダの中に MLDU4 その他のオブジェクトが入っていることを確認します。 NOTECARD もご一読ください。
4) REZ してスクリプト リセットを行い初期化する
実際にダンスボールとして使う場所で MLDU4 を REZ します。
初めて Rez したら必ずスクリプトのリセットを行います。MLDU4 をタッチしてダイアログ メニューを表示させ、[詳細設定] ボタンをクリックします。
次に表示されたダイアログで [リセット] をクリックすると、スクリプトのリセットがはじまります。
リセットが完了すると以下のようなメッセージが表示されます。
5) HUD として使う
HUD として使う場合は装着してください。もちろん、はじめて使う場合は HUD にした状態で 4) の手順でスクリプト リセットを行ってください。
MLDU4 は Rez した場合と HUD として装着した場合でプリムの形状、大きさとテクスチャを自動的に変更する仕組みになっています。
また、HUD として装着する場所はどこでもかまいません。 HUDの位置についてはこちらも参照してください。
HUD として装着した小さな赤い玉をタッチすると、REZ した場合のダンスボールと同じダイアログ メニューが表示されます。
HUD の場合は他の人がタッチすることはできませんから、[招待] ボタンでダンスを招待します。
6) ダンスボールの形状変更 ApprearanceChanger スクリプトについて
REZ したダンス玉のテクスチャや大きさはオーナーにより修正可能ですが、以下のことに気をつけてください。
a) Take しない限り、変更は有効です。ダイアログからのスクリプト リセットをかけても、形状がもとにもどることはありません。
b) ダンス玉の形状を変更し、その後 Take して、再度 Rez した場合は初期の形状・サイズに戻ります。ただし、テクスチャの変更は有効のままです。
これらの動きを変更したい場合は MLDU4 のコンテンツ フォルダにある ApprearanceChanger というスクリプトを修正することになります。このスクリプトはフル パーミッションで修正可能です。
---------------------------------------------------------------------------------------------
ぜひ、お楽しみください~。
ちょっと販売方法が変更になったので、その手順をご紹介します。
また、MLDU4 は Rez したときのダンスボール状態と、装着したときの HUD 状態で形状、サイズ、テクスチャを切り替えるようにしています。その説明も最後のほうでしています。
1) オブジェクト(MLDU4 パッケージ)を地面上に REZ する
ベンダーから MLDU4 を購入すると、持ち物(インベントリ)の Objects フォルダに MLDU4(X) というオブジェクトが渡されます。
X にはお買いいただいた人数の数が入っています。まず、それを REZ できるエリアで地面に REZ します。
REZ したオブジェクト上でパイメニューを表示して「開く」を選択します。
2) 持ち物(インベントリ)にコピーする
オブジェクト・コンテンツのウィンドウが開くので、[持ち物にコピー] ボタンをクリックします。
MLDU4 は no copy なので、以下の警告がでますが、[OK] をクリックします。
3) 持ち物(インベントリ)にフォルダが作成され、オブジェクトが移ったことを確認する
MLDU4(X) (Xには人数が入ります) というフォルダが作成され、フォルダの中に MLDU4 その他のオブジェクトが入っていることを確認します。 NOTECARD もご一読ください。
4) REZ してスクリプト リセットを行い初期化する
実際にダンスボールとして使う場所で MLDU4 を REZ します。
初めて Rez したら必ずスクリプトのリセットを行います。MLDU4 をタッチしてダイアログ メニューを表示させ、[詳細設定] ボタンをクリックします。
次に表示されたダイアログで [リセット] をクリックすると、スクリプトのリセットがはじまります。
リセットが完了すると以下のようなメッセージが表示されます。
5) HUD として使う
HUD として使う場合は装着してください。もちろん、はじめて使う場合は HUD にした状態で 4) の手順でスクリプト リセットを行ってください。
MLDU4 は Rez した場合と HUD として装着した場合でプリムの形状、大きさとテクスチャを自動的に変更する仕組みになっています。
また、HUD として装着する場所はどこでもかまいません。 HUDの位置についてはこちらも参照してください。
HUD として装着した小さな赤い玉をタッチすると、REZ した場合のダンスボールと同じダイアログ メニューが表示されます。
HUD の場合は他の人がタッチすることはできませんから、[招待] ボタンでダンスを招待します。
6) ダンスボールの形状変更 ApprearanceChanger スクリプトについて
REZ したダンス玉のテクスチャや大きさはオーナーにより修正可能ですが、以下のことに気をつけてください。
a) Take しない限り、変更は有効です。ダイアログからのスクリプト リセットをかけても、形状がもとにもどることはありません。
b) ダンス玉の形状を変更し、その後 Take して、再度 Rez した場合は初期の形状・サイズに戻ります。ただし、テクスチャの変更は有効のままです。
これらの動きを変更したい場合は MLDU4 のコンテンツ フォルダにある ApprearanceChanger というスクリプトを修正することになります。このスクリプトはフル パーミッションで修正可能です。
---------------------------------------------------------------------------------------------
ぜひ、お楽しみください~。
LSLCON アイテムデモ 無事終了~
スクリーンショットを取る余裕はなく(w
本日 11月2日 午後8時30分~午後9時15分の予定で LSL コンベンション 2008 Japan のアイテムデモ "MLDU4 ~ダンスアニメーションを本当に楽しませるのはスクリプターのお仕事~" 無事終了しました。担当の Miya さん、事前の準備で付きあわされた(笑)お友達、今日参加してくださった皆様、本当にありがとうございました。 あ、あと、この機会を作ってくれた Nullpo さんにも感謝。
ダンススクリプトって、正直地味な制御系の範疇なので、、、ダンススクリプトがあっても「ダンス アニメーション」が無ければただの箱(もとい、、玉w)ですし、ビジュアル系(動きが派手なものとか)のスクリプトと違って、、、手間がかかる割にはあまり見た目がわかりづらいですよね。
そこで、アイデムデモは前半はスクリプトの説明とかちょっとしたテクニックをパネルでご紹介して、後半は実際に踊ってもらう方式にしてみました。踊ってもらったほうがわかりやすいw
実はデモで使った My MLDU には 145 のダンス アニメーションが入っているのですが、もちろん Studio4D スペシャルでやってみました。
といっても、、、シンクロダンス(同期ダンス)とか、ご紹介してきた時間差ダンスを踊ってもらうだけじゃ、、、参加型じゃないので面白くありません。 そこで一応シンクロ、時間差をやったあとで参加型にしたのが通称「はないちもんめ」。
15人の方にダンスを踊ってもらっていたので、5人1組の同じダンスを踊るグループを作ると全部で3組できるわけです。で、「同じダンスを踊っている人を見つけて、そばに寄ってみましょう~」という、、、ある種、合コンのゲームのような(笑
仕組みは時間差とシャッフルを組み合わせたものです。
1) 15人の参加者を3組にわけるには、サイクルを 3 に設定します。すると、ダンススロットは以下のような「グループ番号」を持ちます。
ダンススロット番号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
グループ番号: 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2
グループ番号 0 の人は同じタイミングで、同じダンスを踊ります。つまり、ダンスの開始は グループ番号 0, 1, 2, 0, 1, 2, 0 .... と繰り返します。
2) シャッフルモードをオンにして、各グループ番号のダンスをばらばらにする
シャッフルモードをオンにすると、本来同じダンスを時間差で開始するものが、時間差のたびに違うダンスを選ぶようになります。llFrand を使ってるので必ず違うもの、、、とは限りませんが、ダンス アニメーションがそこそこ入っている状況であれば、かなりの確率で違うものになります。(もちろん、llFrand の指定はセットのダンス アニメーション数の上限をきちんと指定しています)
そうすると、グループ0、グループ1、グループ2 の人たちが踊るダンスを違うものにすることができるわけです。
3) で、あとは「同じダンスを踊っている人を探しましょう~」と皆さんに呼びかける。
結構楽しんでいただいたようです。意外に、、、同じダンスってみつけづらかったりするんですよ。
MLDU4 は踊りながらサイクルをどんどん変更することができます。なので、サイクル 3 を今度はサイクル 5 にすると、3人一組のチームが15人いたら5つできるわけですよね。
これを応用して、3人のときにサイクル2にすると、2人が同じダンス、1人が違うダンスを踊ることになります。
同じダンスを踊っている人たちが両サイドにくると、まるでアイドルのバックダンサーのような踊りを踊ることができます。
MLDU4 RC は 11月3日の夕方くらいには「正式版」となって SnuLib で販売開始になる、、、予定です。
3人/2ダンスセットは 1L$ のお試し版で、正式版は 6人/8ダンスセットが 600L$, 15人/8ダンスセットが 1,500L$, 30人/8ダンスセットが 3,000L$ でご提供させていただく予定です。 50人/8ダンスセットや、カスタムは IM (もしくは、ここのメールを送る)でお問い合わせください。
[追記]
正式発売しました。ベンダーを SUZAKU に設置しました。
今回は、、、ベンダーも自分で作ってみました。正式版はどれも 8 ダンスセットの登録が可能で、今回は 3 人分のフルバージョンも用意してみました。
Pay 方式にして、3人用(300L$)、6人用(600L$)、15人用(1,500L$)、30人用(3,000L$)から選ぶことができます。
もちろん、1L$ の3人用(2ダンススロット)のお試し版のベンダーもそのまま設置しています。
本日 11月2日 午後8時30分~午後9時15分の予定で LSL コンベンション 2008 Japan のアイテムデモ "MLDU4 ~ダンスアニメーションを本当に楽しませるのはスクリプターのお仕事~" 無事終了しました。担当の Miya さん、事前の準備で付きあわされた(笑)お友達、今日参加してくださった皆様、本当にありがとうございました。 あ、あと、この機会を作ってくれた Nullpo さんにも感謝。
ダンススクリプトって、正直地味な制御系の範疇なので、、、ダンススクリプトがあっても「ダンス アニメーション」が無ければただの箱(もとい、、玉w)ですし、ビジュアル系(動きが派手なものとか)のスクリプトと違って、、、手間がかかる割にはあまり見た目がわかりづらいですよね。
そこで、アイデムデモは前半はスクリプトの説明とかちょっとしたテクニックをパネルでご紹介して、後半は実際に踊ってもらう方式にしてみました。踊ってもらったほうがわかりやすいw
実はデモで使った My MLDU には 145 のダンス アニメーションが入っているのですが、もちろん Studio4D スペシャルでやってみました。
といっても、、、シンクロダンス(同期ダンス)とか、ご紹介してきた時間差ダンスを踊ってもらうだけじゃ、、、参加型じゃないので面白くありません。 そこで一応シンクロ、時間差をやったあとで参加型にしたのが通称「はないちもんめ」。
15人の方にダンスを踊ってもらっていたので、5人1組の同じダンスを踊るグループを作ると全部で3組できるわけです。で、「同じダンスを踊っている人を見つけて、そばに寄ってみましょう~」という、、、ある種、合コンのゲームのような(笑
仕組みは時間差とシャッフルを組み合わせたものです。
1) 15人の参加者を3組にわけるには、サイクルを 3 に設定します。すると、ダンススロットは以下のような「グループ番号」を持ちます。
ダンススロット番号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
グループ番号: 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2
グループ番号 0 の人は同じタイミングで、同じダンスを踊ります。つまり、ダンスの開始は グループ番号 0, 1, 2, 0, 1, 2, 0 .... と繰り返します。
2) シャッフルモードをオンにして、各グループ番号のダンスをばらばらにする
シャッフルモードをオンにすると、本来同じダンスを時間差で開始するものが、時間差のたびに違うダンスを選ぶようになります。llFrand を使ってるので必ず違うもの、、、とは限りませんが、ダンス アニメーションがそこそこ入っている状況であれば、かなりの確率で違うものになります。(もちろん、llFrand の指定はセットのダンス アニメーション数の上限をきちんと指定しています)
そうすると、グループ0、グループ1、グループ2 の人たちが踊るダンスを違うものにすることができるわけです。
3) で、あとは「同じダンスを踊っている人を探しましょう~」と皆さんに呼びかける。
結構楽しんでいただいたようです。意外に、、、同じダンスってみつけづらかったりするんですよ。
MLDU4 は踊りながらサイクルをどんどん変更することができます。なので、サイクル 3 を今度はサイクル 5 にすると、3人一組のチームが15人いたら5つできるわけですよね。
これを応用して、3人のときにサイクル2にすると、2人が同じダンス、1人が違うダンスを踊ることになります。
同じダンスを踊っている人たちが両サイドにくると、まるでアイドルのバックダンサーのような踊りを踊ることができます。
MLDU4 RC は 11月3日の夕方くらいには「正式版」となって SnuLib で販売開始になる、、、予定です。
3人/2ダンスセットは 1L$ のお試し版で、正式版は 6人/8ダンスセットが 600L$, 15人/8ダンスセットが 1,500L$, 30人/8ダンスセットが 3,000L$ でご提供させていただく予定です。 50人/8ダンスセットや、カスタムは IM (もしくは、ここのメールを送る)でお問い合わせください。
[追記]
正式発売しました。ベンダーを SUZAKU に設置しました。
今回は、、、ベンダーも自分で作ってみました。正式版はどれも 8 ダンスセットの登録が可能で、今回は 3 人分のフルバージョンも用意してみました。
Pay 方式にして、3人用(300L$)、6人用(600L$)、15人用(1,500L$)、30人用(3,000L$)から選ぶことができます。
もちろん、1L$ の3人用(2ダンススロット)のお試し版のベンダーもそのまま設置しています。
登録:
投稿 (Atom)