2008年08月17日
通常のプリムで10m以上の床を作る
メインランドのギャラリーお引っ越し。それにともない最初から作り直す。
通常のプリムはサイズの最大値が10mと制限があるが、作り方、考え方によっては10m以上に出来る。単なる床であれば、10m×14mのモノは簡単。
ボックスをパスカットで半分に。カットされた面を上に向ければ10m×14.14mになる。

それを3つ並べて、30m×14.14mの床にしてみた。メインランドの512平米の土地は32m×16mというのがほとんどなので、床面積としてはこれでほどよい感じだ。
建物全体のプリム削減を考えれば、コの字で、床、壁、天井を作ってしまう方が良いかもしれない。
他にもいろいろいじってみると10m以上のプリムが出来るのが分かる。
実際に使えるものかどうかは別だけど(苦笑)
★いわゆるメガプリム、ヒュージプリムと呼ばれているものは全く別物です。
通常のプリムはサイズの最大値が10mと制限があるが、作り方、考え方によっては10m以上に出来る。単なる床であれば、10m×14mのモノは簡単。
ボックスをパスカットで半分に。カットされた面を上に向ければ10m×14.14mになる。

それを3つ並べて、30m×14.14mの床にしてみた。メインランドの512平米の土地は32m×16mというのがほとんどなので、床面積としてはこれでほどよい感じだ。
建物全体のプリム削減を考えれば、コの字で、床、壁、天井を作ってしまう方が良いかもしれない。
他にもいろいろいじってみると10m以上のプリムが出来るのが分かる。
実際に使えるものかどうかは別だけど(苦笑)
★いわゆるメガプリム、ヒュージプリムと呼ばれているものは全く別物です。
2008年06月19日
タッチでテクスチャを切り替える
先日、タッチでテクスチャを切り替えられるスクリプトを探しているという人がギャラリーにやってきた。
タッチでテクスチャを切り替えるというのは、そんなに難しいものではないです。
string TEXTURE01 = "texture01";
string TEXTURE02 = "texture02";
integer TOUCH = FALSE;
default
{
state_entry()
{
llSetTexture(TEXTURE02,ALL_SIDES);
TOUCH = FALSE;
}
touch_start(integer num)
{
if (!TOUCH){llSetTexture(TEXTURE02,ALL_SIDES); TOUCH = TRUE;}
else {llSetTexture(TEXTURE01,ALL_SIDES); TOUCH = FALSE;}
}
}
これはタッチごとに2つのテクスチャを切り替えるというスクリプトです。コンテンツ内に「 texture01 」「 texture02 」というテクスチャファイルを入れる必要があります。
ALL_SIDESというのは全面貼り替わるということです。ここに「1」とか「2」とかを入れると指定された1面のみ替わります。ただし形状によって面に対応する数値が違いますので注意が必要。ボックスの場合は6面あるので「0」〜「5」まで使えるけどシリンダーだと3面しかないので「0」〜「2」ということになります。またパスカットをすると面が増えますので、この場合も面に対応する数値が変わります。
複数のテクスチャを替えたい場合はリストを使うと便利です。
続きを読む
タッチでテクスチャを切り替えるというのは、そんなに難しいものではないです。
string TEXTURE01 = "texture01";
string TEXTURE02 = "texture02";
integer TOUCH = FALSE;
default
{
state_entry()
{
llSetTexture(TEXTURE02,ALL_SIDES);
TOUCH = FALSE;
}
touch_start(integer num)
{
if (!TOUCH){llSetTexture(TEXTURE02,ALL_SIDES); TOUCH = TRUE;}
else {llSetTexture(TEXTURE01,ALL_SIDES); TOUCH = FALSE;}
}
}
これはタッチごとに2つのテクスチャを切り替えるというスクリプトです。コンテンツ内に「 texture01 」「 texture02 」というテクスチャファイルを入れる必要があります。
ALL_SIDESというのは全面貼り替わるということです。ここに「1」とか「2」とかを入れると指定された1面のみ替わります。ただし形状によって面に対応する数値が違いますので注意が必要。ボックスの場合は6面あるので「0」〜「5」まで使えるけどシリンダーだと3面しかないので「0」〜「2」ということになります。またパスカットをすると面が増えますので、この場合も面に対応する数値が変わります。
複数のテクスチャを替えたい場合はリストを使うと便利です。
続きを読む
2008年06月16日
スクリプトのメモリがいっぱい
LSLの仕様でスクリプトは16KB(確か)までと決まっている。
今までそれにひっかかる事はなかったが、さきほど初めて「 out of memory 」というエラーメッセージを見た。
たぶん規定メモリを超えたって事だよね?
構文にムダが多かったのでシェイプアップしたらエラーが出なくなった。
いつも行き当たりばったりでどんどん機能を追加していくので、スクリプトがかなり煩雑になってる。
あとから見ると「なんで同じ事ばかり書いてる」とよく思う(笑)
似たような処理はユーザー関数とか使ってひとつにまとめるとだいぶすっきりする。for文等のループを使って繰り返し処理でまとめるとよりプログラムらしい(笑) 同じ事をひたすら繰り返すというのは、コンピュータの一番得意とするところだし。
文字列処理とリスト処理が出来るようになるとスクリプトの幅も広がるし、より洗練された構文が書けるので大事だね。
あとは複数のスクリプトに分けてモジュール化という手もある。これだと16KBの壁を超えられる。ただムダに分けるとそれだけリソース食う事になるので計画的な利用が必要。
いやしかし、まさかメモリいっぱいになるほど書くとは思ってなかった(苦笑)
今までそれにひっかかる事はなかったが、さきほど初めて「 out of memory 」というエラーメッセージを見た。
たぶん規定メモリを超えたって事だよね?
構文にムダが多かったのでシェイプアップしたらエラーが出なくなった。
いつも行き当たりばったりでどんどん機能を追加していくので、スクリプトがかなり煩雑になってる。
あとから見ると「なんで同じ事ばかり書いてる」とよく思う(笑)
似たような処理はユーザー関数とか使ってひとつにまとめるとだいぶすっきりする。for文等のループを使って繰り返し処理でまとめるとよりプログラムらしい(笑) 同じ事をひたすら繰り返すというのは、コンピュータの一番得意とするところだし。
文字列処理とリスト処理が出来るようになるとスクリプトの幅も広がるし、より洗練された構文が書けるので大事だね。
あとは複数のスクリプトに分けてモジュール化という手もある。これだと16KBの壁を超えられる。ただムダに分けるとそれだけリソース食う事になるので計画的な利用が必要。
いやしかし、まさかメモリいっぱいになるほど書くとは思ってなかった(苦笑)
2008年04月17日
スクリプトでテクスチャを反転する
ドアのテクスチャ切り替えをするのに llSetTexture( string name, integer face )を使っていたが、ブラインドのテクスチャは90度回転、さらには繰り返し、オフセット値も変更する必要があるので llSetPrimitiveParams( [ PRIM_TEXTURE, integer face, string name, vector repeat, vector offset, float ratation])を使う事にした。これだと関数がひとつで済む。
で、ここで疑問が湧いた。テクスチャの反転に関する項目が用意されていないので、テクスチャを切り替えると反転のチェックが外れてしまう。
llSetTexture の場合はテクスチャが変わるだけで数値はそのまま適用されるので、あらかじめ反転にチェックを入れておけば、テクスチャが切り替わっても問題なかった。
でも、大概の設定はスクリプトで指定出来るはず。NaviSL の方で質問したところ、意外な答えが返ってきた。 vector repeatの数値を負の値にすれば反転するらしい。
例えば、下の図の場合

