2008年07月11日
貝の作り方
基本的には「私流スカルプテッドプリム」の
作業の実施例
で紹介した猫脚つきバスタブの作り方と同じです。
今回の特徴は、薄いオブジェクトの作成と、GIMPを使ったテクスチャ作成の小技
(当たり前かも^^)紹介になります。
完成図
おおまかな流れは、以下の通りです。
- ROKURO Proで概形作り
- スクリプト+WIngs3Dで作りこみ
- ROKURO Proでスカルプトテクスチャ出力
- GIMPでテクスチャ作成
では、順に見ていくことにします。バスタブのときと同様な処理については図を小さくしてあります(クリックで拡大できます)。
- まずは、ROKURO Proで概形を作ります。今回は基本図形として球を選びました。
- 次にROKUROタブで貝の側面の形を作ります。
下側は後で処理するのでなにもしません。
- TOKOROTENタブで貝を上から見た形を作ります。
バスタブ同様、マゼンタの部分だけ変形して"Edit"→"Optimize"で他のポイントを均等配置します。片側だけ整え、OBJ形式でexportします。
- 変換スクリプトで、yz平面で左右対称にします。Wings 3DにOBJをimport
したところです。
- 片側上面の形を整えます。
- WIngs 3DからOBJ形式でexportし、左右、上下を対称化して、importし形を確認します。
- 問題が無ければ、貝の裏側の作成に移ります。
頂点を半分だけ折り返します。詳細は
OBJ変換ツールの-half_revオプション
を参照ください。
図のように下側の頂点が上側の頂点と同じ座標になり、薄い貝殻になります。
- このままだと、薄すぎるので裏側を選択して、Z方向に少しだけ移動します。
- 次に、付け根の部分をZ平面で均一化し、Z方向に移動します。実際の貝殻はきっと違うんだろうけど。。。図のようにしちゃいました:p
- あとは、貝のエッジの部分や細かいところを調整し、対称化すれば完成です。
- Wings 3DからOBJをexportして、ROKURO PROにimportし、スカルプトテクスチャを
作成します。
- 続いて、オブジェクトに貼るテクスチャを作成します。ここでは、貝の裏側の
干渉縞??と、貝の表面模様の描き方を紹介します。
裏側は、"フィルタ"→"下塗り"→"雲"→"プラズマ"として下絵を作るだけです。

ただ、このままでは色が濃いのでレイヤーの不透明度を25くらいにします。 これで貝の裏っぽいものができます。SLで"輝き低"の設定にすればそれなりに なります。
- 表は、グラデーションで描くだけです。今回は、"Flare Rays Size 1"を使って
グラデーションを作って、その一部を使いました。
- 完成したテクスチャです。
- SLに持ち込んでおしまい。冒頭の完成図になります。
2008年10月14日
メディア設定
追記[08/10/16]:グループ所有の土地は使えるかもとしていましたが、私が試した範囲では駄目でしたので、その旨記載しました。
目次
土地の設定とプレーヤの設置(オーナ用)
土地の設定は土地オーナーでないとできません。
グループ所有の土地の場合は、私が試した範囲では利用できませんでした。
- メディアテクスチャとは
メディアを表示するテクスチャです。 メディア再生時はこのテクスチャにVideo,Audio(真っ黒),Image,Webが表示されます。土地にあるオブジェクトで、メディアテクスチャと同じテクスチャが貼ってあると そちらにも表示されますのでご注意ください。
- メディアテクスチャを確認します

メニューバーの土地情報①をクリックすると、②の土地情報メニューがでます。 ③のテクスチャ取替えを確認します。
図のように×マークになっている場合は次へ進みます。
何らかのテクスチャが設定されている場合は4へ進んでください。 - メディアテクスチャを設定します
上の図の③をクリックすると以下のようになります。

