お使いのブラウザは最新版ではありません。最新のブラウザでご覧ください。

CNET Japan ブログ

Second Life (セカンドライフ) - インビジプリム(透明化プリム)で「ありえない」アバターを実現

2007/09/23 17:20
  • このエントリーをはてなブックマークに追加

ミキ・オキタWebClip ウェブデザインのニュース


「ありえない」アバターを実現するインビジプリム(透明化プリム)

こんにちは。“時代の3歩先をねらうWeb屋さん”ミキ・オキタです。
このブログ「WebClip ウェブデザインのニュース」では、Webデザイン・Webマーケティングの話題をお届けしています。最近はSecond Life (セカンドライフ)が中心です。

Second Life (セカンドライフ)で、時折、人間の形状を保っていないアバターを見かけます。
ぬいぐるみやガイコツなど、本来の身体の一部を「消している」アバターたち。

僕も創りたいアバターがあって、別のオンラインゲーム「女神転生IMAGINE」に出てくる「エアロス」というキャラクター。
「エアロス」には下半身がない。

そこで、アバターの身体を消す方法を調べた。

アバターの身体は、通常のスキンでは消すことができません。
インビジプリム(Invisiprim・透明化プリム)というものを使うことで、これを実現することができます。

インビジプリム(透明化プリム)についてGoogleで検索したところ、oitake氏のブログとAsuka Neely氏のブログに整理された記事があった。

oitake氏のブログ
oitake blog - Second Life:インビジプリムで頭を消す!
(この方のセンスは素晴らしい!)

Asuka Neely氏のブログ
Scripter Syndrome - インビジブルプリム

しかし、肝心のスクリプトの本体が見つからない。
何故このスクリプトで透明化するのかもわからない。

仕方ないので、海外サイトを翻訳(意訳)して、インビジプリム(透明化プリム)の情報をまとめてみた。
例によって、あくまでも英語の素人が訳したもので、正確性には責任は持てない点はご了承いただきたい。

それと・・・ここが重要なところだけど、以下に集めたスクリプトは、エラーこそ出ないものの、いずれも「正しくない」可能性がある。
理由は僕の見解も含めて最後に説明する。とりあえず慌ててコピー&ペーストなどで利用しないでね。

翻訳 - リンデンスクリプト言語 Wiki : インビジプリム(透明化プリム)

まずは海外の公式LSL Wikiから。まず断っておくが、スクリプト部分はおそらくおかしい。

翻訳ソース: LSL Wiki : Invisiprim
2007年9月22日(土) (日本時間) 時点の記事を翻訳

ここから翻訳 - - -

インビジプリム(透明化プリム)

インビジプリム(透明化プリム)は、テクスチャやUUID(Second Life上のすべてのものに一意に割り振られている番号)を用いてオブジェクトを完全に透明にするスクリプトです。これをオブジェクト内に入れると、そのオブジェクトを透明化し、更にそれを通して見えるものを透明化します。
※注意:プリムを「完全に」透明化してしまうので、あなたは「透明オブジェクトを強調表示する」機能を使っても見ることができません。

///////Created by Joker Opus, November 8th//////
//Feel free to mod this, do not steal//

default
{
state_entry()
{
key owner = llGetOwner();
llListen(0,"",owner,"");
llSetTexture("38b86f85-2575-52a9-a531-23108d8da837", ALL_SIDES);
llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES); //This is all the textures and functions that formulate the invisiprim
llSetPrimitiveParams([PRIM_BUMP_SHINY, ALL_SIDES, PRIM_SHINY_NONE, PRIM_BUMP_BRIGHT]);
llOffsetTexture(0.468, 0.0, ALL_SIDES);
llScaleTexture(0.0, 0.0, ALL_SIDES);
llSetAlpha(1.0, ALL_SIDES);
llSetTimerEvent(5);
}
listen(integer channel, string name, key id, string msg)
{
if( msg== "uncloak" )
{ //When you say uncloak, it will go back to a non-invisiprim.
llSetTexture("4c1ce202-4196-f1c1-0409-367b3a71543e", ALL_SIDES);
}
}
}

質問:どうしてllSetTexture関数を直後に2回使用しているのですか? 2回目は最初のを上書きしているように見えます。llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES)だけで充分ではないのでしょうか?

