2007年8月アーカイブ

苦戦中なのです・・・

| コメント(4) | トラックバック(0)

ここ2週間くらい、スクリプトと格闘しています。

何を作ろうとしているかと言いますと、
「フルパーミッションでないアニメファイルを1クリックで動かすツール」
です。

といいますのも、最初から入っているアニメやフリーで売っているようなフルパーミッションのアニメはゼスチュア登録するなど、1つの動作で簡単に再生できますが、そうでないものは、いちいちインベントリーからダブルクリックで開き、さらにダイアログでクリックしなくてはいけません。

私の売っている空手アニメも、1クリックでバシバシと使えた方が楽しいに違いないのですが、今のSLの仕様ではそれができません。

ということで、
「フルパーミッションでないアニメファイルを1クリックで動かすツール」
を作ろうと思った次第です。

と言いましても私、スクリプトを書くのはまったく素人で、「できれば避けて生きていこう」と思っていました。
ゼロから自分で作るのはさすがに無理な気がするので、人様のサイトを探し歩いてみました。

で、見つけたのがご存じ「Makapu」、の中の以下のページです。
http://miz.slmame.com/e2514.html

この中で紹介されている以下のスクリプトを、まずはHUDとして使ってみようと思いました。
=====================================
string animation_name="boogie";
key agent = NULL_KEY;

default {
touch_start(integer detected){
if (agent == NULL_KEY) {
agent = llDetectedKey(0);
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION);
}
}

run_time_permissions(integer perm) {
key perm_key = llGetPermissionsKey();
if (perm_key == agent) {
if (perm & PERMISSION_TRIGGER_ANIMATION){
key chk = llGetInventoryKey(animation_name);
list anms = llGetAnimationList(agent);
integer i;
for (i = 0; i < llGetListLength(anms); i++){
if (chk == llList2Key(anms, i)) {
llStopAnimation(animation_name);
agent = NULL_KEY;
return;
}
}
llStartAnimation(animation_name);
}
agent = NULL_KEY;
}
}
}
=====================================

HUDはとりあえずテスト用という事で、デザイン性は無視して以下の画面の右下のようなシンプルなものを用意しました


この緑の球のインベントリの中に、上のスクリプトと、テスト用のポーズアニメ(no copy, no mod)を入れ、1行目の"boogie"をポーズアニメの名前に変更します。

すると、おお、動きます。フルパーミッションでないアニメでもこれなら動きます。

でも、難点がいくつか・・・

1、アニメ開始する前に、必ずダイアログボックスが開き、クリックしてから動く。
2、本来はもう一度クリックするとループ解除されてポーズを止められるはずなのが、何度押しても止まらない。
3、複数のアニメを動かすために複数ボタンを持ったツールにしたいので、いちいち"boogie"を書き換えるのが面倒。

まず1、については、そもそもの趣旨からしてダイアログを毎回押すのであれば作る意味がないので、なんとか解決したいところ。で、あれこれ調べたのですが、あるサイトで、
「本人にアタッチした装備品の中のアニメであれば、ダイアログが出ない」
というようなことが書いてあったのを思い出し、背中にアタッチしたボールにスクリプトとアニメーションを入れたところ、ダイアログが出なくなりました。(画像の中の背中の球)

なるほど、HUDではないけど、アバターの背中をクリック、でコントロールするのも面白いかな、と、これはこれでOKと考えることにしました。邪魔ならボールを透明にしてしまってもいいし、いずれもっと恰好の好いものを作ってもいいし。


次に、2、ですが、どうしてこれが利かないのか分からず、あれこれ試したところ、フルパーミッションのアニメであれば機能することがわかりました。
あるサイト(すみません、どこだか忘れました)の記述によれば、

llGetInventoryKey(animation_name);

の関数は、インベントリ内(この場合、球のコンテンツ内)のアニメーションがフルパーミッションでない場合、NULLキーを返す、とのことでした。

そうすると、
if (chk == llList2Key(anms, i))
がいつまで経っても成立せず、ポーズを止められない、ということなのかな?と考えました。

で、動作中のアニメとインベントリ内のアニメを照合する、という方法をあきらめ、スイッチで切り替える方法を試そうと考えてみた次第です。

あと、3、についても、
llGetInventoryName
という関数で、インベントリ内のアニメの名前が取得できるらしいので、
animation_name = llGetInventoryName(INVENTORY_ANIMATION , 0);
という形で、球の中に置いたアニメの名前を自動的に取得できないかと考えました。

