無謀なチャレンジ

  • 2008/09/03(水) 01:14:45

こないだの日曜日は出勤だったために、今日(9/2)は代休だよ〜ヽ( ´∀`)ノ

で、8/15のブログで女アバいじってたら思いの他いい出来になってしまったので、調子ぶっこいてスキン作りにチャレンジしてみましたよ。

最初はIN-Worldのアバターにテンプレートを貼り付けて比較しながらフォトショで作成していったのですが、確認のために一々アップロードするのが面倒臭い&アップロード代がバカにならない><;



しかも、キモいorz
キモいので写真小さくしましたw

で、ふと思ったのがPOSERでアニメを作る際に使ってるアバターのオブジェクトファイルがあるではないかと。



http://secondlife.com/community/avatar.php
の「avatar_mesh.zip」がそれです。

アバターのオブジェクトファイルを「メタセコイア」などの3DCGソフトで読み込ませると、基本姿勢のアバターが登場しますね。




こうなればシメたもので、頭、上半身、下半身にそれぞれスキンテクスチャーを関連付けしておいて、平行してフォトショで編集していきます。
こういうときはデュアルディスプレィ環境は便利ですねぇ〜(^^
オフラインである程度当たりを付けておいて、IN-Worldで実際の見え方を確認すれば無駄なアップロード代も節約できますね。

え? 今更ですか? そうですか・・・



それにしても、体の陰影を描くのは想像以上に大変だぞ><;
おまけに「どこ」とは言いませんが微妙なパーツもあるし・・・
途中で心が折れそうになったのはヒミツだ。

とりあえず、顔の基本(ほぼスッピン)と上半身前部だけひとまず完成。




完成するのはいつになるやら・・・

Trudeauヨットにオリジナルの名前を入れる方法

  • 2008/06/22(日) 18:24:11

「SeaIsland」は海洋SIM群ゆえに、住民の多くが何かしらの船を持っています。

その中でもTrudeau Classic Sailing Yachtsで販売されているヨットは作りの良さから愛好者も多く、船名、船籍をオリジナルの物に変えることができます。




今までは作者にお願いして変えてもらっていたのですが、作者のブログにも書いてあるように「受付辞めたから、お前らで勝手にやってね〜(はぁと)」って具合でテンプレートの公開と変更方法の解説が記載されています。

ところが、何せ英語なので「良くわかんね〜よ」という声を耳にしたので、勝手ながら良く分からない日本語で解説です(マテ

まず、上のブログからテンプレートをダウンロードして解凍したらPhotoShopなどのグラフィックエディターで開きます。
なお、テンプレートはPSDなのでPSDファイルが開けて、アルファチャンネル適用でTargaファイル保存できれば何でもかまいません。

※せっかくコメントくれたユミさんから、Photoshop5.0Jではテキストの編集が出来ないことが分かりました。
原因は、一度ラスタライズ(テキストをグラフィック化すること)されたテキストを5.0Jでは編集できないからです。
検証したところ、7.0J以上なら出来そうです。


<補足2>
PhotoShop7.0では標準だとtarga形式で保存すると、アルファチャンネルが失われます。

http://www.adobe.com/support/downloads/detail.jsp?ftpID=1544

から「targa.zip」をダウンロードして解凍し、「Targa.8BI」をPhotoShopインストールフォルダーの「プラグイン」フォルダー内の「ファイル形式」フォルダーに入れます。
(例)C:Program FilesAdobePhotoshop 7.0プラグインファイル形式

新しいのと置き換えるか聞いてきますので「はい」とします。
これで、アルファチャンネルを保持したまま「Targa」形式で保存できます。

 
また、自分が所有しているのは「BlueWater」なので、以後の説明も「BlueWater」を基準にしています。




左下のレイヤーの上4つが船名、船籍なので、これを変更します。
上が白い船体用、下が黒い船体用です。
テキストツールを使ったり、レイヤースタイルを使ってカッコよくしてください(^^
くれぐれも船体ガイドからはみ出さないように気を付けます。




上手く変更できたら、船体ガイドを非表示にします。




「メニュー」の「選択範囲」から「色域指定」で、背景の緑色を選択します。
そうすると、文字部分を避けて範囲選択されるので、さらに「選択範囲」の「選択範囲を反転」で文字のみを選択します。




右下に見えるレイヤーメニューから「チャンネル」タグをクリックして、一番下にある「Alpha1」を削除します。




そのあと「選択範囲をチャンネルとして保存」をクリックすると、選択部分が白塗りされた新しい「アルファチャンネル」が作られます。




そしたら、「RGB」レイヤーをクリック後、「レイヤー」タブをクリック。
「Green MASK」も非表示にして、「ファイル」「別名で保存」から、「Targa」形式で保存します。
このとき、「アルファチャンネル適用」にチェックを入れて、32bitの圧縮なしで保存することを忘れないでください。




ここまで出来たら、いよいよIN-Worldでの作業です。
まずは、先ほど作ったテクスチャーをアップロードします。
ちゃんと出来ていれば、背景が透明で文字だけのテクスチャーになっているハズです。




船を編集モードにして、編集オプションで「リンク部位を編集」「テクスチャーを選択」を選び、名前の入った面を選択します。
この際、文字のある辺りをクリックすると船底が選択されてしまうので、上の枠あたりをクリックすると上手く選択できます。




先ほどアップロードしたテクスチャーを選択適用すると、名前が入れ替わります。




あとは、船のオブジェクト名を好きな名前に変更して、コピー保存すればセカンドライフに一隻のマイヨットの出来上がりです。

お疲れ様でした。

素人スクリプト講座(3)

  • 2008/03/09(日) 02:21:19

以前、「素人スクリプト(2)」でタッチした人のUUIDや名前をリスト化しましたが、実は普通にスクリプトを組むと残りメモリー容量から期待できる格納数より大幅に少なくなります。

今回「Sea Island」イベントで投票システムを作る際に、この壁にぶつかり色々調べたところ、「Makapu」で有名なMizさんがLSL-BBSで、また、Chiyosukeさんが配布しているPDF「スクリプト言語の舞台裏」でも、この件についての詳しい説明と回避方法が書かれてました。

以下、自分の実験と共に解説します。

まずはテスト用のオブジェクトを作り、その中にスクリプトを入れます。




スクリプトは、タッチしたら自分のUUIDをリストに追加して、格納項目数をテキストで表示させるものです。
まずは、普通の記述方法です。



list av = [];

default
{
state_entry()
{
llOwnerSay((string)llGetFreeMemory());
}

touch_start(integer total_number)
{
av += llDetectedKey(0);
llSetText((string)llGetListLength(av),<1.0,0.0,0.0>,1.0);
}
}


最初に残りメモリー数を教えてもらってます。
実際、このスクリプトで残りメモリーは16032 byteでした。
その後の「touch_start」以降で、リストavに自分のUUIDをひたすら溜め込みます。

さて、計算上ではリスト化できる項目数の限界は「スクリプト言語の舞台裏」によると、
Key型のリストを作った場合、細かい部分は割愛しますがKey型1項目あたり44 byte。
リスト本体は11+4n byte(nは項目数)らしいので、計算すると333個のUUIDを格納できることになります。

で、実際にオブジェクトを連打!連打!連打!・・・



ここでエラーですorz
約半分しか格納できませんでした。

何故こうなるのかと言うと、key(UUID)型やstring(文字列)型を連結させる時に、一時的に連結前のリストと連結後のリストがメモリー上に作られてしまうため、およそ倍のメモリーを要するからだそうです。

で、これを回避する方法として、


list av = [];

default
{
state_entry()
{
llOwnerSay((string)llGetFreeMemory());
}

touch_start(integer total_number)
{
av = (av = []) +av + llDetectedKey(0);
llSetText((string)llGetListLength(av),<1.0,0.0,0.0>,1.0);
}
}


違う点は、リストavに自分のUUIDを加算する際にリストavをクリアしています(av=[])。
何故これで上手くいくのかは自分もよく説明できません(^^;;;

それじゃ、さっそく連打!連打!連打!!



をを! ほぼ計算通り(^^

以上、スクリプト小技でした。

なお、「スクリプト言語の舞台裏」ではスクリプトの高速化や省メモリー化のアイデアが豊富にあります。
もっと早く気付けよなぁ < 自分・・・

素人スクリプト講座(2)

  • 2007/12/02(日) 16:12:15

先日、友人のyumehimeさんから一人一個限定のプレゼントを置きたいが、いい方法がないか?と相談がありました。

そこで、一向に腕の上がらない私がスクリプト講座の第二弾を開催です。

普通、不特定多数に対するプレゼントの場合、最初に考えられるのはフリーで販売する方法です。



「売り出し中」にチェックを入れて、販売価格を0L$に設定すればフリー商品の出来上がりです。
ただこの場合には、同じ人が何度でも入手が可能で、相談のあった方の希望には応えられません。

これを解決する方法の一つとしてスクリプトを使います。





list gTake_av_key = [];
key gTouch_av = NULL_KEY;

default
{
state_entry()
{
llSetText(llBase64ToString("44GK5LiA5Lq65qeY5LiA5YCL44Gu44G/"),<1.0,1.0,1.0>,1.0);
}

touch_start(integer total_number)
{
gTouch_av = llDetectedKey(0);
if (llListFindList(gTake_av_key,[gTouch_av]) != -1)
{
llSay(0, llBase64ToString("44GC44Gq44Gf44Gv5pei44Gr44GK5oyB44Gh6aCC44GE44Gm44G+44GZ"));
}else
{
llSay(0, llBase64ToString("44GC44KK44GM44Go44GG44GU44GW44GE44G+44GZ"));
llGiveInventory(gTouch_av,"Note card");
integer pos = llGetListLength(gTake_av_key);
gTake_av_key = llListInsertList(gTake_av_key,[gTouch_av],pos);
}
}

on_rez(integer start_param)
{
llSay(0, llBase64ToString("5Yid5pyf5YyW44GV44KM44G+44GX44Gf"));
llResetScript();
}
}


以上が簡単なサンプルになります。
要点は、入手済みのアバターのIDをリスト化して、タッチしてきたアバターと比較し、リストになければ商品を渡し、あれば拒否するように動きます。

最初の「gTake_av_key」が入手済みのアバターIDのリスト、「gTouch_av」がプレゼント箱をタッチしてきたアバターのIDです。



touch_start(integer total_number)
{
gTouch_av = llDetectedKey(0);


スクリプトはアバターがプレゼント箱をタッチすると、対象のアバターIDを取得して、変数gTouch_avに格納します。


if (llListFindList(gTake_av_key,[gTouch_av]) != -1)
{
llSay(0, llBase64ToString("44GC44Gq44Gf44Gv5pei44Gr44GK5oyB44Gh6aCC44GE44Gm44G+44GZ"));
}else
{
llSay(0, llBase64ToString("44GC44KK44GM44Go44GG44GU44GW44GE44G+44GZ"));
llGiveInventory(gTouch_av,"Note card");
integer pos = llGetListLength(gTake_av_key);
gTake_av_key = llListInsertList(gTake_av_key,[gTouch_av],pos);
}


次にリスト内検索関数(llListFindList)で入手済みリスト(gTake_av_key)からタッチしたアバターを探します。
居ない場合には-1が帰ってきますので、-1以外の値が帰ってきた場合は入手済みと判断し、「あなたは既に貰ってるよ」と返事して終わります。

※llBase64ToStringは基本的に日本語を使えないスクリプトで日本語を表示させる関数です。
 後ろに続く意味不明の文字列が実際の動作では日本語になります。
 詳しくは、「Furry Japan」の「スクリプトで日本語表示」を参照してください。

-1が帰ってきた、つまり未入手と判断した場合には「ありがとうございます」と返事をして、プレゼント箱の中の商品をllGiveInventoryで渡します。
この例では「Note card」を渡しています。 渡した商品名に変更することで色々な物を渡すことができます。

次にllGetListLengthで現在リストに記録されている人数を調べて、リストの最後尾に今回あげたアバターを記録します(llListInsertList)。

ちなみに最後の on_rezは、プレゼント箱を設置した際に一度スクリプトを初期化(リセット)するための物です。

以上が、一人一個限定スクリプトの全容です。

尚、このスクリプトには幾つか問題もあります。

一つは、プレゼント箱を置きなおすとスクリプトがリセットされて、今までの入手リストもクリアになり、再び同じ人が入手できてしまうこと。
もう一つは、スクリプトが使えるメモリーは限りがある(16Kbyte)なので、いずれはメモリーオーバーを起こしてしまうことです。

最初の方は置く人の注意でどうにかなりますが、あとの問題の解決方は考えられるのは、メモリーの残りを監視して、少なくなったらリストの最初の人を「こっそりと」消してしまい、メモリーを確保する方法です。
ある程度時間がたった人が再度貰いにはこないだろうと言う、甘えた願いを込めた苦肉の策です(^^;

「もっといい方法があるよ」という方、教えてください(mOm)

とりあえず、腕時計第一弾

  • 2007/11/23(金) 15:16:59

一気にブログ連投です。
以前のエントリー
で腕時計を作るぞ!などと寝言を言ってましたが、第一弾ができました。



デザインは思いっきりシンプルで、シルバーとゴールドの2種です。
約束通り、針は時針,分針,秒針がリアルタイムで動きます。
それだけじゃ芸がないので、JST,GMT,PDT(PST)切替え、デジタル表示やアラーム,BlingパーティクルをON/OFF出来るようにしてあります。

また、多分バグが出ると思うので(マテ、簡単操作でアップデートできる機能もつけましたw

ついでに、クリスマスシーズンと言うことでクリスマスバージョンも勢いで作ってしまいした。



こっちは、アラーム音が「ジングルベル」でBlingパーティクルの代わりに、雪の結晶が舞うようにしてあります。
常に動作させるとハタ迷惑なので、ここ一番でお願いします(オイw

一応、NO MOD,TRASで、Copy OKですが、物が物なので誰かに上げたい人もいるかと考え、No CopyでTrans OKのギフトバージョンもあります。

多摩の「白狼」にありますが、近くSLCOMにも出品予定です。

しばらくは腕時計に限らず、時計のバリエーションを増やして行こうかと考えています。
もう少しふざけたものも作ってみたいなと・・・w