質問:llSetTimerEventを使用しているが何故かわかりません。対応するイベントハンドラが存在しませんが?

以下のスクリプトはほぼ同じことを行っていますが、あえて説明します。オブジェクト内に入れると、そのオブジェクトに触れると見える状態になり、次に触るとまた透明になります。

// Created by Opus Beck 9 aug 2007

default
{
state_entry()
{
llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES); // This is one of the invisiprim textures.
llSetAlpha(1.0, ALL_SIDES);
}
touch(integer num)
{
if( llDetectedKey(0) == llGetOwner() )
{ //When touched, it will go back to a non-invisiprim.
state blank;
}
}
}

state blank
{
state_entry()
{
llSetTexture("4c1ce202-4196-f1c1-0409-367b3a71543e", ALL_SIDES); // This is the 'Blank' texture
llSetAlpha(1.0, ALL_SIDES);
}
touch(integer num)
{
if( llDetectedKey(0) == llGetOwner() )
{ //When touched, it will go back to an invisiprim.
state default;
}
}
}

インビジプリムのテクスチャーはアルファ値(透明度)が1.0より小さいすべてのオブジェクトとアバターを透明にします。そのため、もしあなたがそれを装着して雲のなかを旅行すると、あなたの存在に気づかれてしまうでしょう。あなたと一緒に雲もインビジプリムに覆われて、隠されていまうためです。

ここまで翻訳 - - -

中ほどにある2つの「重要な」質問への回答は放置されている。

翻訳 - アバターの道具箱 - インビジプリム(透明化プリム)

インビジプリム(透明化プリム)の歴史から体型的にまとまっていてわかりやすい。しかし、やっぱりスクリプト部分は変。この記事を見ると、どうやら最初に作成されたインビジプリム(透明化プリム)に由来する問題と思われる。

翻訳ソース: Avatar Toolbox - Invisiprims
2007年9月22日(土) (日本時間) 時点の記事を翻訳

ここから翻訳 - - -

インビジプリム(透明化プリム)って何?

インビジプリム(透明化プリム)は、他のプリムは見えるままで、アバターの身体を透明にします。インビジプリムの最も多い用途は、プリム製の靴と人間以外のアバターです。通常のプリムのように、インビジプリムは複雑な装着物にリンクすることができます。通常のオブジェクトと同じように地面に置いたとき、それは透明で、アバターの身体がその中または背後にきたら隠します。

Beatfox Xeviousがすべての使用制限を許可したインビジプリムを公式に発表しました。以下の文章は、Beatfoxがそのプリムと一緒に発表したノートカードから引用しています。

Second Life (セカンドライフ)には、UUIDでのみ利用することができ、他のテクスチャにはできない特性を持つ、いくつかの特別なシステム用のテクスチャあります。これらのテクスチャを用いたプリムは、いかなるアバターのテクスチャと透明度を持つテクスチャを内側または背後に完全に透明にすることができます。透明度を含まない通常のテクスチャには影響しません。これは透明でない装着物には影響に与えずに、アバターの身体やその一部を隠すのに便利です。昆虫の足、ガイコツ、幽霊など、うってつけです・・・どこまでも!

注意:水や木は透明部分を持つテクスチャですので、インビジプリムによって隠されます。また、このプリムを経過して見た空は少々変色をします。加えて、光る/凹凸のあるオブジェクトは、オブジェクトが見えるようになるにもかかわらず、光らなく/凹凸がなくなります。

インビジプリム(透明化プリム)を使う

インビジプリム(透明化プリム)を使う作業はチャレンジです。CTRL+ALT+Tを押しているあいだは、透明なオブジェクトが見えるようになりますが、これはインビジプリムには働きません。あなたが編集モードでALTを押しても、それらは赤くなりません。(理由? 「赤」は透明度のあるテクスチャにだけ現れるからです)。しかし、あなたはプリムで背景を作ることができます。あなたが背景をちょっと透明にすると(「テクスチャ」タブの「透明度」を使って)、インビジプリム(透明化プリム)は見えるようになります。

私がよくやるのは、普通のベニヤ板のオブジェクトを装着物の場所に置いて、隠したいアバターの部位を覆うだけのサイズにします。それからインビジプリム(透明化プリム)のスクリプトを仕込んでインビジプリムにします。もし同じ透明なテクスチャを使っていて同じ再描画時間を持っていない他のインビジプリム(透明化プリム)が同じ描画領域にあっても、スクリプトは編集しないでください。透明化が正しく動かなくなります。