好きなテクスチャを選んでください①。 お店のロゴとか、好きな絵とか何でもよいです。 ここではMedia Player Ⅲのパッケージに入っているテクスチャを選択しています。SLに出回っているプレーヤにはメディアテクスチャを限定するものが あります。その場合はあきらめて指定されたテクスチャを指定しましょう。
②のテクスチャ取替えの窓を確認して、③の選択をクリックします。 これで、設定完了です。
メディア再生中は、②の窓にもメディアが表示されます。
- タイプとメディアオプションの自動設定
土地情報のタイプは表示するメディアのタイプを指定するものです。 スケールの自動設定は、メディアテクスチャいっぱいに表示するオプションです。
この二つは設定不要です。AMP3,AMR3は起動時にスケールの自動設定をします。 また、再生時にタイプを設定します。SLに出回っているプレーヤにはタイプを限定するものがあります。 特にYouTube系に多いようです。その場合は指示に従ってVideo/*など指定します。
メディアのループはお好みで設定してください。
- 設置
- AMP3(プレーヤ)の設置
REZしてください。
オーナメッセージ(ディフォルトでは黄色い文字)で、設定情報が出ます。 これまでの設定ができていないと、 画面にはスライドショーのSTOP時テクスチャが表示され①、 スライドショーだけできる旨が表示されます②。 メディアプレーヤとしては動作しませんので、 メディアプレーヤとして動作させる場合は 土地の設定とプレーヤの設置(オーナ用)の1から 確認してみてください。
問題がなければ、メディアテクスチャが表示され①、 ~ byte freeが表示され使用可能状態になります②。
以上で完了です。タッチしてメニューを表示してみましょう。

①は現在の状態です。②のボタンは次の動作を表しています。 上の図は、今、RequestがOFFで、"RequestON"ボタンを押すと RequestがONになるという意味です。動作確認という意味で、"FAVORITE"から"Ada's Web"を選んでみます。 Webの表示は、利用者編で述べますが、 QuickTimeがインストールされていなくても表示できます。
FAVORITE登録はAMR3のコンテンツタブにあるconfigに12件まで追加できます
Webページが表示できれば設置は完了です。
見られない場合は利用者編を参照ください。
- AMR3(リクエスト&コントローラ)の設置
REZしてください。
オーナメッセージ(ディフォルトでは黄色い文字)で、設定情報が出ます。 これまでの設定ができていないと、①のように表示されます。 この状態でタッチすればリセットします。 土地の設定とプレーヤの設置(オーナ用)の1から 確認して問題を修正したあとタッチしてください。
問題がなければ、①のように"touch me to ~"が表示され使用可能状態になります。
電源ボタン①をタッチすると、 ②のように表示されリクエスト待機状態になります。
メディアテクスチャを貼ったオブジェクトは事前に用意しておいてください。 上図のチャットウインドウとAMR3の間にある板は、 普通の板にメディアテクスチャを張っただけのものです。 もちろん、AMP3を使うこともできます。他のプレーヤともたぶん混在できます。 AMP3や他のプレーヤと一緒に使う場合は、 AMR3をAMP3など他のプレーヤと一緒に使う場合 をご覧ください。
ここでURLをタイプしてメディアテクスチャに表示されるか確認します。 Webの表示は、利用者編で述べますが、 QuickTimeがインストールされていなくても表示できますので、 通常のWebページを指定すると良いです。思い当たらない場合は http://ada.slmame.com/ とでもタイプしてみてください:p。
Webページが表示できれば設置は完了です。
見られない場合は利用者編を参照ください。
- AMR3をAMP3など他のプレーヤと一緒に使う場合
それぞれの設置は前節をご覧ください。ここではAMR3(リクエスト&コントローラ) をAMP3等、他のプレーヤと同時に使用する場合の注意事項を述べます。
AMR3はリクエストをChannel 0から受け付けます。 つまりチャットで発話されたURLをリクエストとして処理します。 他のプレーヤでチャットからURLを指定するタイプのものは、 その機能を無効にしてください。 そうしないと、両方で処理してしまいます。 OFFにできない場合は、他のプレーヤをあきらめるか、 AMR3の利用をあきらめてください。
AMP3(プレーヤ)の対処方法
以下のどちらかの処置をしてください。- メニューで"RequestOFF"を押して(Requestが有効になっている場合)、
"Request: OFF"と表示されている状態にしてください。
- コンテンツタブにあるconfigでチャネルを0以外に指定します。
以下の例では1としています。
AMP3は"/1 URL"のように指定することになります。
- メニューで"RequestOFF"を押して(Requestが有効になっている場合)、
"Request: OFF"と表示されている状態にしてください。
- AMP3(プレーヤ)の設置
再生の設定とリクエスト方法(利用者用)
- 環境設定
メニューバーから"編集"→"環境設定"を選択し、環境設定メニューを出します。

"音声とビデオ"タブの"ストリーミング・メディア使用可能時に再生(帯域幅の消費増)"をチェックします。すると赤枠のように撮影機が表示されます。
"メディアを自動再生"はどちらでもかまいません。 自動再生をONにすると、メディア再生中の土地に入ると自動再生されます。 自動再生がOFFでも、AMP3やAMR3が再生のアクションを起こしたとき再生されます。この設定をする場合は次のQuickTimeのインストールとあわせて行ってください。 QuickTimeの古いバージョンでは脆弱性を突いたお金を盗む問題があったと記憶しています。
- QuickTime
QuickTimeのバージョンが古いと脆弱性の問題もありますし、 何より上の設定をしてもストリームメディアを見られません。 もし、webページは見られるけど、 YouTube等が見られない場合はQuickTimeの問題です。 現状のSLビューワですと、version 7が必要なようです。http://www.apple.com/jp/quicktime/download/ からダウンロードしてインストールします。
- リクエスト方法
AMP3とAMR3のリクエスト方法はほぼ同じです。主な違いは以下の通りです。- AMP3(プレーヤ)はチャネル指定ができるので、0以外に設定されている場合は、 channel番号をつけてリクエストします(例: /1 http://www.slmame.com/)。 チャネル番号はオーナーにお尋ねください。
- AMR3(リクエスト&コントローラ)は、タイトルと
再生時間をリクエストごとに指定できます。
AMP3でもタイトルと時間が無視されるだけ正常に処理されます。
基本的には以下の書式で、URL以外は省略可能です。
タイトル,URL,タイプ,時間
- タイトルは、AMR3のリクエスト一覧に表示されます。 YouTubeの場合はAPIから自動取得しますが、指定された場合はそれが優先されます。
- タイプはvideo,audio,image,htmlの何れかです。 AM*はURLの拡張子を見てタイプを決定しますので、 CGIなど拡張子で判断できない場合に指定します。YouTubeの場合は不要です。
- 時間は、秒数かM:SS形式で指定できます。 AMR3のディフォルトプレイ時間以外にするとき使います。 YouTubeの場合はAPIで取得を試みますが、ちょくちょく失敗します。
リクエスト例:
- videoの表示
- http://jp.youtube.com/watch?v=12345678901
- http://www.youtube.com/watch?v=12345678901,4:00
- なんとかソング,http://www.youtube.com/watch?v=12345678901,4:00
- http://foo.bar.com/cgi-bin/hoge.php,video,300
- http://www.youtube.com/watch?v=12345678901,4:00
- audioの表示(画面は黒くなります)
- http://foo.bar.com/abc.mp3
- http://foo.bar.com/cgi-bin/hoge.php,audio
- http://foo.bar.com/cgi-bin/hoge.php,audio,4:00
- http://foo.bar.com/cgi-bin/hoge.php,audio
- イメージの表示
- http://foo.bar.com/abc.jpg
- http://foo.bar.com/cgi-bin/hoge.php,image
- Webの表示
- http://www.slmame.com/
以上です。それでは、お楽しみくださいませ。
おまけ(プレーヤ作成について)
作成に当たってのTipsを少し。。。
- メディアテクスチャ
- llParcelMediaQuery([PARCEL_MEDIA_COMMAND_TEXTURE])
で取得できます。取得できない場合はNULL_KEYとなります。 戻り値見て利用の可否を判断しています。
独自テクスチャにこだわるプレーヤって宣伝目的なの? それなら別に否定しないけど... - メディアタイプ
- 土地情報のメディアタブのURLに直接URLを入れればメディアタイプは自動判別されるけど、LSLでURLを指定するだけでは自動判別されません。
llParcelMediaCommandList([PARCEL_MEDIA_COMMAND_TYPE,mime_type])
で設定する必要がありました。ので、そのように実装しました。 - PAUSEとPLAYとDURATION
- 再生中の全アバタ(というかビューワ)に影響があるとは。。。実装して知りました。
PAUSEは、同じタイミングでかかりますが、アバタごとにずれます。再生スタートでもたつくので、そのもたつき度合いが差になるようですね。ただ、DURATIONは同じ場所になりますね。早送りや戻しで使ってます。DURATION+PAUSEを素早くおこなえば、ほぼ同じ箇所でポーズできることになります。
- YouTube
- APIが新しくなって情報量が増えてしまった(痛い!)
旧APIを使うにはDeveloper IDが必要なんですが、既に取得できなくなっています。 Web上でDeveloper IDをいくつかみつけちゃいましたが、人様のIDを使うわけにもいかず、新APIを使うようにしました。
http://gdata.youtube.com/feeds/mobile/videos/DATA
おかげで時間取得に度々失敗します。SLでは今日現在2048バイトまでしか Webのレスポンスを取得できないです。 関数的には取得バイト数を指定できる仕様になっていますが、今日現在実装されていません。
(mobileとしているのは少しでも情報を減らすためです)
必要なtagだけ取れると良いのですが...あたしが知らないだけかも:pWeb経由でAPIのレスポンスを変換する手も考えたけど、我が家のサーバは ダウンしっぱなしだし。。。はよ直せ>うちの管理者
というわけで、時間取得失敗します。ごめんなさい。
いじょぉ~ 駄文で失礼しました:p
2008年11月05日
カレンダ付時計の作り方
きっともっと効率的なアルゴリズムはあるのでしょうけど、
思い切って中身も紹介しちゃいます。
コピペすれば、テキストバージョンのカレンダ付時計になります。
Unix時間から年月日時間を求めるスクリプトです。
Unix時間は、協定世界時(UTC)1970/01/01(木) 00:00:00 からの経過秒数です。
C言語だとUnix時間を年月日等に分離する関数がありますが、 LSLには無いようですね(たぶん... llGetTimestamp()やllGetDate()は時差考慮できなし...)。 ということで、それ相当を作ってみました。
時間だけなら時差の足し算と剰余簡単だけで求められますが、 日付となると、月や年の境界での処理が必要になりますし、うるう年も考慮しなければいけません。
ちなみに閏年は、(4で割れて且つ100で割れない)または(400で割れる年)。という定義です。なので、2000年は100で割れるけど400で割れるので閏年でした。 1970から2099年までは、4で割れれば閏年です。 今回はこの範囲に限定してます。とうことで、アルゴリズム的には2100/2/28まで正常に動きます。
ただ、LSLでは32ビット符号付なので、21億秒まで、つまり2038年の途中までしか動きません。
前置きか長くなりましたが、llGetUnixTime()から日付、時間を求めるスクリプトです(実際にはもうちょっと効率化してます)。
// (C)Ada Quinnell, 2008
integer Time_diff = 9; // time difference
integer DST = FALSE; // daylight saving time
// UnixTime to calendar -----------------------------------------
// 1970~2099年までは4で割れる年が閏年
// 1973/1/1 0:00 = 94694400sec = 1096day(閏年の次年)
// y = (integer)((float)((utime/86400)-1096+0.75)/365.25)+1973;
// (.25は2進数で表せるので丸め無し)
list DayOfMonth = [ 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
list DoW = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ];
string utime2str()
{
integer utime = llGetUnixTime()+Time_diff+3600*DST;
integer dd = utime/86400;
integer yy = (integer)((float)(dd-1095.25)/365.25) + 1973;
integer doy = dd - (integer)((float)((yy-1970) * 365.25 - 0.75));
integer dow = (dd+4) % 7; // a day of the week
integer mm;
integer ly = yy % 4; // 0 when yy is leap-year
if (doy <= 31) { // Jan
mm = 1; dd = doy;
} else if (doy <= 59) { // Feb
mm = 2; dd = doy-31;
} else if (ly == 0 && doy == 60) { // Feb, 29
mm = 2; dd = 29;
} else { // doy >= 60 // Mar--
integer dom = 31;
if (ly == 0) doy--; // 60=3/1
for (doy -= 59, mm = 3; mm < 12 && doy > dom; mm++) {
doy -= dom;
dom = llList2Integer(DayOfMonth,mm-3);
}
dd = doy;
}
return (string)yy+"/"+
p02d( mm ) + "/" +
p02d( dd ) + "(" +
llList2String(DoW,dow)+ ")" +
p02d((utime/3600)%24) + ":" +
p02d((utime/ 60)%60) + ":" +
p02d( utime % 60 );
}
string p02d(integer n) // same as "%02d" in C
{
if (n < 10) return "0"+(string)n; else return (string)n;
}
//--------------------------------------------------------
default
{
state_entry()
{
Time_diff *= 3600;
llSetTimerEvent(0.1);
}
timer()
{
llSetTimerEvent(0.0);
llSetText(utime2str(),<1,1,1>,1);
llSetTimerEvent(60.0 - (llGetUnixTime() % 60));
}
}
|

以上です