で、2と3の対応策を加え、さらに、背中の球を他人が触っても動作しないように
if(llDetectedKey(0) == llGetOwner())
を加えたのが、以下のスクリプトです。

===========================================
string animation_name;
integer counter = 0;
key agent = NULL_KEY;

default
{
touch_start(integer detected)
{
if(llDetectedKey(0) == llGetOwner()) //自分以外のタッチを受け付けない
{
animation_name = llGetInventoryName(INVENTORY_ANIMATION , 0); // インベントリ内の1つ目のアニメの名前を取得し、animation_nameへ代入
if (agent == NULL_KEY)
{
agent = llDetectedKey(0); // 触った人のキーを取得
llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION); //agentにアニメパーミッションを取得
if (counter == 0)
{
counter = 1;
}
else
{
counter = 0;
}
}
}
}

run_time_permissions(integer perm)
{
key perm_key = llGetPermissionsKey(); //変数perm_keyにパーミッション対象者のUUIDを代入
if (perm_key == agent) // agentとperm_keyが同じキーだった場合
{
if (perm & PERMISSION_TRIGGER_ANIMATION && animation_name != "")
{
if (counter == 1) //counterが1だった場合
{
llStartAnimation(animation_name); //animation_nameを実行
}
else //0だった場合
{
llStopAnimation(animation_name); //animation_nameを停止
}
}
agent = NULL_KEY;
}
}
}
=========================================

しかし、動かない・・・・・・・(涙)。

いろんなパターンを試したのですが、どうも、インベントリ内のアニメ名を取得できていなさそう・・・。

そして、その機能をはずして、手書きでアニメ名を書き込む形にしても、動かない・・・
ということは、if (counter == 1) を使ったスイッチも機能していない???

うーん、そろそろスクリプト素人としては限界か・・・

どなたか、アドバイスいただけませんでしょうか?

一応まとめますと、今残っている課題は・・・

2、本来はもう一度クリックするとループ解除されてポーズを止められるはずなのが、何度押しても止まらない。
3、複数のアニメを動かすために複数ボタンを持ったツールにしたいので、いちいち"boogie"を書き換えるのが面倒。

の2つです。

どうぞよろしくお願いいたします。。m( _ _ )m

阿波踊りアニメ

| コメント(4) | トラックバック(2)

吉祥寺SIMでの夏祭り、なかなか盛況でした。
私は最終日17日の夜に少しだけ入れたんですが、たぶんSIMの人数制限オーバーしてたんじゃないかと思います。

で、盆踊りの方も満員でした。
私の作った阿波踊りアニメで大勢の人たちが踊っているのは、けっこううれしいものでした。

吉祥寺SIMのスタッフの方から参考ムービーをもらって作ったんですが、男踊りと女踊りがあって、けっこう違う動きをするのには初めて気付きました。今まで知ってる阿波踊りは男踊りのイメージでした。

女踊りはけっこう可愛らしいというか、日本的な色気があるというか、これはこれで粋なものだな、と感じました。腰のひねりと、膝を内側にひねり込み(?)ながら足を後ろに跳ね上げる動作、これをメリハリつけて見せられるように、と注意したつもりです。

で、かねてから予告しておりました通り、せっかくなので販売してみようと思います。
私の3つのお店に販売機を設置しましたので興味のある方は行ってみてください。
(お店へは左のバナーからどうぞ)

動画もアップしておきます。

Poser講座1

| コメント(0) | トラックバック(2)

ようやく吉祥寺SIMのイベント用アニメの制作を終えました。
イベント本番は17日から19日だそうで、ちょうど私は田舎に帰っているため参加できません。興味ある方はぜひのぞいてみてください。

さて、言っていんだかどうだかわかりませんが、私が作ったのは阿波踊りのアニメです。

とりあえず本番前なので動画は見せられませんが、こんな感じです。Japan03の公園で踊ってみました。ローカルアニメなので他人には見えないはずです。

男踊りと女踊りがあるんですね。初めて知りました。イベント終了後には私のお店で販売する予定です。空手と関係ないですが、日本の夏ってことで・・・

さて、今回作った中で、改めて少し大事っぽい点を書き記しておこうと思います。

Poserを使っている人はご存じのことと思いますが、SL用アニメを作る場合、1フレーム目はデフォルトの状態にする必要があります。すべての関節がゼロの状態ですね。(連結パラメータ編集→ゼロフィギュアでできます)

で、普通はこの後、2フレーム目以降に主要な動きのところでキーフレームを打ちます。2Dアニメでいうところの原画の部分ですね。