プリムを元あった場所に戻すのにCTRL+Zが便利です。あなたの装着物の残りを作業しているあいだ、インビジプリム(透明化プリム)を邪魔にならないところに動かしておくのは、私は最後によくやることです。

Second Life(セカンドライフ)のサービスチームは、完全に透明なアバターの使用は禁止すると説明しています。やらないようにしましょう。あなたはいつでもアバターの一部か、身に着けたプリムを見えるようにすべきです。

インビジプリム(透明化プリム)のスクリプト

// Invisibility Prim Refresh v1.1a
// by Beatfox Xevious
// last updated Oct. 21, 2004

refresh()
{
llSetTexture("38b86f85-2575-52a9-a531-23108d8da837", ALL_SIDES);
llSleep(30);
llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES);
}

default
{
state_entry()
{
llSetPrimitiveParams([PRIM_BUMP_SHINY, ALL_SIDES, PRIM_SHINY_NONE, PRIM_BUMP_BRIGHT]);
llOffsetTexture(0.468, 0.0, ALL_SIDES);
llScaleTexture(0.0, 0.0, ALL_SIDES);
llSetAlpha(1.0, ALL_SIDES);
llSetTimerEvent(5);
}

timer()
{
if ((integer)llGetWallclock() % 60 < 10)
{
refresh();
}
}
}

ここまで翻訳 - - -

翻訳 - SLフォーラム - 透明化スクリプトについての疑問・・・

SLフォーラムに投稿された質問とその回答。Asuka Neely氏のブログに書かれたリンクより。

翻訳ソース: SL Forums - Invisible Script question...
2007年9月22日(土) (日本時間) 時点の記事を翻訳

ここから翻訳 - - -

#1 07-15-2007, 04:26 AM, Ecks Bowman, 透明化スクリプトについての疑問・・・

どこに投稿すればよいかわからなかったので、もし場所を間違っていたらごめんなさい。

私は激しく光る腕や、足を持つアバターをつくることを考えています。なので、アバターの形状の一部を隠す必要があります。私はプリムに透明化スクリプトを使うことを知っていますが、しかし、身体中を覆う巨大なひとつのプリムを使うことが良いアイデアでしょうか? それとも、多くの人はどうやっているのでしょうか? たとえばロボットのアバターとか。
これを説明して欲しいです。
よろしくお願いします。

#2 07-15-2007, 05:01 AM, Johan Laurasia, 無題

どうするのかよくわかりませんが・・・。ただ、一般的にはあなたが完全にアバターの「本当の」身体の部位を隠し、プリムで置き代えるのだと思います。これはあなたが言っていたスクリプトです。それはアバターの身体を隠し、プリムには影響しません。それは実際よく働きます。もしあなたが望むなら、あなたの名前表示すら隠すことができます。

// Invisibility Prim Refresh v1.1a
// by Beatfox Xevious
// last updated Oct. 21, 2004

refresh()
{
llSetTexture("38b86f85-2575-52a9-a531-23108d8da837", ALL_SIDES);
llSleep(30);
llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES);
}

default
{
state_entry()
{
llSetPrimitiveParams([PRIM_BUMP_SHINY, ALL_SIDES, PRIM_SHINY_NONE, PRIM_BUMP_BRIGHT]);
llOffsetTexture(0.468, 0.0, ALL_SIDES);
llScaleTexture(0.0, 0.0, ALL_SIDES);
llSetAlpha(1.0, ALL_SIDES);
llSetTimerEvent(5);
}

timer()
{
if ((integer)llGetWallclock() % 60 < 10)
{
refresh();
}
}
}

#3 07-16-2007, 09:07 AM, Kaluura Boa, そのスクリプトは何?

引用:Johan Laurasiaの原本

// Invisibility Prim Refresh v1.1a
// by Beatfox Xevious
// last updated Oct. 21, 2004

refresh()
{
llSetTexture("38b86f85-2575-52a9-a531-23108d8da837", ALL_SIDES);
llSleep(30);
llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES);
}