llSetPrimitiveParams([ PRIM_TEXTURE, 1, "texture", < -2, 1, 0 >, < 0.5, 0, 0 >, 0.0 * DEG_TO_RAD]);
ということになる。分りやすいような分りにくいような(笑)
まぁ、設定項目がひとつ減るからいいのかな。
で、ここで疑問が湧いた。テクスチャの反転に関する項目が用意されていないので、テクスチャを切り替えると反転のチェックが外れてしまう。
llSetTexture の場合はテクスチャが変わるだけで数値はそのまま適用されるので、あらかじめ反転にチェックを入れておけば、テクスチャが切り替わっても問題なかった。
でも、大概の設定はスクリプトで指定出来るはず。NaviSL の方で質問したところ、意外な答えが返ってきた。 vector repeatの数値を負の値にすれば反転するらしい。
例えば、下の図の場合

llSetPrimitiveParams([ PRIM_TEXTURE, 1, "texture", < -2, 1, 0 >, < 0.5, 0, 0 >, 0.0 * DEG_TO_RAD]);
ということになる。分りやすいような分りにくいような(笑)
まぁ、設定項目がひとつ減るからいいのかな。
2008年04月14日
文字を綺麗に表示する
文字をテクスチャで作った場合、ジャギー(ギザギザになる)が出てしまって読みづらい事はないでしょうか?
これは解像度が足りないために起こります。通常のWebと違ってSLの場合は近づいてみたり、カメラをズームしたりしてテクスチャの拡大表示が出来るため、制作時の解像度よりも大きく表示されるとジャギーが出ます。文字の場合は通常の画像よりもジャギーが目立ちやすい。
ではどのくらいの解像度が良いのか?
SLの仕様上、テクスチャの最大の大きさは1024×1024ピクセル。モニタの解像度が1024×768ピクセルの場合、画面いっぱいになるまで近づいても大丈夫という事になります。ただし、この大きさだと表示に時間がかかるのと、SIMにも負担がかかると言われていますので、あまりお薦め出来ません。大体、そこまで大きく表示させる事もあまりありません。
ということで、512×512ピクセルを最大と考えましょう。繰り返し模様のようなテクスチャの場合は、小さく作って繰り返せば、64×64でも十分綺麗に見えます。
もうひとつSLの仕様として、画像をアップロードした場合、64、128、256、512ピクセルに自動的に変更されてしまいます。なので例えば、364×512ピクセルで元のデータを作った場合、アップロードすると256×512になりこの時点で解像度が下がってしまいます。
これを回避するためには、最初から正方形(1:1)でデータを作るのが良いです。
下の写真は4種類のデータ作成方法でテクスチャをアップしました。

これくらい離れて見る分にはどれも問題ありません。
(1)364×512(1:1.41)ピクセルで作成
→ アップロードで256×512(1:2)ピクセル → 板のサイズ(1:1.41)

(2)364×512(1:1.41)で文字をラスタライズ(画像化)→ 512×512(1:1)に拡大
→ アップロード512×512(1:1)→ 板のサイズ(1:1.41)

(3)512×512(1:1)で文字幅を141%にして作成
→ アップロード512×512(1:1)→ 板のサイズ(1:1.41)

(4)(1)の画像を364×500ピクセルにカット
→ アップロード256×512(1:2)→ 板のサイズ(1:1.41)

(3)(2)(1)(4)の順で画質が落ちていきます。(2)と(3)の差があまり出ませんでしたが、256×256くらいでやると結構差が出るかもしれません。(4)はたった12ピクセルカットしただけで、かなり画質が落ちました。500ピクセルしかないものを512ピクセルに引き伸ばしてアップロードする為に画質が落ちてしまいます。
ちなみに(3)の文字幅を141%というのは、最終的な仕上がりを見込んでの数値です。テクスチャを貼る板のサイズが1;2であれば200%にする必要があります。
文字幅の設定はここ(PhotoShop CS)

データの保存は全て tga を使用しました。圧縮率が低いので jpg ファイルより綺麗です。tga、png は保存し直しても画質が落ちませんが jpg の場合は保存するごとに画質が落ちていきます。あとで修正が入るようなものは元データを別に取っておくと良いでしょう。
これは解像度が足りないために起こります。通常のWebと違ってSLの場合は近づいてみたり、カメラをズームしたりしてテクスチャの拡大表示が出来るため、制作時の解像度よりも大きく表示されるとジャギーが出ます。文字の場合は通常の画像よりもジャギーが目立ちやすい。
ではどのくらいの解像度が良いのか?
SLの仕様上、テクスチャの最大の大きさは1024×1024ピクセル。モニタの解像度が1024×768ピクセルの場合、画面いっぱいになるまで近づいても大丈夫という事になります。ただし、この大きさだと表示に時間がかかるのと、SIMにも負担がかかると言われていますので、あまりお薦め出来ません。大体、そこまで大きく表示させる事もあまりありません。
ということで、512×512ピクセルを最大と考えましょう。繰り返し模様のようなテクスチャの場合は、小さく作って繰り返せば、64×64でも十分綺麗に見えます。
もうひとつSLの仕様として、画像をアップロードした場合、64、128、256、512ピクセルに自動的に変更されてしまいます。なので例えば、364×512ピクセルで元のデータを作った場合、アップロードすると256×512になりこの時点で解像度が下がってしまいます。
これを回避するためには、最初から正方形(1:1)でデータを作るのが良いです。
下の写真は4種類のデータ作成方法でテクスチャをアップしました。

これくらい離れて見る分にはどれも問題ありません。
(1)364×512(1:1.41)ピクセルで作成
→ アップロードで256×512(1:2)ピクセル → 板のサイズ(1:1.41)

(2)364×512(1:1.41)で文字をラスタライズ(画像化)→ 512×512(1:1)に拡大
→ アップロード512×512(1:1)→ 板のサイズ(1:1.41)

(3)512×512(1:1)で文字幅を141%にして作成
→ アップロード512×512(1:1)→ 板のサイズ(1:1.41)

(4)(1)の画像を364×500ピクセルにカット
→ アップロード256×512(1:2)→ 板のサイズ(1:1.41)

(3)(2)(1)(4)の順で画質が落ちていきます。(2)と(3)の差があまり出ませんでしたが、256×256くらいでやると結構差が出るかもしれません。(4)はたった12ピクセルカットしただけで、かなり画質が落ちました。500ピクセルしかないものを512ピクセルに引き伸ばしてアップロードする為に画質が落ちてしまいます。
ちなみに(3)の文字幅を141%というのは、最終的な仕上がりを見込んでの数値です。テクスチャを貼る板のサイズが1;2であれば200%にする必要があります。
文字幅の設定はここ(PhotoShop CS)

データの保存は全て tga を使用しました。圧縮率が低いので jpg ファイルより綺麗です。tga、png は保存し直しても画質が落ちませんが jpg の場合は保存するごとに画質が落ちていきます。あとで修正が入るようなものは元データを別に取っておくと良いでしょう。
2008年03月12日
日本語表示スクリプト(チャット入力)
ちょっと前にモニターテンプレート制作日記でチャットをそのまま表示させれば日本語もいけると書いたが、詳しい説明をしてなかったので改めて書きます。
通常、スクリプトで日本語を扱う場合、Base64変換またはURLエンコード変換が必要。ただし、スクリプト内で処理する必要がなければ、チャット入力されたものをフローティングテキストとして表示出来る。たぶんノートカードからの読み込みもいけると思うけど、チャット入力の方が簡単でしょう。