上の流れで一通り、2フレーム以降に主要なキーを打ったところで、キーの間を補完していきます。

さて、この時、上の画像では2フレームのキーと12フレームのキーの間をスプラインで保管しています。
これは、モーションがなだらかな曲線を描くようにつなぎ、動きを滑らかに見せるための補完方法です。
上の画像の中で緑になっているのがPoserでのスプライン補完を表しています。

で、次のフレームに移動すると・・・

このように、大変なことになっています。
さて、どうしてでしょうか?

原因は、1フレーム目にゼロフィギュア状態のフレームがあるからです。
スプライン曲線をグラフで確認してみましょう。

これは腰の動きのグラフですが、本当は2フレームから12フレームまでを青い曲線のように移動させたいのです。しかし、御覧のように下に大きく膨らんでしまっています。
これは、スプライン曲線が、すぐ前のキーの影響を強く受けるからです。直前にまったく違うポーズをとっているため、3フレーム以降に大きく影響してしまうのです。

で、これを避ける方法ですが、多くの場合、スプラインを使うのをあきらめ、下記のように直線でモーションをつなぐケースが多いと思います。オレンジの部分が直線でつないだことを表しています。

しかし、これって、本来の人間の動きから言うと自然ではないですね。直線的なスピードで手や足を動かす、ましてや機械のように平坦なスピードで踊る人はいないでしょう。

やはり、スプラインでつなぎたいところです。

そのためには、2フレーム目をすべて選択し、「スプライン解除」ボタンを押します。

すると、上のように、そのフレームの前の影響を受けなくなります。

じつは、つい先ほどこのボタンの意味に気付きました。

それまでは、、、すみません、「スプライン解除」ボタンを使わない別な手法を書いていましたが、修正させていただきました。

ふぅ

もろもろご報告

| コメント(1) | トラックバック(0)

Willam7です。

まずは前回の記事の続きです。

SLmameの質問ページで、
「ジェスチャーですが、購入したものですとフルパーミッション(Copy、Mod、Trans)じゃないと設定出来ないです。」
という記述を発見しました。
http://oshiete.slmame.com/e21406.html

情報元は分からないのですが、結果としてはどうやらそういうことのようです。

ということで、改めてすみません、なのですが、ショートカットに変わるHUDが作れないか研究してみようと思います。まだ全然そっちの方はやってみたことないので、本当にできるのかどうか?その際にパーミッションは問題にならないか?など、これから調べることになりますが、まずはやってみようと思います。

さて、次のご報告ですが、吉祥寺SIMの駅前店の方、昨日をもちまして閉店いたしました。もともとオープン直後のみの短期間で、というお話でしたので昨日商品など撤去させていただきました。
ご利用いただいた皆様、どうもありがとうございました。

>Natsuさん
たしか吉祥寺駅前店をご利用いただいたり、ブログで紹介してくださっていたと思います。どうもありがとうございました。上記のようなことになりましたが、同じ吉祥寺SIMの端っこに2号店がありますので、よろしければまたお立ち寄りください。

あと、今、吉祥寺SIMでのイベントに使うアバター用アニメの制作を頼まれましたので、夜中にヒィヒィ言いながら作ってます。

夏休み中のイベントでお披露目になると思いますのでお楽しみに。

以上、ご報告でした。

William7です。

すみません。

Natsuさんからご指摘いただいた点(no copyだとゼスチュア登録の際にプルダウンに出てこない)、いろいろ調べてみました。

2体のアバターを別なPCで操りながら何パターンもパーミッションを変えて渡し、ゼスチュア登録できるか実験してみたところ、フルパーミッションでないとプルダウンに出てきませんでした。

ということは、実質的に自分で作ったアニメか、フルパーミッションで無料配布しているものくらいしかゼスチュアにできないってこと???みたいです。

いろいろサイトを調べてみているんですが、これについて書かれているものがありません。もう少し調べてみようと思いますが、いったん、ここに書いていましたポーズの利用についての記事については削除させていただきます。

すみません。
今のところ、自分でショートカットへのアサインをお勧めしておきながら、かなり心苦しいです。

また調べつつ、別な方法(HUD?)で実現できないかなど、研究してみます。


では、取り急ぎお詫びとご報告でした。

公式サイト

筆者プロフィール

William7 Streeter

セカンドライフの中でアニメーションを販売しています。 昼は普通の会社員で、Web制作やCG制作の仕事をしています。 昔やっていた空手の経験を活かし、空手のアニメをたくさん作っています。