default
{
state_entry()
{
llSetPrimitiveParams([PRIM_BUMP_SHINY, ALL_SIDES, PRIM_SHINY_NONE, PRIM_BUMP_BRIGHT]);
llOffsetTexture(0.468, 0.0, ALL_SIDES);
llScaleTexture(0.0, 0.0, ALL_SIDES);
llSetAlpha(1.0, ALL_SIDES);
llSetTimerEvent(5);
}

timer()
{
if ((integer)llGetWallclock() % 60 < 10)
{
refresh();
}
}
}

ハッキリ言って、このスクリプトはジョークだよね?

default
{
state_entry()
{
llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES);
}

}

これが私のインビジプリム(透明化プリム)をつくるときのすべてです。一度実行したそのスクリプトを削除しても、プリムにアバターは隠れたままです。

私の推理が全部間違いでなければ、私はインビジプリム(透明化プリム)をつくるために実行し続けるスクリプトを入れる目的がわかりません。あなたはすべてデフォルト設定の「新規の」プリムを使わなければならなくなってしまいます。

Ecks Bowmanへの回答: あなたのアバターの形状次第です。もしあなたのアバターがぺちゃんこなら、1プリムで充分でしょうが、他人のアバターを隠さないようにしたり、あなたのシルエットのまわりの装飾を駄目にしないためには、アバターの形状にできる限り近いようにいくつかのプリムを使ったほうが良いでしょう。

ここまで翻訳 - - -

正しいインビジプリム(透明化プリム)のつくり方は?

さて、冒頭にも言いましたが、翻訳してきたスクリプトには共通して変なところがあります。

1.慣習的に、透明化のテクスチャは2重に上書きして呼び出している。
2.また、慣習的に、一定時間ごとにテクスチャを呼び出している。
2.実は、そんなことをしなくても透明化は動作する。

実際に検証してみた。

まず、どのスクリプトも、実装してみるとエラーは発生せず、きちんと透明化も動作する。
更に言うと、最後の翻訳にある、一行だけのスクリプト「llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES);」でも、確かにちゃんと動作しているように思える。

その上で、最後の記事あった「一度実行したスクリプトを削除しても、プリムにアバターは隠れたまま」という気になるくだり。

スクリプトを削除しても動き続ける
ためしにやってみたら、本当に削除しても動き続けた。
いったんTakeでインベントリに戻して、再度地面に置いても、問題なく動作している。

ということは、どうやらインビジプリム(透明化プリム)の本質はスクリプト部分ではなく、このテクスチャにあるらしい。
スクリプトを読んでも、それが核で、あとの部分はテクスチャの描画を補助するものとして理解すると納得しやすい。

では、2重にかぶせられているテクスチャはなんだろう。
それぞれを貼りこんだプリムを作成してみた。

ふたつのテクスチャは同じ
どちらでも、透明化がきちんと動作している・・・。

何も差はないように思える・・・。
正直、どちらのテクスチャを使っても良さそうだ。更に言えば、一度スクリプトを使ってプリムに張り込んだら、スクリプトは削除してしまっても良い気がする。

もし、2種類のテクスチャを交互に呼び出している理由を無理やり推測するなら、例えば、このテクスチャが何かのタイミングで動作しなくなる場合(あるいは解除される場合)があるので、その対策として定期的に交互に再読み込みしている、とかだろうか。
または、このスクリプトが最初に書かれた2004年10月時点では、このような実装でないと動作しなかったか。

考えるライオン
悩むミキ・オキタさん(最近、「考える人」のポーズ創りました)。

まとめ:インビジプリム(透明化プリム)とは

まとめると、インビジプリム(透明化プリム)の本質は次のようなものです。

1.Second Lifeがシステム的に用意している「特殊な」テクスチャをプリムの表面に貼りこむ。

2.この「特殊な」テクスチャを通して見ると、アバターの身体と、アルファ値(透明度)が1.0(完全な不透明)未満=つまり少しでも透けているオブジェクトは見えなくなる。パーティクルも同様。

3.この「特殊な」テクスチャはシステム的に用意されているものなので、UUIDをLSL(リンデンスクリプト言語)から直接呼び出す方法でないと利用することができない。





アクセスカウンタ:

※このエントリは CNET Japan ブロガーにより投稿されたものです。朝日インタラクティブ および CNET Japan 編集部の見解・意向を示すものではありません。
運営事務局に問題を報告

最新ブログエントリー