以下、基本スクリプトです。
integer CHANNEL; // Listen 解除用
default
{
// タッチされた時に発生するイベント
touch_start(integer num)
{
CHANNEL = llListen(PUBLIC_CHANNEL,"",llGetOwner(),""); // Listen をオン、PUBLIC_CHANNEL のオーナーの言葉のみ反応
llSetTimerEvent(60); // タイマーを60秒にセット
}
// PUBLIC_CHANNEL に入力があった時に発生するイベント
listen(integer channel, string name, key id, string message)
{
llSetText(message,<1,1,1>,1); // 入力文字をそのままフローティングテキスト標示
llListenRemove(CHANNEL);// Listen 解除
llSetTimerEvent(0.0);// タイマーリセット
}
//60秒でタイムアウト、Listen解除、タイマーリセット
timer()
{
llListenRemove(CHANNEL);
llSetTimerEvent(0.0);
}
PUBLIC_CHANNELは通常会話に使われるチャンネルでPUBLIC_CHANNELの代わりに「0」と記述しても同じ。
Listen は開いたら必ず閉じるというのは基本です。開きっぱなしだと常に会話を聞き続ける事になりSIMに負荷がかかります。特にPUBLIC_CHANNELは一番使われるチャンネルなので負荷が大きい。
タイマーもこの場合は必ずリセット。リセットしない場合、60秒おきにずっとタイマーイベントが発生します。
一応これだけでタッチしてからチャット入力したものがそのままフローティングテキストとして表示される。日本語、半角英数すべてそのままいけますが、もうちょっと機能つけてみましょう。
続きを読む
通常、スクリプトで日本語を扱う場合、Base64変換またはURLエンコード変換が必要。ただし、スクリプト内で処理する必要がなければ、チャット入力されたものをフローティングテキストとして表示出来る。たぶんノートカードからの読み込みもいけると思うけど、チャット入力の方が簡単でしょう。

以下、基本スクリプトです。
integer CHANNEL; // Listen 解除用
default
{
// タッチされた時に発生するイベント
touch_start(integer num)
{
CHANNEL = llListen(PUBLIC_CHANNEL,"",llGetOwner(),""); // Listen をオン、PUBLIC_CHANNEL のオーナーの言葉のみ反応
llSetTimerEvent(60); // タイマーを60秒にセット
}
// PUBLIC_CHANNEL に入力があった時に発生するイベント
listen(integer channel, string name, key id, string message)
{
llSetText(message,<1,1,1>,1); // 入力文字をそのままフローティングテキスト標示
llListenRemove(CHANNEL);// Listen 解除
llSetTimerEvent(0.0);// タイマーリセット
}
//60秒でタイムアウト、Listen解除、タイマーリセット
timer()
{
llListenRemove(CHANNEL);
llSetTimerEvent(0.0);
}
PUBLIC_CHANNELは通常会話に使われるチャンネルでPUBLIC_CHANNELの代わりに「0」と記述しても同じ。
Listen は開いたら必ず閉じるというのは基本です。開きっぱなしだと常に会話を聞き続ける事になりSIMに負荷がかかります。特にPUBLIC_CHANNELは一番使われるチャンネルなので負荷が大きい。
タイマーもこの場合は必ずリセット。リセットしない場合、60秒おきにずっとタイマーイベントが発生します。
一応これだけでタッチしてからチャット入力したものがそのままフローティングテキストとして表示される。日本語、半角英数すべてそのままいけますが、もうちょっと機能つけてみましょう。
続きを読む
2008年03月11日
Shift+ドラッグでコピーすると
オブジェクトをコピーするのにShiftキーを押しながらドラッグというのはよくやる事だけど、ちょっと注意が必要。例えば一般項目の一番下に「左クリックすると」というプルダウンメニューで「オブジェクトに座る」「オブジェクトを購入」等に設定している場合。



コピーするとプルダウンメニューはデフォルトの「触る、つかむ」に戻ってしまう。それだけでなく売り出し中のチェックとかも元に戻ってしまうので、箱詰めした販売ボックスを増やそうとしてコピーした際には要注意です。
「買えないんですけどぉ?」という声がぁ・・・。
おいらはこれで良く失敗します(苦笑)
ちなみにドラッグした方が元のオブジェクトで、元の位置に残っている方が新しくコピーされたオブジェクトです。この辺も間違いやすい要因かもしれない。



コピーするとプルダウンメニューはデフォルトの「触る、つかむ」に戻ってしまう。それだけでなく売り出し中のチェックとかも元に戻ってしまうので、箱詰めした販売ボックスを増やそうとしてコピーした際には要注意です。
「買えないんですけどぉ?」という声がぁ・・・。
おいらはこれで良く失敗します(苦笑)
ちなみにドラッグした方が元のオブジェクトで、元の位置に残っている方が新しくコピーされたオブジェクトです。この辺も間違いやすい要因かもしれない。
2008年03月04日
インビジブルプリム
インビジブルプリムを使ってお腹に穴を開けてみる。

インビジブルプリムとは、完全透明なテクスチャが貼られたプリム。勘違いしてはいけないのは自作の完全透明のテクスチャとは違うという事。自作で完全透明のテクスチャを使ってもお腹に穴は開かない。
この透明テクスチャはシステムで用意されているもので、アバターと透過度が設定されているテクスチャを完全に見えなくするという不思議な特性がある。
では、どうするか?
llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES);
これを touch_start に入れてみよう。タッチするとインビジブルプリムの出来上がり。ただし、見えなくなるので注意が必要。ビューメニューの透明を強調でも見えない(笑)
アタッチした状態でタッチするのが安全かも。

インビジブルプリムとは、完全透明なテクスチャが貼られたプリム。勘違いしてはいけないのは自作の完全透明のテクスチャとは違うという事。自作で完全透明のテクスチャを使ってもお腹に穴は開かない。
この透明テクスチャはシステムで用意されているもので、アバターと透過度が設定されているテクスチャを完全に見えなくするという不思議な特性がある。
では、どうするか?
llSetTexture("e97cf410-8e61-7005-ec06-629eba4cd1fb", ALL_SIDES);
これを touch_start に入れてみよう。タッチするとインビジブルプリムの出来上がり。ただし、見えなくなるので注意が必要。ビューメニューの透明を強調でも見えない(笑)
アタッチした状態でタッチするのが安全かも。
2008年01月30日
マジックミラーを作る
家を作っていて需要が多いのは、中からは外が見えるが、外からは中が見えないという、いわゆるマジックミラー状態の壁。これは片面だけを透明度を上げれば簡単に出来ます。面ごとにテクスチャの指定が出来るということです。
通常のテクスチャ変更だと全面同じものが貼付けられますが「テクスチャを選択」というラジオボタンにチェックを入れると

面に白丸に十字マークが現れます。このマークがついている面に対してテクスチャの指定が出来ます。
ひとつの面にだけ指定したい場合、その面をクリックするとマークがその面だけになります。

あとは通常のテクスチャの貼り方と同じです。テクスチャだけでなく色や透明度も面ごとに変えられます。

ここで注目してほしいのは、テクスチャプレビューに「 multiple 」と出ています。これは選択されているオブジェクトが複数のテクスチャによって構成されているという事です。この状態でテクスチャを変更すると全面同じものに貼り変わりますので注意してください。
マジックミラーにするには片面だけ透明にします。

通常のマジックミラーならこれで十分でしょう。編集での透明度は90%が限界ですが、スクリプトで指定、または完全に透明なテクスチャを貼れば,片面からは全く見えないオブジェクトになります。
通常のテクスチャ変更だと全面同じものが貼付けられますが「テクスチャを選択」というラジオボタンにチェックを入れると

面に白丸に十字マークが現れます。このマークがついている面に対してテクスチャの指定が出来ます。
ひとつの面にだけ指定したい場合、その面をクリックするとマークがその面だけになります。

あとは通常のテクスチャの貼り方と同じです。テクスチャだけでなく色や透明度も面ごとに変えられます。

ここで注目してほしいのは、テクスチャプレビューに「 multiple 」と出ています。これは選択されているオブジェクトが複数のテクスチャによって構成されているという事です。この状態でテクスチャを変更すると全面同じものに貼り変わりますので注意してください。
マジックミラーにするには片面だけ透明にします。

通常のマジックミラーならこれで十分でしょう。編集での透明度は90%が限界ですが、スクリプトで指定、または完全に透明なテクスチャを貼れば,片面からは全く見えないオブジェクトになります。
2008年01月10日
タケコプターを作る
回転するオブジェクト、分かりやすくタケコプターを作ります。

まずは形から

細長く平たい球体2枚、軸に円柱一本、吸盤に半球ひとつ。4プリムあれば十分でしょう。形が出来たらリンクしますが、必ず軸棒、または吸盤部分がルートプリムになるようにリンクします。リンクの仕方はこちらを参照してください「プリムをリンクする」
Z軸を中心に回すためには軸棒または吸盤がルートである必要があります。もしもどちらかの羽をルートにするとその羽の中心を軸に回転する事になります。
装着してみましょう。添付先は「 scull(頭)」添付先を指定しないとデフォルトでは確か右腕に装着されてしまうと思います。



装着してみると分かりますが最初からちょうど良い位置にくることは稀です(写真左)位置修正は装着したままで行います(写真中央)装着状態だと「ルーラーモード」が「アタッチ」になっています。通常の編集では「世界」または「ローカル」となっています。これは座標軸の基準をどこに決めるかという事です。
頭に埋まっているのでZ軸方向(青矢印)にドラッグします。ちょっと大きかったので微調整、さらにテクスチャをブランクにするとタケコプターらしくなりました。これで一旦取り外しても、次からは添付先を選ばなくても同じ位置に装着されます。
さてこれを回転させるにはスクリプトが必要。
default
{
state_entry()
{
llTargetOmega(<0.0,0.0,1.0>,TWO_PI,1.0);
}
}
ただひたすら回転の場合はこれだけでOKです。<0.0,0.0,1.0>の部分はどの軸を中心に回転させるかという指定です。< x,y,z >となっていますので、この場合はZ軸を中心に回転させるため<0.0,0.0,1.0>となります。
その次のTWO_PIは回転速度です。TWO_PIすなわち、2πです。これは角速度での指定になっているため、2πの場合、1秒間で1回転という事です。回転に合わせて何かを操作するという事でなければ、単に数値を入力しても構いません。数値が大きいほど回転が速くなります。
最後に1.0の数値がありますが、これは物理オブジェクトの場合に回転の強さを指定するものです。非物理オブジェクトの場合は、1.0で大丈夫です。たぶん数値を上げても何も変わらないかと思います。
スクリプトは必ずルートプリムのコンテンツに入れます。リンク状態でコンテンツを開く場合、ルートプリムのコンテンツを開く事になりますので特に意識しなくてもルートプリムにスクリプトが入ります。ルートプリムではない子プリムにスクリプトを入れた場合、そのプリムのみ回転します。
もしもプロペラが一枚羽の場合はプロペラ部分にスクリプトを入れておけば、ルートプリムはどこでも大丈夫です。プロペラのみ回転するか、全体を回転させるかの違いです。

まずは形から

細長く平たい球体2枚、軸に円柱一本、吸盤に半球ひとつ。4プリムあれば十分でしょう。形が出来たらリンクしますが、必ず軸棒、または吸盤部分がルートプリムになるようにリンクします。リンクの仕方はこちらを参照してください「プリムをリンクする」
Z軸を中心に回すためには軸棒または吸盤がルートである必要があります。もしもどちらかの羽をルートにするとその羽の中心を軸に回転する事になります。
装着してみましょう。添付先は「 scull(頭)」添付先を指定しないとデフォルトでは確か右腕に装着されてしまうと思います。



装着してみると分かりますが最初からちょうど良い位置にくることは稀です(写真左)位置修正は装着したままで行います(写真中央)装着状態だと「ルーラーモード」が「アタッチ」になっています。通常の編集では「世界」または「ローカル」となっています。これは座標軸の基準をどこに決めるかという事です。
頭に埋まっているのでZ軸方向(青矢印)にドラッグします。ちょっと大きかったので微調整、さらにテクスチャをブランクにするとタケコプターらしくなりました。これで一旦取り外しても、次からは添付先を選ばなくても同じ位置に装着されます。
さてこれを回転させるにはスクリプトが必要。
default
{
state_entry()
{
llTargetOmega(<0.0,0.0,1.0>,TWO_PI,1.0);
}
}
ただひたすら回転の場合はこれだけでOKです。<0.0,0.0,1.0>の部分はどの軸を中心に回転させるかという指定です。< x,y,z >となっていますので、この場合はZ軸を中心に回転させるため<0.0,0.0,1.0>となります。
その次のTWO_PIは回転速度です。TWO_PIすなわち、2πです。これは角速度での指定になっているため、2πの場合、1秒間で1回転という事です。回転に合わせて何かを操作するという事でなければ、単に数値を入力しても構いません。数値が大きいほど回転が速くなります。
最後に1.0の数値がありますが、これは物理オブジェクトの場合に回転の強さを指定するものです。非物理オブジェクトの場合は、1.0で大丈夫です。たぶん数値を上げても何も変わらないかと思います。
スクリプトは必ずルートプリムのコンテンツに入れます。リンク状態でコンテンツを開く場合、ルートプリムのコンテンツを開く事になりますので特に意識しなくてもルートプリムにスクリプトが入ります。ルートプリムではない子プリムにスクリプトを入れた場合、そのプリムのみ回転します。
もしもプロペラが一枚羽の場合はプロペラ部分にスクリプトを入れておけば、ルートプリムはどこでも大丈夫です。プロペラのみ回転するか、全体を回転させるかの違いです。
2007年12月27日
オブジェクトの上にテキスト表示
箱詰めされた商品などによく見かけるフローティングテキスト。実は結構簡単です。

default
{
state_entry()
{
llSetText("TakoMASARU", <1.0,1.0,1.0>, 1.0);
}
}
上の写真の場合はこんな感じのスクリプトになります。TakoMASARUの部分に好きな文字を入れればOK。文字列は必ずダブルクォーテーション("") でくくってください。
文字列の隣の<1.0,1.0,1.0>はテキストの色をRGB形式で指定しています。最小値「0.0」から最大値「1.0」です。例題の場合、RGB全て「1.0」なので白になります。
試しに<1.0,0.0,0.0>にしてみると

赤になります。
その隣の「1.0」は透明度の指定。最小値「0.0」から最大値「1.0」です。「0.0」の場合、完全に透明になり見えません。
試しに0.5にしてみると

半透明になります。
もしも2行にしたい場合はどうするか?

スクリプト上で普通に改行すれば、それがそのまま適用されます。
default
{
state_entry()
{
llSetText("TakoMASARU
Back", <1.0,1.0,1.0>, 1.0);
}
}
改行された場合、段落はセンター揃えになるようです。スペースも有効ですのでそれで調整してください。
あとこのフローティングテキストの特徴は画面上の大きさが変わらないという事です。


オブジェクトにズームすると文字が小さくなったように見えますが、実際は大きさが変わっていません。相対的に小さくなったように見えます。なので離れていてもよく見えますが、逆にそれがうるさい場合もありますね(笑)
日本語表記するには一手間かける必要がありますので今回は説明を省略します。

default
{
state_entry()
{
llSetText("TakoMASARU", <1.0,1.0,1.0>, 1.0);
}
}
上の写真の場合はこんな感じのスクリプトになります。TakoMASARUの部分に好きな文字を入れればOK。文字列は必ずダブルクォーテーション("") でくくってください。
文字列の隣の<1.0,1.0,1.0>はテキストの色をRGB形式で指定しています。最小値「0.0」から最大値「1.0」です。例題の場合、RGB全て「1.0」なので白になります。
試しに<1.0,0.0,0.0>にしてみると

赤になります。
その隣の「1.0」は透明度の指定。最小値「0.0」から最大値「1.0」です。「0.0」の場合、完全に透明になり見えません。
試しに0.5にしてみると

半透明になります。
もしも2行にしたい場合はどうするか?

スクリプト上で普通に改行すれば、それがそのまま適用されます。
default
{
state_entry()
{
llSetText("TakoMASARU
Back", <1.0,1.0,1.0>, 1.0);
}
}
改行された場合、段落はセンター揃えになるようです。スペースも有効ですのでそれで調整してください。
あとこのフローティングテキストの特徴は画面上の大きさが変わらないという事です。


オブジェクトにズームすると文字が小さくなったように見えますが、実際は大きさが変わっていません。相対的に小さくなったように見えます。なので離れていてもよく見えますが、逆にそれがうるさい場合もありますね(笑)
日本語表記するには一手間かける必要がありますので今回は説明を省略します。
2007年12月25日
極薄の板を作る
プリムサイズの最小値は「0.01」メートル、つまり1センチなのですが、タイニープリムと呼ばれる極小のプリムが存在します。作り方はいろいろあるのですが、今日は極薄の板の作り方を紹介します。

上の写真の板の厚みは、右「0.01」、中央「0.005」、左「0.0002」です。
普通に作ると厚み「0.01」までですが、パスカットを使って厚みを半分にすることが出来ます。パスカットの始点「0.125」終点「0.625」にするとどんな形状のプリムもちょうど半分になります。この方法だと最小厚みは「0.005」
これより薄い板を作るにはどうしたらいいか?
続きを読む

上の写真の板の厚みは、右「0.01」、中央「0.005」、左「0.0002」です。
普通に作ると厚み「0.01」までですが、パスカットを使って厚みを半分にすることが出来ます。パスカットの始点「0.125」終点「0.625」にするとどんな形状のプリムもちょうど半分になります。この方法だと最小厚みは「0.005」
これより薄い板を作るにはどうしたらいいか?
続きを読む
2007年12月21日
ドアに鍵をつける
以前にドアスクリプトを何種類か紹介しましたが、いずれも開閉するだけのドアでした。自作したドアなら簡単に鍵がつけられます。ドアのオーナー(所有者)がタッチした時だけ開くという感じです。
タッチしたアバター情報は
llDetectedKey:タッチしたアバターのUUID
llDetectedName:タッチしたアバターの名前
llDetectedPos:タッチしたアバターの位置
llDetectedRot:タッチしたアバターの角度
という関数で調べる事が出来ます。
ドアに鍵をつけるのであればllDetectedKeyを使うのが良いでしょう。この関数で取得出来る値はUUIDと言って、アバターに限らず全てのオブジェクトにつけられている数字によるナンバーみたいなものです。ひとつとして重なる番号はありませんので、この数字でドアのオーナーかどうかを判別すれば良いわけです。
オブジェクトのオーナーのUUIDを取得するにはllGetOwnerという関数を使います。
ファントムドアにこれを導入すると
key TOUCH;
integer OPEN;
DoorOpen()
{
llSetStatus(STATUS_PHANTOM,TRUE);
llSetAlpha(0,ALL_SIDES);
OPEN = TRUE;
}
DoorClose()
{
llSetStatus(STATUS_PHANTOM,FALSE);
llSetAlpha(1,ALL_SIDES);
OPEN = FALSE;
}
default
{
state_entry()
{
DoorClose();
}
touch_start(integer total_number)
{
TOUCH = llDetectedKey(0);
if(TOUCH == llGetOwner())
{
if(!OPEN){ DoorOpen(); }
else{ DoorClose(); }
}
}
}
最初に(state_entry)
ドアを閉めておく(DoorClose)
タッチした時(touch_start)に
タッチしたアバターのUUIDを取得(TOUCH = llDetectedKey)
オブジェクトのオーナー(if( TOUCH == llGetOwner ))であれば
ドアが閉まっていれば開ける(DoorOpen)
開いていれば閉める(DoorClose)
オブジェクトのオーナーでなければ何もしないというスクリプトです。
上記スクリプトでの DoorOpen、DoorClose というのはユーザ関数と言われるもので独自に作れる関数です。default以下の内容がメインスクリプトになります。ドアの開閉など同じ記述が複数出てくる時に使うとスクリプトがすっきりと見やすくなります。
llDetectedKey(0)と引数に「0」が入っていますが、これは最初にタッチした人になります。タッチが複数同時に重なる事もありえますが、とりあえず最初にタッチした人だけ調べれば良いでしょう。
これは自分でドアを作る事を前提にしています。買ってきたドアが編集可であれば、スクリプトごと入れ替えれば鍵付きに出来るかもしれません。が、元のドアの動きとは当然のことながら変わってしまいます。
元々設置されてるドアにRLのように物理的な鍵をつけるというのは、やった事がないので出来るのかどうかも分かりませんが、つっかえ棒をしたとしてもドアが開きますので(笑)難しいかもしれない。
タッチしたアバター情報は
llDetectedKey:タッチしたアバターのUUID
llDetectedName:タッチしたアバターの名前
llDetectedPos:タッチしたアバターの位置
llDetectedRot:タッチしたアバターの角度
という関数で調べる事が出来ます。
ドアに鍵をつけるのであればllDetectedKeyを使うのが良いでしょう。この関数で取得出来る値はUUIDと言って、アバターに限らず全てのオブジェクトにつけられている数字によるナンバーみたいなものです。ひとつとして重なる番号はありませんので、この数字でドアのオーナーかどうかを判別すれば良いわけです。
オブジェクトのオーナーのUUIDを取得するにはllGetOwnerという関数を使います。
ファントムドアにこれを導入すると
key TOUCH;
integer OPEN;
DoorOpen()
{
llSetStatus(STATUS_PHANTOM,TRUE);
llSetAlpha(0,ALL_SIDES);
OPEN = TRUE;
}
DoorClose()
{
llSetStatus(STATUS_PHANTOM,FALSE);
llSetAlpha(1,ALL_SIDES);
OPEN = FALSE;
}
default
{
state_entry()
{
DoorClose();
}
touch_start(integer total_number)
{
TOUCH = llDetectedKey(0);
if(TOUCH == llGetOwner())
{
if(!OPEN){ DoorOpen(); }
else{ DoorClose(); }
}
}
}
最初に(state_entry)
ドアを閉めておく(DoorClose)
タッチした時(touch_start)に
タッチしたアバターのUUIDを取得(TOUCH = llDetectedKey)
オブジェクトのオーナー(if( TOUCH == llGetOwner ))であれば
ドアが閉まっていれば開ける(DoorOpen)
開いていれば閉める(DoorClose)
オブジェクトのオーナーでなければ何もしないというスクリプトです。
上記スクリプトでの DoorOpen、DoorClose というのはユーザ関数と言われるもので独自に作れる関数です。default以下の内容がメインスクリプトになります。ドアの開閉など同じ記述が複数出てくる時に使うとスクリプトがすっきりと見やすくなります。
llDetectedKey(0)と引数に「0」が入っていますが、これは最初にタッチした人になります。タッチが複数同時に重なる事もありえますが、とりあえず最初にタッチした人だけ調べれば良いでしょう。
これは自分でドアを作る事を前提にしています。買ってきたドアが編集可であれば、スクリプトごと入れ替えれば鍵付きに出来るかもしれません。が、元のドアの動きとは当然のことながら変わってしまいます。
元々設置されてるドアにRLのように物理的な鍵をつけるというのは、やった事がないので出来るのかどうかも分かりませんが、つっかえ棒をしたとしてもドアが開きますので(笑)難しいかもしれない。
2007年12月17日
ちゃんと座れる椅子を作る
以前に作り方を紹介した椅子(作り方はこちら参照)ですが、そのままだと座るたびに角度が違うし、写真左のようにお尻がめり込んだりします。


これを写真右のようにちゃんと座らせるにはスクリプトで座る位置を指定してあげる必要があります。
この椅子のスクリプトはこちら
vector offset = <-1.1,0.0,-0.15>;
vector rot = <0.0,270.0,0.0>;
rotation SitRot;
default
{
state_entry()
{
SitRot = llEuler2Rot(rot*DEG_TO_RAD);
llSitTarget(offset,SitRot);
}
}
これだけです。
llEuler2Rotという関数はベクター型<x,y,z>の角度をローテーション型<x,y,z,s>に変更するものです。最初はただそういうものだと覚えておけば良いでしょう。
llSitTargetは、どの位置にどの角度で座らせるかという関数です。
スクリプトの最初にoffsetとrotを定義していますが、直接関数の中に書いても結果は同じです。
この椅子の場合、Y軸が90度回転した状態なので、rotの値は<0.0,270.0,0.0>となっています。270度=−90度です。
ちなみにこのスクリプトを円柱の椅子に適用すると

見事に後方に90度倒れます。
offsetの値は、椅子の中心軸からアバターの中心軸の差です。椅子の大きさや、形でここの値は変わってきますので、何度も座って微調整してください。この値はベクター型と言って<x,y,z>で表現します。
円柱椅子のスクリプトはこちら
vector offset = <0.3,0.0,0.6>;
vector rot = <0.0,0.0,0.0>;
rotation SitRot;
default
{
state_entry()
{
SitRot = llEuler2Rot(rot*DEG_TO_RAD);
llSitTarget(offset,SitRot);
}
}
いずれの椅子も丸形なので座る向きは椅子を回転させて調節した方が簡単です。


椅子に座った状態で編集モードにして、Z軸(青)を回転させテーブル等に向きを合わせます。シットボールが球体なのは、向きなどを変えるのに都合が良いからだと勝手に解釈しております(笑)
複数のプリムで作った椅子でも基本的には同じです。ただ ルートプリムの位置や角度によってはなかなか思い通りの位置にこない場合もあります。
最後に椅子の場合、ワンクリックで座れるように出来ます。

編集ウィンドウの「一般」タブの一番下のプルダウンメニューで「オブジェクトに座る」を選択すると椅子にカーソルが合った時に小さい椅子アイコンが出ます。SL始めた頃は正直言ってあのアイコンがなんなのか良くわかりませんでした(苦笑)
これでちゃんとした向きに座れる椅子は出来ますが、座ると同時にアニメーションさせるには少々スクリプトの勉強が必要です。


これを写真右のようにちゃんと座らせるにはスクリプトで座る位置を指定してあげる必要があります。
この椅子のスクリプトはこちら
vector offset = <-1.1,0.0,-0.15>;
vector rot = <0.0,270.0,0.0>;
rotation SitRot;
default
{
state_entry()
{
SitRot = llEuler2Rot(rot*DEG_TO_RAD);
llSitTarget(offset,SitRot);
}
}
これだけです。
llEuler2Rotという関数はベクター型<x,y,z>の角度をローテーション型<x,y,z,s>に変更するものです。最初はただそういうものだと覚えておけば良いでしょう。
llSitTargetは、どの位置にどの角度で座らせるかという関数です。
スクリプトの最初にoffsetとrotを定義していますが、直接関数の中に書いても結果は同じです。
この椅子の場合、Y軸が90度回転した状態なので、rotの値は<0.0,270.0,0.0>となっています。270度=−90度です。
ちなみにこのスクリプトを円柱の椅子に適用すると

見事に後方に90度倒れます。
offsetの値は、椅子の中心軸からアバターの中心軸の差です。椅子の大きさや、形でここの値は変わってきますので、何度も座って微調整してください。この値はベクター型と言って<x,y,z>で表現します。
円柱椅子のスクリプトはこちら
vector offset = <0.3,0.0,0.6>;
vector rot = <0.0,0.0,0.0>;
rotation SitRot;
default
{
state_entry()
{
SitRot = llEuler2Rot(rot*DEG_TO_RAD);
llSitTarget(offset,SitRot);
}
}
いずれの椅子も丸形なので座る向きは椅子を回転させて調節した方が簡単です。


椅子に座った状態で編集モードにして、Z軸(青)を回転させテーブル等に向きを合わせます。シットボールが球体なのは、向きなどを変えるのに都合が良いからだと勝手に解釈しております(笑)
複数のプリムで作った椅子でも基本的には同じです。ただ ルートプリムの位置や角度によってはなかなか思い通りの位置にこない場合もあります。
最後に椅子の場合、ワンクリックで座れるように出来ます。

編集ウィンドウの「一般」タブの一番下のプルダウンメニューで「オブジェクトに座る」を選択すると椅子にカーソルが合った時に小さい椅子アイコンが出ます。SL始めた頃は正直言ってあのアイコンがなんなのか良くわかりませんでした(苦笑)
これでちゃんとした向きに座れる椅子は出来ますが、座ると同時にアニメーションさせるには少々スクリプトの勉強が必要です。
2007年12月16日
家具を作る:照明スタンド編
実際に照明効果のあるスタンドを作りましょう。

チュープからスタンド部分を作ります。


「穴寸法Y」を「0.5」に、「プロフィールカット」を「0.5」にすると円錐状になります(写真左)これから「中空」を「85」にすると写真右のようなスタンド状になります。
傘部分を作るのに新たにプリムを作っても良いのですが、中心軸を合わせるのはなかなか面倒なので、スタンド部分をシフトキーを押したまま、上方向(青い矢印)にドラッグします。するとスタンドがコピーされます。


コピーしたものを「チューブ」から「球体」に変えます。すると右写真のようになります。
ライト部分も同じように傘部分をシフトキーを押したまま下方向にコピーして「さざなみB」を「0」にします。

完全な球体になるのでライトっぽく変形。

球体の場合、Y軸が90度回転してますので、一旦「0」に戻すとZ軸方向が天地の厚みになるので感覚的に分かりやすいです。
位置を微調整しテクスチャを変えます。傘部分は白く透明に。

「テクスチャ(赤丸)」部分をクリックするとテクスチャウィンドウが開きます。「ブランク」を選ぶとテクスチャが無くなり、白になります。「透過度」を「40%」くらいにします。
スタンド部分は「 Liblary 」の「 Textures 」フォルダに入っている「 Wood 」フォルダから「 Bubinga 」を選択しました。

ライト部分は「ブランク」にして色を黄色に。これで見た目の形は出来ましたが、光って見えません。
照明効果を出すには「特徴」タブの「光」にチェックを入れます。


周りが明るいと分かりづらいので夜の設定にします。夜にするにはビューア上部の「世界」メニューの一番下「太陽の調節」で変えられます。
「光」にチェックを入れても、いまいち光って見えないという人は環境設定のローカルライト設定が出来てないと思われます。ローカルライトの設定はこちらを参照してください。
光源の色を変えるには「色」の四角をクリックするとカラーピッカーウィンドウが開きますので、そこで調節してください。写真では黄色になっています。
「光度」「半径」「弱まる」は数値をいろいろいじってみましょう。通常はデフォルトのままでも十分だと思います。
ちなみに傘の形を変えたい場合、傘部分を選択した状態で球体から他のブロックタイプを選びます。


ブロックタイプによっては、変な形になりますが角度やパラメータを変える事により、まともな形になります。
光も風と同様に壁で遮る事が出来ません。

光源部分を完全に覆ってみても、照明効果はまったく同じです。

チュープからスタンド部分を作ります。


「穴寸法Y」を「0.5」に、「プロフィールカット」を「0.5」にすると円錐状になります(写真左)これから「中空」を「85」にすると写真右のようなスタンド状になります。
傘部分を作るのに新たにプリムを作っても良いのですが、中心軸を合わせるのはなかなか面倒なので、スタンド部分をシフトキーを押したまま、上方向(青い矢印)にドラッグします。するとスタンドがコピーされます。


コピーしたものを「チューブ」から「球体」に変えます。すると右写真のようになります。
ライト部分も同じように傘部分をシフトキーを押したまま下方向にコピーして「さざなみB」を「0」にします。

完全な球体になるのでライトっぽく変形。

球体の場合、Y軸が90度回転してますので、一旦「0」に戻すとZ軸方向が天地の厚みになるので感覚的に分かりやすいです。
位置を微調整しテクスチャを変えます。傘部分は白く透明に。

「テクスチャ(赤丸)」部分をクリックするとテクスチャウィンドウが開きます。「ブランク」を選ぶとテクスチャが無くなり、白になります。「透過度」を「40%」くらいにします。
スタンド部分は「 Liblary 」の「 Textures 」フォルダに入っている「 Wood 」フォルダから「 Bubinga 」を選択しました。

ライト部分は「ブランク」にして色を黄色に。これで見た目の形は出来ましたが、光って見えません。
照明効果を出すには「特徴」タブの「光」にチェックを入れます。


周りが明るいと分かりづらいので夜の設定にします。夜にするにはビューア上部の「世界」メニューの一番下「太陽の調節」で変えられます。
「光」にチェックを入れても、いまいち光って見えないという人は環境設定のローカルライト設定が出来てないと思われます。ローカルライトの設定はこちらを参照してください。
光源の色を変えるには「色」の四角をクリックするとカラーピッカーウィンドウが開きますので、そこで調節してください。写真では黄色になっています。
「光度」「半径」「弱まる」は数値をいろいろいじってみましょう。通常はデフォルトのままでも十分だと思います。
ちなみに傘の形を変えたい場合、傘部分を選択した状態で球体から他のブロックタイプを選びます。


ブロックタイプによっては、変な形になりますが角度やパラメータを変える事により、まともな形になります。
光も風と同様に壁で遮る事が出来ません。

光源部分を完全に覆ってみても、照明効果はまったく同じです。
2007年12月15日
ツルツル凸凹にするには
通常のタコはこんな感じですが

こんな風にツルツル、凸凹に出来ます。


編集モードのテクスチャのところで


「輝き」のプルダウンメニューで左は「なし」、右は「高」の設定です。
ツヤが増すと同時に色も濃くなります。これは空の色も加算された結果です。通常のタコは「低」の設定にしてあります。
凸凹にするには


「凸凹」のプルダウンメニューからマチエールを選択します。メニューの最初の2つ「明暗」以外はテクスチャに関係なくマチエールがつきます。「明暗」はテクスチャの明るい部分、暗い部分を元にマチエールをつけるので一番自然な仕上がりになります。
で、ここまで見ながらやっていて、ツルツルにも凸凹にもならないという人は環境設定を見てください。


通常版 1.185(写真左)の場合は「グラフィック1」の「バンプマップと輝きを有効にする」にチェックを入れてください。
Windlight(写真右)の場合は「表示」のスライダ横の「 custom 」にチェックを入れると下半分の項目が見えるようになるので「 BumpMapping and Shiny 」にチェックを入れてください。
ここのチェックが外れていると

輝きが「高」でもツルツルにならないし、凸凹も表現されません。
でも周りの人からはちゃんと見えていますので、モノ作りする人は特にこの設定は大事ですね。

こんな風にツルツル、凸凹に出来ます。


編集モードのテクスチャのところで


「輝き」のプルダウンメニューで左は「なし」、右は「高」の設定です。
ツヤが増すと同時に色も濃くなります。これは空の色も加算された結果です。通常のタコは「低」の設定にしてあります。
凸凹にするには


「凸凹」のプルダウンメニューからマチエールを選択します。メニューの最初の2つ「明暗」以外はテクスチャに関係なくマチエールがつきます。「明暗」はテクスチャの明るい部分、暗い部分を元にマチエールをつけるので一番自然な仕上がりになります。
で、ここまで見ながらやっていて、ツルツルにも凸凹にもならないという人は環境設定を見てください。


通常版 1.185(写真左)の場合は「グラフィック1」の「バンプマップと輝きを有効にする」にチェックを入れてください。
Windlight(写真右)の場合は「表示」のスライダ横の「 custom 」にチェックを入れると下半分の項目が見えるようになるので「 BumpMapping and Shiny 」にチェックを入れてください。
ここのチェックが外れていると

輝きが「高」でもツルツルにならないし、凸凹も表現されません。
でも周りの人からはちゃんと見えていますので、モノ作りする人は特にこの設定は大事ですね。
2007年12月15日
家を作る:床編
床もテクスチャの貼り方でだいぶイメージが変わります。

テクスチャを貼るには編集モードでテクスチャを貼りたいプリムを選択した状態で「テクスチャ(赤丸)」の部分をクリックするとテクスチャ選択ウィンドウが開きます。適当なテクスチャを選びましょう。上の写真ではデフォルトで持ち物に入っているフロアタイルを使用しました。

「顔ごとに繰り返す」となっていますが、face(面)ごとに繰り返すという事だと思います。


垂直方向、水平方向に繰り返しの回数が変わります。
「顔ごとに繰り返す」の数値を変えると、その下の「メートルごとに繰り返す」の数値も自動的に変わります。


こちらの数値では垂直水平別々に設定出来ません。
テクスチャを繰り返せば一枚の板でタイル状に出来るということです。
一番下の項目「ずれ」では垂直水平にテクスチャを動かせます。


垂直水平をいずれも「0.5」にするとちょうど半分ずつずれた事になります。
微妙なずれはこれで微調整する事が出来ます。
テクスチャに関してはまだまだ設定項目がありますので別の機会に書きたいと思います。

テクスチャを貼るには編集モードでテクスチャを貼りたいプリムを選択した状態で「テクスチャ(赤丸)」の部分をクリックするとテクスチャ選択ウィンドウが開きます。適当なテクスチャを選びましょう。上の写真ではデフォルトで持ち物に入っているフロアタイルを使用しました。

「顔ごとに繰り返す」となっていますが、face(面)ごとに繰り返すという事だと思います。


垂直方向、水平方向に繰り返しの回数が変わります。
「顔ごとに繰り返す」の数値を変えると、その下の「メートルごとに繰り返す」の数値も自動的に変わります。


こちらの数値では垂直水平別々に設定出来ません。
テクスチャを繰り返せば一枚の板でタイル状に出来るということです。
一番下の項目「ずれ」では垂直水平にテクスチャを動かせます。


垂直水平をいずれも「0.5」にするとちょうど半分ずつずれた事になります。
微妙なずれはこれで微調整する事が出来ます。
テクスチャに関してはまだまだ設定項目がありますので別の機会に書きたいと思います。
2007年12月11日
家をつくる:カーテン編
風になびくカーテンを作ります。まずは立方体を適当な大きさにして、厚みを最小の「0.01」にします。これは1センチでまだまだ厚いですが、カーテンにするには特に問題はありません。もっと極薄なプリムの作り方もありますが今回は説明いたしません。

「特徴」タブの「フレキシブル・パス」にチェックします。

フレキシブルとは柔軟性という事です。これを選択すると中心軸がプリムの中心から端へ移動します。中心軸は動かないのでフレキシブルの特性上、中心軸がプリムの中心にあっては都合が悪いのです。
デフォルト(初期設定)では「風」の項目が「0」になっています。これを「1」にすると

クタっと倒れます。これは風の影響をどれくらい受けるかという設定で、数値を上げれば風の影響をより多く受けます。他パラメータも同様です。「重力」の数値を上げればより重力の影響を受けるようになります。いろいろ試してみると面白いかも。
180度回転して、テクスチャを貼ります。

透過度を「20」にしてみました。20%でも結構透けて見えますね。
カーテンとしてはこんな感じで十分でしょう。
続きを読む

「特徴」タブの「フレキシブル・パス」にチェックします。

フレキシブルとは柔軟性という事です。これを選択すると中心軸がプリムの中心から端へ移動します。中心軸は動かないのでフレキシブルの特性上、中心軸がプリムの中心にあっては都合が悪いのです。
デフォルト(初期設定)では「風」の項目が「0」になっています。これを「1」にすると

クタっと倒れます。これは風の影響をどれくらい受けるかという設定で、数値を上げれば風の影響をより多く受けます。他パラメータも同様です。「重力」の数値を上げればより重力の影響を受けるようになります。いろいろ試してみると面白いかも。
180度回転して、テクスチャを貼ります。

透過度を「20」にしてみました。20%でも結構透けて見えますね。
カーテンとしてはこんな感じで十分でしょう。
続きを読む
2007年12月11日
家を作る:回転ドア編
一般的な片回転ドアを作ります。タッチ開閉式です。
スクリプトは以下の通り
integer OPEN;
rotation CLOSE_ROT;
rotation OPEN_ROT;
default
{
state_entry()
{
CLOSE_ROT = llGetRot();
OPEN_ROT = llEuler2Rot( <0.0,0.0,90.0 >*DEG_TO_RAD)*CLOSE_ROT;
OPEN = FALSE;
}
touch_start(integer total_number)
{
if(!OPEN)
{
llSetRot(OPEN_ROT);
OPEN = TRUE;
}
else
{
llSetRot(CLOSE_ROT);
OPEN =FALSE;
}
}
}
ファントムドアとそう変わりないですが、回転ドアの場合は回転角度を計算する必要があります。
これを簡単に訳すると
最初に( state_entry )
閉じている時の回転角度(CLOSE_ROT)を計算
CLOSE_ROTから開いている時の角度(OPEN_ROT)を計算
タッチされた時 ( touch_start )
ドアが開いていなければ、OPEN_ROTに回転
ドアが開いていれば、CLOSE_ROT に回転
ということです。
これをドアになるプリムのコンテンツに入れます。


動きが分かりやすいように両端に柱を置いています。先ほどのスクリプトを入れてタッチしてみると右の写真のような感じになります。これでもドアとして機能しますが、ちょっと変ですね。
続きを読む
スクリプトは以下の通り
integer OPEN;
rotation CLOSE_ROT;
rotation OPEN_ROT;
default
{
state_entry()
{
CLOSE_ROT = llGetRot();
OPEN_ROT = llEuler2Rot( <0.0,0.0,90.0 >*DEG_TO_RAD)*CLOSE_ROT;
OPEN = FALSE;
}
touch_start(integer total_number)
{
if(!OPEN)
{
llSetRot(OPEN_ROT);
OPEN = TRUE;
}
else
{
llSetRot(CLOSE_ROT);
OPEN =FALSE;
}
}
}
ファントムドアとそう変わりないですが、回転ドアの場合は回転角度を計算する必要があります。
これを簡単に訳すると
最初に( state_entry )
閉じている時の回転角度(CLOSE_ROT)を計算
CLOSE_ROTから開いている時の角度(OPEN_ROT)を計算
タッチされた時 ( touch_start )
ドアが開いていなければ、OPEN_ROTに回転
ドアが開いていれば、CLOSE_ROT に回転
ということです。
これをドアになるプリムのコンテンツに入れます。


動きが分かりやすいように両端に柱を置いています。先ほどのスクリプトを入れてタッチしてみると右の写真のような感じになります。これでもドアとして機能しますが、ちょっと変ですね。
続きを読む
2007年12月10日
家を作る:ファントムドア編
タッチして動作するようなドアを作るには、やはりスクリプトが必要です。
個人的に一番簡単だと思うタッチするとファントム(すり抜けられる)化するドアのスクリプトを紹介します。
まずドアになるプリムを作り、編集ウィンドウの「コンテンツ」タブの「新しいスクリプト」ボタンを押します。

すると「Hello Avatar! 」というのがチャットに表示されます。これはこのオブジェクトが喋っているのです。
コンテンツの中に「 New script 」というのが出来ているので、開いてみると

すでにスクリプトが記述されています。このスクリプトの意味を簡単に訳すると
最初に「 Hello,Avatar! 」と言いなさい。
タッチされたら「 Touched. 」と言いなさい。
編集モードを抜けて、実際にタッチしてみると「 Touched. 」と喋ります。
ではさっそく、このスクリプトを編集していきましょう。
続きを読む
個人的に一番簡単だと思うタッチするとファントム(すり抜けられる)化するドアのスクリプトを紹介します。
まずドアになるプリムを作り、編集ウィンドウの「コンテンツ」タブの「新しいスクリプト」ボタンを押します。

すると「Hello Avatar! 」というのがチャットに表示されます。これはこのオブジェクトが喋っているのです。
コンテンツの中に「 New script 」というのが出来ているので、開いてみると

すでにスクリプトが記述されています。このスクリプトの意味を簡単に訳すると
最初に「 Hello,Avatar! 」と言いなさい。
タッチされたら「 Touched. 」と言いなさい。
編集モードを抜けて、実際にタッチしてみると「 Touched. 」と喋ります。
ではさっそく、このスクリプトを編集していきましょう。
続きを読む
