2011年02月03日
スクリプト:地形のスカルプを作る
どもどもこんちゃ。
さて、先日ツイッターの方で
「地形をスカルプにするフリーは結構出回ってるよー」
と言ったにもかかわらず自分が探せなかったのでw
非常にシンプルではありますが、サンプルスクリプトを作って公開しておきます。 もっと便利に作り直して商品化しても別にかまいませんので、どぞご自由にご利用くださいませ。
■ 機能と用途:
指定された範囲でSIMの地形を読み込み、スカルプデータを出力します。
地形にフィットしたスカルプを地面に置きたい場合にご利用ください。
■ 前提条件:
■ SL以外に必要なもの:
スカルプデータを出力するという事ではプリムオーブンと似たようなモンですが、こちらはフリー公開なシロモノですので、手作業の部分が多少めんどくさいです。その辺はフリーもんとしてご了承くださいませ。
さてではさっそく。
■ 利用手順
0) スクリプトをプリムに仕込みます。
まず新規に1つプリムを作成し、そのプリムに以下のスクリプトをコピーして仕込んでください。
スクリプトの入れ方がわかんなーいな方は、過去の記事の 設定手順 1) をご参照。
●スクリプト: s2getsculpty ( ダウンロード )
こんな風にね。スクリプトの名前は何でもいいです。

これで地形のスカルプデータ出力機のできあがり! あとは使うだけ!
1) スカルプ化したい地形の範囲を指定します。
スカルプ化したい土地の範囲を x,y 座標で指定します。
例えば、この辺のむき出しになった地面をスカルプで覆いたいなぁという場合。

土地の範囲の座標をチェックするには、何かダミーのプリムを作って実際に置いてみるのが早いですね。 この場合はここのスミっこの x,y 座標は 31,32 かぁ、てな具合で。

ここの例としては、 x,y 座標で 14,9 から 31,32 の範囲を指定してみましょう。

先ほどコピーしたスクリプトの先頭に、
・ x座標の始めと終わり
・ y座標の始めと終わり
を記述してください。 ちなみに SIM を丸々指定する場合は 0 と 256 の座標を指定します。
スクリプトを変更したら保存して編集画面は閉じてください。
2) 土地の大きさのヒュージプリムを用意します。
とりあえず一回、スクリプトを仕込んだプリムをクリックしてみてください。 しばらくして、何やら数字がぐわーーーーーーっと表示されますが、あわてないあわてない。

そして最後に "Ground Size:" として、指定した土地の範囲の大きさが表示されます。
これが土地のサイズになります。 このサイズと丁度同じ大きさのヒュージプリムがあればラッキーですが、無い場合はこのサイズより大きくてなるべく近いものをご用意ください。
ん? ヒュージプリム持ってないですって?
そんな方に朗報、とても便利な HUD がマーケットプレイスでフリーでありました。
・ SALT HUD
こちらをゲットして HUD を装着してみてください。

こんなのが画面に表示されます。
ここで欲しいヒュージプリムのサイズをチャットで発言しましょう。
先ほどの例だと、 x,y,z の大きさが 17×23×10 以上あればいいですね。

チャット欄で /1 request x y z と発言してみてください。
すると HUD がこんな風になりました。

丁度同じ大きさのヒュージプリムがあれば即座にプリムが送られてきます。
が、無い場合は候補として近いサイズが一覧として表示されます。
17×23×10 より大きくて一番近い候補は・・・ <20,24,10> かな?
ということで欲しい候補をポチっとクリックします。
するとしばらくして(数秒~数十秒お待ちを)選択したサイズのヒュージプリムが届きました。

なかなか便利ですね、この HUD。
ということでもらうモンもらったら SALT HUD は外しておきましょう(シビア)。
3) 用意できたヒュージプリムの大きさを記述します。
さて次に、先ほどゲットできたヒュージプリムの大きさを、スクリプトの先頭に記述してあげます。
編集画面からスクリプトを開いてください。

ここですね。 20×24×10 の大きさでしたからこのように記述します。
これでもろもろの準備完了です。
編集画面は閉じておいてください。
4) スカルプマップのデータをコピー&ペーストします。
それではさっそく、スクリプトを仕込んだプリムをクリックしてください。
先ほどと同じように、数字がぐわぁーーーっと表示されます。
出力されたデータの一番最初、*** 1 *** から、

最後の *** 13 *** のデータの一番下まで( Ground Size の上まで)マウスでドラッグしてコピーしてください。

そしてコピーしたデータを、SL外部のテキストエディター、メモ帳(Mac の場合は TextEdit )などに貼り付けてください。

こんな具合に。
そしてここからが ひと手間!
まずはコピペしたデータを見て、 *** 1 *** から *** 13 *** まで数字が順番に並んでいることを確認してください。 SIM が重い場合など、チャットにラグが発生して順番が入れ替わってしまってる場合もあります。
もし順番が入れ替わっていた場合は、もう一度データを出力してコピペしなおすか、手作業でデータを順番どおりに入れ替えてください。
順番に並んでいることを確認しましたら、次に、コピペしたデータの中で データ以外の行(例えば時間が表示されている行や 友達の会話が入ってしまった行)を チマチマと削除してください。
この場合は黄色い部分の行を削除します。

削除した結果こんな感じになります。

メンドクサイですけど我慢我慢!w
編集が終わったら保存しましょう。
ただし、拡張子は .ppm です。 .txt ではありません。

「ファイルの種類」をいったん "すべてのファイル" に切り替えてから、ファイル名を ~.ppm として保存してください。
ちなみにファイルはプレーン・テキストで保存してください。
Windows のメモ帳の場合は特に気にすることはありません。
Mac の TextEdit をお使いの場合は、こちらを参照してくださいまし。
5) スカルプマップの画像を編集します。
さてさて手間はまだまだ続きます。
グラフィックツールを起動してください。
ここでは GIMP を例にして作業を進めていきますね。
先ほど保存した ~.ppm のファイルを GIMP で開いてください。

大きさ 33×33 の虹色の絵が表示されたらひとまず成功です!
表示されない、または下が欠けてしまっている場合は、データ出力からやり直してみてください。
この画像を、まずは2倍の大きさにしましょう。
メニューの [画像] > [画像の拡大・縮小] を選択してください。

画像サイズの幅と高さに、2倍のサイズ 66 を指定します。
次にコレが重要! 品質の補完方法を 「補完しない」 に設定してください。
そして 「拡大縮小」 ボタンをクリックして、画像を拡大します。
※ Photoshop の場合は [イメージ] > [画像解像度] を選択し、画像の再サンプルを 「ニアレストネイバー法」 に設定します。 PaintShopPro の場合は [画像] > [サイズ変更] を選択し、サイズ変更の方式を 「ピクセルリサイズ」 に設定します。 ま、要は画像を拡大した時に アンチエイリアスがかからないようにしてください。
お次は 66×66 の画像から、中心部分の 64×64 のサイズを切り出します。
メニューの [画像] > [キャンバスサイズの変更] を選択してください。

キャンバスサイズの幅と高さに 64 を指定し、 「中央」 ボタンをクリックします。
これで画像の中央部分の 64×64 を切り出すことになります。
「サイズ変更」 ボタンをクリックしてください。
GIMPでの注意点はありませんが、他のグラフィックツールを使用して画像の切り抜きを行う場合はアンチエイリアスがかからないように注意してくださいね。
以上で画像の編集は終了です!
画像を TGA または PNG の拡張子(フォーマット)で保存してください。
GIMP の場合は、[ファイル] > [名前をつけて保存] から保存する際に、ファイル名の拡張子を ~.tga または ~.png に変更して保存すれば OK です。
6) SLに画像(スカルプマップ)をアップロードします。
先ほど TGA または PNG で保存した虹色の画像(スカルプマップ)を SL にアップロードします。

アップロードする際に、プレビュー画面の左下、「可逆圧縮」 にチェックが入っていることを確認しましょう。 このチェックが入っていないとスカルプがグジャグジャに崩れちゃいますので注意。
そして 2) で用意したヒュージプリムを REZ し、アップロードしたスカルプマップを貼り付けます。

編集画面の 「形状」 タブで 「スカルプト」を選択し、アップロードした画像をドラッグ&ドロップします。
そして 「縫い目のタイプ」 を 「平面」 にしましょう。
あ、ファントムにチェック入れるのをお忘れなく。
スカルプの位置を地形にあわせればとりあえず完成です!

・・・流石に、地形に完全ぴったりフィットとはいかないですね。
ところどころ地肌が見えちゃってます。

そこはなんとかスカルプの位置を調節するか、1つのスカルプのサイズを小さくして精度を高めるなど、色々とチャレンジしてみてください。
後はお好みのテクスチャを貼ってみましょう。

おお、なかなかいい感じでない?

ということで、地形のスカルプを作るスクリプトの説明は以上です。
まぁスクリプト、といっても作業の大半は手作業なので、たいしたスクリプトじゃありませんがw 色々応用はきくと思いますので、スクリプトが判る方はどんどん改造して使ってくださいませ。
応用編として、地形で好きな形を作ってそれをスカルプに変換する、って手もありますね。

こんなぽっこりしたスカルプも思いのまま。
お試しあれ。
さて、先日ツイッターの方で
「地形をスカルプにするフリーは結構出回ってるよー」
と言ったにもかかわらず自分が探せなかったのでw
非常にシンプルではありますが、サンプルスクリプトを作って公開しておきます。 もっと便利に作り直して商品化しても別にかまいませんので、どぞご自由にご利用くださいませ。
■ 機能と用途:
指定された範囲でSIMの地形を読み込み、スカルプデータを出力します。
地形にフィットしたスカルプを地面に置きたい場合にご利用ください。
■ 前提条件:
- 指定した範囲の地形を1プリムのスカルプに変換します。
そのため範囲が広ければ広いほど、出来上がったスカルプの地形へのフィット具合が悪くなります。 広い範囲で地面にぴったりフィットさせたい場合は、ある程度範囲を分割して数プリムで地面をカバーするようにしましょう。
- 10mを超える範囲の地形を1プリムにしたい場合はヒュージ(メガ)プリムが必要です。
地形の大きさよりも大きいサイズのヒュージプリムをご用意ください。 ただし作る地形の範囲と、利用するヒュージプリムの大きさにギャップがありすぎるとフィット具合の精度が悪くなります。 なるべく同じくらいのサイズのヒュージプリムを使いましょう。
- 地形の範囲指定は正方形または長方形です。
L字型の地形のスカルプ作りたい!とかの場合は複数の四角の範囲に分割してご利用ください。
- このスクリプトはスカルプデータを文字情報として出力するだけです。
実際にSLのインワールドでスカルプとして使用するには、SLの外でスカルプマップの画像として加工して、SLにアップロードする必要があります。ま、当然10L$かかりますよ。
■ SL以外に必要なもの:
- テキストエディタ(Windows はメモ帳、Mac は TextEdit 等)
- グラフィックツール(GIMP 等)
- ヒュージプリム(10x10x10m 以上のスカルプを作成する場合)
スカルプデータを出力するという事ではプリムオーブンと似たようなモンですが、こちらはフリー公開なシロモノですので、手作業の部分が多少めんどくさいです。その辺はフリーもんとしてご了承くださいませ。
さてではさっそく。
■ 利用手順
0) スクリプトをプリムに仕込みます。
まず新規に1つプリムを作成し、そのプリムに以下のスクリプトをコピーして仕込んでください。
スクリプトの入れ方がわかんなーいな方は、過去の記事の 設定手順 1) をご参照。
●スクリプト: s2getsculpty ( ダウンロード )
// *** 土地のX座標 minX ~ maxX
float minX = 0;
float maxX = 256;
// *** 土地のY座標 minY ~ maxY
float minY = 0;
float maxY = 256;
// *** 利用するヒュージプリムの大きさ
float primX = 0;
float primY = 0;
float primZ = 0;
// それぞれを 0 にするとプリムのサイズを最大限に使用します。
// 20x20m の土地のスカルプを作る際に、手持ちのヒュージプリムのサイズが 24x24m など
// 丁度の大きさが無い場合に 0 以外を指定してください。
// 利用するプリムは土地の広さより大きいサイズを指定してください。(高さも同様)
// ==========================================================
float maxZ;
float minZ;
vector vPos;
float GetZ(float i, float j) {
float k = llGround(<minX-vPos.x + i*(maxX-minX)/32,
minY-vPos.y + j*(maxY-minY)/32, 0>);
return k;
}
SCheck() {
float i;
float j;
float k;
float scaleX = 1.0;
float scaleY = 1.0;
float scaleZ = 1.0;
string sTmp = "P3\n33 33 255\n";
maxZ = 0.0;
minZ = 4096.0;
vPos = llGetPos();
for (i=0; i<=32; i++) {
for (j=0; j<=32; j++) {
k = GetZ(i, j);
if (maxZ < k) maxZ = k;
if (minZ > k) minZ = k;
}
}
if (primX) scaleX = (maxX-minX)/primX;
if (primY) scaleY = (maxY-minY)/primY;
if (primZ) scaleZ = (maxZ-minZ)/primZ;
if (scaleX > 1.0) scaleX = 1.0;
if (scaleY > 1.0) scaleY = 1.0;
if (scaleZ > 1.0) scaleZ = 1.0;
for (i=0; i<=32; i++) {
for (j=0; j<=32; j++) {
k = GetZ(i, j);
sTmp += (string)llRound(scaleX*i*255/32) + " ";
sTmp += (string)llRound(scaleY*j*255/32) + " ";
sTmp += (string)llRound(scaleZ*(k-minZ)*255/(maxZ-minZ));
if (llFloor(i*33+j+1)%84 == 0 || (i==32&&j==32)) {
llOwnerSay("*** " + (string)llCeil((i*33+j)/84) + " ***\n" + sTmp);
sTmp = "";
llSleep(0.5);
} else sTmp += " ";
}
}
vPos = <maxX-minX, maxY-minY, maxZ-minZ>;
llOwnerSay("Ground Size: " + (string)vPos);
}
default
{
touch_start(integer total_number) {
if (llGetOwner() == llDetectedKey(0)) SCheck();
}
}
こんな風にね。スクリプトの名前は何でもいいです。

これで地形のスカルプデータ出力機のできあがり! あとは使うだけ!
1) スカルプ化したい地形の範囲を指定します。
スカルプ化したい土地の範囲を x,y 座標で指定します。
例えば、この辺のむき出しになった地面をスカルプで覆いたいなぁという場合。

土地の範囲の座標をチェックするには、何かダミーのプリムを作って実際に置いてみるのが早いですね。 この場合はここのスミっこの x,y 座標は 31,32 かぁ、てな具合で。

ここの例としては、 x,y 座標で 14,9 から 31,32 の範囲を指定してみましょう。

先ほどコピーしたスクリプトの先頭に、
・ x座標の始めと終わり
・ y座標の始めと終わり
を記述してください。 ちなみに SIM を丸々指定する場合は 0 と 256 の座標を指定します。
スクリプトを変更したら保存して編集画面は閉じてください。
2) 土地の大きさのヒュージプリムを用意します。
とりあえず一回、スクリプトを仕込んだプリムをクリックしてみてください。 しばらくして、何やら数字がぐわーーーーーーっと表示されますが、あわてないあわてない。

そして最後に "Ground Size:" として、指定した土地の範囲の大きさが表示されます。
これが土地のサイズになります。 このサイズと丁度同じ大きさのヒュージプリムがあればラッキーですが、無い場合はこのサイズより大きくてなるべく近いものをご用意ください。
ん? ヒュージプリム持ってないですって?
そんな方に朗報、とても便利な HUD がマーケットプレイスでフリーでありました。
・ SALT HUD
こちらをゲットして HUD を装着してみてください。

こんなのが画面に表示されます。
ここで欲しいヒュージプリムのサイズをチャットで発言しましょう。
先ほどの例だと、 x,y,z の大きさが 17×23×10 以上あればいいですね。

チャット欄で /1 request x y z と発言してみてください。
すると HUD がこんな風になりました。

丁度同じ大きさのヒュージプリムがあれば即座にプリムが送られてきます。
が、無い場合は候補として近いサイズが一覧として表示されます。
17×23×10 より大きくて一番近い候補は・・・ <20,24,10> かな?
ということで欲しい候補をポチっとクリックします。
するとしばらくして(数秒~数十秒お待ちを)選択したサイズのヒュージプリムが届きました。

なかなか便利ですね、この HUD。
ということでもらうモンもらったら SALT HUD は外しておきましょう(シビア)。
3) 用意できたヒュージプリムの大きさを記述します。
さて次に、先ほどゲットできたヒュージプリムの大きさを、スクリプトの先頭に記述してあげます。
編集画面からスクリプトを開いてください。

ここですね。 20×24×10 の大きさでしたからこのように記述します。
これでもろもろの準備完了です。
編集画面は閉じておいてください。
4) スカルプマップのデータをコピー&ペーストします。
それではさっそく、スクリプトを仕込んだプリムをクリックしてください。
先ほどと同じように、数字がぐわぁーーーっと表示されます。
出力されたデータの一番最初、*** 1 *** から、

最後の *** 13 *** のデータの一番下まで( Ground Size の上まで)マウスでドラッグしてコピーしてください。

そしてコピーしたデータを、SL外部のテキストエディター、メモ帳(Mac の場合は TextEdit )などに貼り付けてください。

こんな具合に。
そしてここからが ひと手間!
まずはコピペしたデータを見て、 *** 1 *** から *** 13 *** まで数字が順番に並んでいることを確認してください。 SIM が重い場合など、チャットにラグが発生して順番が入れ替わってしまってる場合もあります。
もし順番が入れ替わっていた場合は、もう一度データを出力してコピペしなおすか、手作業でデータを順番どおりに入れ替えてください。
順番に並んでいることを確認しましたら、次に、コピペしたデータの中で データ以外の行(例えば時間が表示されている行や 友達の会話が入ってしまった行)を チマチマと削除してください。
この場合は黄色い部分の行を削除します。

削除した結果こんな感じになります。

メンドクサイですけど我慢我慢!w
編集が終わったら保存しましょう。
ただし、拡張子は .ppm です。 .txt ではありません。

「ファイルの種類」をいったん "すべてのファイル" に切り替えてから、ファイル名を ~.ppm として保存してください。
ちなみにファイルはプレーン・テキストで保存してください。
Windows のメモ帳の場合は特に気にすることはありません。
Mac の TextEdit をお使いの場合は、こちらを参照してくださいまし。
5) スカルプマップの画像を編集します。
さてさて手間はまだまだ続きます。
グラフィックツールを起動してください。
ここでは GIMP を例にして作業を進めていきますね。
先ほど保存した ~.ppm のファイルを GIMP で開いてください。

大きさ 33×33 の虹色の絵が表示されたらひとまず成功です!
表示されない、または下が欠けてしまっている場合は、データ出力からやり直してみてください。
この画像を、まずは2倍の大きさにしましょう。
メニューの [画像] > [画像の拡大・縮小] を選択してください。

画像サイズの幅と高さに、2倍のサイズ 66 を指定します。
次にコレが重要! 品質の補完方法を 「補完しない」 に設定してください。
そして 「拡大縮小」 ボタンをクリックして、画像を拡大します。
※ Photoshop の場合は [イメージ] > [画像解像度] を選択し、画像の再サンプルを 「ニアレストネイバー法」 に設定します。 PaintShopPro の場合は [画像] > [サイズ変更] を選択し、サイズ変更の方式を 「ピクセルリサイズ」 に設定します。 ま、要は画像を拡大した時に アンチエイリアスがかからないようにしてください。
お次は 66×66 の画像から、中心部分の 64×64 のサイズを切り出します。
メニューの [画像] > [キャンバスサイズの変更] を選択してください。

キャンバスサイズの幅と高さに 64 を指定し、 「中央」 ボタンをクリックします。
これで画像の中央部分の 64×64 を切り出すことになります。
「サイズ変更」 ボタンをクリックしてください。
GIMPでの注意点はありませんが、他のグラフィックツールを使用して画像の切り抜きを行う場合はアンチエイリアスがかからないように注意してくださいね。
以上で画像の編集は終了です!
画像を TGA または PNG の拡張子(フォーマット)で保存してください。
GIMP の場合は、[ファイル] > [名前をつけて保存] から保存する際に、ファイル名の拡張子を ~.tga または ~.png に変更して保存すれば OK です。
6) SLに画像(スカルプマップ)をアップロードします。
先ほど TGA または PNG で保存した虹色の画像(スカルプマップ)を SL にアップロードします。

アップロードする際に、プレビュー画面の左下、「可逆圧縮」 にチェックが入っていることを確認しましょう。 このチェックが入っていないとスカルプがグジャグジャに崩れちゃいますので注意。
そして 2) で用意したヒュージプリムを REZ し、アップロードしたスカルプマップを貼り付けます。

編集画面の 「形状」 タブで 「スカルプト」を選択し、アップロードした画像をドラッグ&ドロップします。
そして 「縫い目のタイプ」 を 「平面」 にしましょう。
あ、ファントムにチェック入れるのをお忘れなく。
スカルプの位置を地形にあわせればとりあえず完成です!

・・・流石に、地形に完全ぴったりフィットとはいかないですね。
ところどころ地肌が見えちゃってます。

そこはなんとかスカルプの位置を調節するか、1つのスカルプのサイズを小さくして精度を高めるなど、色々とチャレンジしてみてください。
後はお好みのテクスチャを貼ってみましょう。

おお、なかなかいい感じでない?

ということで、地形のスカルプを作るスクリプトの説明は以上です。
まぁスクリプト、といっても作業の大半は手作業なので、たいしたスクリプトじゃありませんがw 色々応用はきくと思いますので、スクリプトが判る方はどんどん改造して使ってくださいませ。
応用編として、地形で好きな形を作ってそれをスカルプに変換する、って手もありますね。

こんなぽっこりしたスカルプも思いのまま。
お試しあれ。
2010年08月08日
スクリプト:ゆっくり開く回転ドア
あーつーいー(枕詞)
さてさて、スクリプトご紹介シリーズのつづきですよん。
前回はドアや引き出しなど、いろんな動きを指定できるスクリプトでしたが
今回は回転して開くドアに限定したスクリプトでっす。
まあ単なる回転ドアだと味気ないので、
まったりゆっくり開くドアのスクリプトをご紹介。
私が日頃使ってるものとほぼ一緒な感じです。
そのまま直ぐに使えまっせダンナ。
さっそくまいりましょー第2回目。
■用途:
ゆっくり開く回転ドア用スクリプトです。 開いた後、自動で閉まります。
建物にリンクされていない単独のドア、建物にリンクされているドア、両方に使えます。
■前提条件:
・ ドアが開く角度は90度です。
・ ドアの回転軸は、ドアプリムを角度x:0, y:0, z:0で設置した際のZ軸となります。
・ 建物にリンクされているドアは1プリムで作ってください。
・ 建物にリンクされているドアの場合、子プリムが可動対象です。
(ドアを建物のルートプリムにしないでください)
・ 建物にリンクされていないドアは、ドアのルートプリムの回転軸を中心に回転します。
(ドアが1プリムの場合は、そのプリムの回転軸を中心に回転します)
■参考動画:
こげな感じで。
建物にリンクされている青いドアは1プリムのBOXです。
建物とリンクされていないドアはプリム数の制限なしに動かすことができます。
1プリムドアの注意点・作り方は、前回の最後の方を御覧くださいませ。

■設定手順:
まあ今回は設定もへったくれもなく、スクリプト1つを仕込みゃ完成です。
●スクリプト1: s2door
このスクリプトを・・・
建物にリンクされているドアには、ドアのプリムに
建物にリンクされていないドアには、ドアのルートプリムに
それぞれ入れてください。
スクリプトの入れ方がわかんなーいな方は、前回の記事の 設定手順 1) をご参照ください。
さてこのスクリプト、頭のところで色々な設定ができるようになってます。
・ ドアの開く方向
ドアが奥に開くか、手前に開くかです。 1 か -1 を指定してください。
・ ドアが開くまでの時間(秒)
クリックしたドアが開ききるまでの時間です。
大きい数字を入れるとゆっくり開きます。 ※ 0 は指定しないでください
・ 自動で閉まるまでの時間(秒)
ドアが開いた後、自動で閉まるまでの時間です。
0 を指定すると自動で閉まらなくなります。
続いて音の指定について。
このまま何も指定しなければ無音のままですが、試しに以下のような UUID を指定すると、ぎ~、ばたん、と音が鳴るようになります。
音の UUID ってなんじゃらほいな方は、前回の記事の 設定手順 5) をご参照のほど。
今回は以上で完成です。 まぁ1つのスクリプト入れるだけなんで簡単ですね。
これでズゴゴゴゴゴゴゴ・・・とゆっくり開く岩の扉とか作って遊んでみてちょ!
■注意点など:
今回の注意点は3つほど。
まず最初、このゆっくり開くドアスクリプト(長い)は、SIM や PC の状況によっては 「90度以上開いた状態に見える」 ことがあります。 が、単に見えるだけなので、ドア的にはなんら問題ありません。
続いて2点目、ドアの当たり判定ですが、ドアが開いている最中は通りぬけできません。 ドアが開いているように見えて、実はまだドアが閉まっているんですね。 完全に開ききった時にようやくアバターが通り抜けできます。
なので10秒くらいかけてゆっくり開くドアを作った場合、10秒待たないと入れませんのでご注意w
最後に、このスクリプトはドアがどんな角度でも動くようになっていますが、
・ 建物にリンクされているドアで、
・ ルートプリムとの角度関係が微妙な(簡単にいうと妙に斜めってる)場合、
・ 開いてる/閉じてる最中の回転軸と、開ききった/閉じきった時の回転軸が、
少ーーーーしずれているように見えます。 ま、注意してみなければ気がつかない程度ですが。
これも 「見える」 だけなので、ドアの位置がずれるとかはないのでご安心を。
てなわけで。
いかがでしたか第2回目。
あ、そうそう。
前回の記事にコメントいただきましたが、ドアのクリックした面によって手前に開いたり奥に開いたりする方法を補足として書いておきましょ。
上記スクリプトの touch_start の部分に少し追記してあげればOKです。
クリックされたドアの面番号を見て、 S_Open に 1 か -1 を入れてあげてください。
さて次回はどうしようかな。さっそくネタが切れたようなw
というかまぁ当初の目的はこの2回分で果たされた感じですがいかかでしょうか。
なんかリクエストありましたら引き続きコメントにどうぞ~
さてさて、スクリプトご紹介シリーズのつづきですよん。
前回はドアや引き出しなど、いろんな動きを指定できるスクリプトでしたが
今回は回転して開くドアに限定したスクリプトでっす。
まあ単なる回転ドアだと味気ないので、
まったりゆっくり開くドアのスクリプトをご紹介。
私が日頃使ってるものとほぼ一緒な感じです。
そのまま直ぐに使えまっせダンナ。
さっそくまいりましょー第2回目。

■用途:
ゆっくり開く回転ドア用スクリプトです。 開いた後、自動で閉まります。
建物にリンクされていない単独のドア、建物にリンクされているドア、両方に使えます。
■前提条件:
・ ドアが開く角度は90度です。
・ ドアの回転軸は、ドアプリムを角度x:0, y:0, z:0で設置した際のZ軸となります。
・ 建物にリンクされているドアは1プリムで作ってください。
・ 建物にリンクされているドアの場合、子プリムが可動対象です。
(ドアを建物のルートプリムにしないでください)
・ 建物にリンクされていないドアは、ドアのルートプリムの回転軸を中心に回転します。
(ドアが1プリムの場合は、そのプリムの回転軸を中心に回転します)
■参考動画:
こげな感じで。
建物にリンクされている青いドアは1プリムのBOXです。
建物とリンクされていないドアはプリム数の制限なしに動かすことができます。
1プリムドアの注意点・作り方は、前回の最後の方を御覧くださいませ。

■設定手順:
まあ今回は設定もへったくれもなく、スクリプト1つを仕込みゃ完成です。
●スクリプト1: s2door
float S_Open = -1; // ドアの開く方向・・・ 1:反時計回り -1:時計回り
float S_Speed = 1.5; // ドアが開くまでの時間(秒)
float S_Auto = 5; // 自動で閉まるまでの時間(秒) 0は自動で閉まらない
string S_SoundOpen1 = ""; // 開く音(UUID)
string S_SoundOpen2 = ""; // 閉じ始める音(UUID)
string S_SoundClose = ""; // 閉じ切った音(UUID)
rotation S_InitRot;
integer S_Mode = 0;
SSound(string name) {
if (name) llPlaySound(name, 1.0);
}
STurn() {
if (S_Mode == 1) {
SSound(S_SoundOpen1);
S_InitRot = llGetLocalRot();
} else
SSound(S_SoundOpen2);
llSetTimerEvent(S_Speed);
llTargetOmega(<0, 0, S_Open>*S_InitRot, (2-S_Mode)*PI_BY_TWO/S_Speed, 1);
}
default
{
touch_start(integer num) {
if (S_Mode%2 == 0) {
S_Mode++;
STurn();
}
}
timer() {
llSetTimerEvent(0.0);
llTargetOmega(ZERO_VECTOR, 0, 0);
if (S_Mode == 2 && S_Auto > 0) {
S_Mode++;
STurn();
} else {
if (S_Mode == 1)
llSetLocalRot(llEuler2Rot(<0,0,90*S_Open>*DEG_TO_RAD)*S_InitRot);
else {
SSound(S_SoundClose);
llSetLocalRot(S_InitRot);
}
if (++S_Mode > 3) S_Mode = 0;
if (S_Mode > 0 && S_Auto > 0) llSetTimerEvent(S_Auto);
}
}
}
このスクリプトを・・・
建物にリンクされているドアには、ドアのプリムに
建物にリンクされていないドアには、ドアのルートプリムに
それぞれ入れてください。
スクリプトの入れ方がわかんなーいな方は、前回の記事の 設定手順 1) をご参照ください。
さてこのスクリプト、頭のところで色々な設定ができるようになってます。
float S_Open = -1; // ドアの開く方向・・・ 1:反時計回り -1:時計回り
float S_Speed = 1.5; // ドアが開くまでの時間(秒)
float S_Auto = 5; // 自動で閉まるまでの時間(秒) 0は自動で閉まらない
・ ドアの開く方向
ドアが奥に開くか、手前に開くかです。 1 か -1 を指定してください。
・ ドアが開くまでの時間(秒)
クリックしたドアが開ききるまでの時間です。
大きい数字を入れるとゆっくり開きます。 ※ 0 は指定しないでください
・ 自動で閉まるまでの時間(秒)
ドアが開いた後、自動で閉まるまでの時間です。
0 を指定すると自動で閉まらなくなります。
続いて音の指定について。
このまま何も指定しなければ無音のままですが、試しに以下のような UUID を指定すると、ぎ~、ばたん、と音が鳴るようになります。
string S_SoundOpen1 = "0db01d64-d31e-3146-57f5-d8eee762227c"; // 開く音(UUID)
string S_SoundOpen2 = "0db01d64-d31e-3146-57f5-d8eee762227c"; // 閉じ始める音(UUID)
string S_SoundClose = "1c158e0d-df97-705a-0d06-868060ac3d9d"; // 閉じ切った音(UUID)
音の UUID ってなんじゃらほいな方は、前回の記事の 設定手順 5) をご参照のほど。
今回は以上で完成です。 まぁ1つのスクリプト入れるだけなんで簡単ですね。
これでズゴゴゴゴゴゴゴ・・・とゆっくり開く岩の扉とか作って遊んでみてちょ!
■注意点など:
今回の注意点は3つほど。
まず最初、このゆっくり開くドアスクリプト(長い)は、SIM や PC の状況によっては 「90度以上開いた状態に見える」 ことがあります。 が、単に見えるだけなので、ドア的にはなんら問題ありません。
続いて2点目、ドアの当たり判定ですが、ドアが開いている最中は通りぬけできません。 ドアが開いているように見えて、実はまだドアが閉まっているんですね。 完全に開ききった時にようやくアバターが通り抜けできます。
なので10秒くらいかけてゆっくり開くドアを作った場合、10秒待たないと入れませんのでご注意w
最後に、このスクリプトはドアがどんな角度でも動くようになっていますが、
・ 建物にリンクされているドアで、
・ ルートプリムとの角度関係が微妙な(簡単にいうと妙に斜めってる)場合、
・ 開いてる/閉じてる最中の回転軸と、開ききった/閉じきった時の回転軸が、
少ーーーーしずれているように見えます。 ま、注意してみなければ気がつかない程度ですが。
これも 「見える」 だけなので、ドアの位置がずれるとかはないのでご安心を。
てなわけで。
いかがでしたか第2回目。
あ、そうそう。
前回の記事にコメントいただきましたが、ドアのクリックした面によって手前に開いたり奥に開いたりする方法を補足として書いておきましょ。
上記スクリプトの touch_start の部分に少し追記してあげればOKです。
touch_start(integer num) {こんな感じで。
if (S_Mode%2 == 0) {
if (S_Mode == 0) {
if (llDetectedTouchFace(0) == 1) S_Open = 1;
else S_Open = -1;
}
S_Mode++;
STurn();
}
}
クリックされたドアの面番号を見て、 S_Open に 1 か -1 を入れてあげてください。
さて次回はどうしようかな。さっそくネタが切れたようなw
というかまぁ当初の目的はこの2回分で果たされた感じですがいかかでしょうか。
なんかリクエストありましたら引き続きコメントにどうぞ~
2010年08月06日
スクリプト:ドアや引き出しを動かす
どもども。
暑いっすな!
あ、さて。
先日SL House&Garden Huntをひととおり廻って、いそいそと景品を開封してたのですが。意外とまぁ、リンクがバラバラな家とかが少なくなく。 あれですね、ドアとかの可動部分を、建物本体にリンクしていない物がたまにあるんですよ。 それってREZした後に位置をずらしたり回転させたら、ドアだけ後に残ってしまって目も当てられないという。
( ゜Д゜)< めんどくさいからリンクして1つにしててよ!
というね。他にも、今回のトレハンの景品ではないのですが、扉一つ、引き出し一つ動かすのに2つや3つもスクリプトが入っているという。
( ゜Д゜)< なんだそれ!
っていうね。 まあ文句ばっかりでゴメンナサイ。
でもアレよ、本体にリンクされているドアや引き出しとかを動かすのって、そんなたいしたスクリプトじゃないんですよね。 ただ位置や回転の角度を指定するのがちょっと面倒という。 だからもっと使う人やSIMに優しくしようぜブラザー。
ということで。
すぐに使える lsl スクリプトのサンプルでもブログで紹介しようかなと。
っつっても、用途や挙動によってスクリプトも少しづつ変わってくるので、その種類によって何回かブログを書きたいと思います。
長いよ?w
てなことで、第1回目。

■ 用途:
本体にリンクされている扉や引き出しをクリックで動かすスクリプトです。
複数の位置を記録できます。
■ 前提条件:
・ 本体にリンクされている子プリムが可動対象です(ルートプリムは対象外)。
・ 可動対象は1プリム単独です。2プリム以上は同時に動かせません。
(2プリム以上を別々に動かす事は可能です)
・ スクリプト設定後、ルートプリムの位置や角度、またはルートプリム自体を変更できません。
(ルートプリムを変更した場合は、スクリプトを再設定する必要があります)
■ 参考動画:
ま、こんな感じです。
左の青いドアが 「閉じる」 「開く」 の 2パターン、
右の黒いフタが 「閉じる」 「開く1」 「開く2」 「開く3」 の 4パターンで稼働します。
(サンプルでは黒いフタの 「開く1」 と 「開く3」 が同じ位置ですが)
■ 設定手順:
0) 可動部分のプリムを子プリムとして、本体にリンクします。
ドアや窓、引き出しなどを1プリムで用意し(スカルプでも可)、本体にリンクします。
この時、ルートプリム(編集画面で黄色く選択されているプリム)はコレ!と決めたら以後変更しないでください。ルートプリムとの位置や角度が変わってしまうと、もう一度設定する必要があります。
1) 位置情報のチェックスクリプトを可動プリムに仕込みます。
まず以下のスクリプトをコピーしましょう。
●スクリプト1: s2check
default
{
touch_start(integer num) {
string S_Tmp = "\n\t\t//----------------\n";
S_Tmp += "\t\tS_Pos += [" + (string)llGetLocalPos() + "];\n";
S_Tmp += "\t\tS_Rot += [" + (string)(llRot2Euler(llGetLocalRot())*RAD_TO_DEG) + "];\n";
S_Tmp += "\t\tS_Snd += [\"\"];\n";
S_Tmp += "\t\t//----------------";
llOwnerSay(S_Tmp);
}
}
SLの編集ウィンドウの 「リンク部分を編集」 にチェックを入れ、可動プリムを選択します。

編集の 「中身(コンテンツ)」 タブを選択し、「新しいスクリプト」 ボタンをクリックします。

新しくできたスクリプトを開き、既に書かれてあるスクリプトは全部消します。
先程コピーしたスクリプト s2check をペーストします。 ま、中身を全部入れ替えですな。

スクリプトを保存して、編集画面は閉じてください。
あ、スクリプト名は好きにつけておいてくださいね。
2) 可動する位置を記録します。
まず可動プリムを初期の位置にして、可動プリムをクリックします。

するとチャット窓になにやら怪しい数字が出てきます。これが位置情報です。
気にせず可動プリムを次の位置にあわせて、再度可動プリムをクリックします。

こんなふうに。
この例だとドアなので閉じた状態と開いた状態の2パターンしかありませんが、3パターン、4パターンとある場合は続けて同じようにして位置情報を表示させてください。
3) メインのスクリプトと入れ替えます。
続いて以下のスクリプトをコピーしてください。
●スクリプト2: s2main
list S_Pos = [];
list S_Rot = [];
list S_Snd = [];
integer S_Mode = 0;
SMove(integer num) {
if (llGetListLength(S_Pos) > num) {
key S_Sound = llList2Key(S_Snd, num);
if (S_Sound) llPlaySound(S_Sound, 1.0);
llSetPrimitiveParams([
PRIM_POSITION, llList2Vector(S_Pos, num),
PRIM_ROTATION, llEuler2Rot(llList2Vector(S_Rot, num)*DEG_TO_RAD) / llGetRootRotation()
]);
}
}
default
{
state_entry() {
// ここへ順番にコピペしてください。一番最初が初期位置となります。
// ここまで
SMove(0);
}
touch_start(integer num) {
if (++S_Mode >= llGetListLength(S_Pos)) S_Mode = 0;
SMove(S_Mode);
}
}
そして上記手順 1) で可動プリムに仕込んだスクリプトを開き、中身をこちらと入れ替えます。 開いて中身全消ししてペーストしちゃってください。
4) メインのスクリプトに位置情報を追記します。
さてここで、上記手順 2) でチャット窓に表示させた位置情報をコピーして、メインのスクリプトに挿入していきます。 挿入する箇所は、スクリプト中のオレンジ色のコメントの部分、
// ここへ順番にコピペしてください。一番最初が初期位置となります。ここのど真ん中です。
// ここまで

こんな感じで。
全部の位置情報を追記し終えたら、スクリプトを保存して編集画面を閉じちゃってください。
はい、これで完成!
思う存分クリックして、ギッコンバッタンして遊んでください!
・・・あ、そうそう、忘れてました。
5) メインのスクリプトに音の情報を追記します。(任意)
一応音を出すこともできます。 開いたときにギー、閉じたときにバタン、などなど。
それにはまずフルパーミッションのサウンドを用意してください。
そしてマウスの右クリックメニューから、UUIDをコピーします。

くりっと。
そして可動プリムの中にあるメインのスクリプトに、音の情報として UUID を追記します。

追記する場所はここね。
音を出したい位置情報の、 [” と ”] の間に UUID の情報をペーストしてください。
スクリプトを保存して編集画面を閉じれば完成です。
最後に、自分でオリジナルのサウンドを用意できない!てな方は、フリーを漁るとフルパーミッションのサウンドありますよん。 FREEBIE DUNGEON とかじっくり探せば結構見つかります。 ここは昔よくいりびたってましたw
■ 注意点など:
さてここで注意点を3つほど。
まず、横にスライドする引き戸などではなく回転するドアなどは、そのプリムの作り方に工夫が必要です。
普通にプリムでドアを作るとこうなりますね。

これはダメなドアです。
何故ダメなのかというと、普通の箱プリムそのままの場合は回転軸がド真ん中に来てしまいます。 このまま回転ドアとして使用すると、実際に動かした場合に、ドアの根元(チョウツガイの所)がふわふわ浮いたような挙動になってしまいます。
ではどういうドアがいいかといいますと。

こんなふうに、回転軸が端っこ(ドアのチョウツガイの所)に来ているドアがベストです。
じゃあどうすりゃいいんだYO!
てなことですが。
こうすりゃいいんです。

編集画面の 「パスカット(始点と終点)」 に、 0.375 と 0.875 を入れてください。
これだけです。
こうすることで回転軸が端っこにきたドアを作ることができます。
※ スカルプのドアも同じことが言えます。 回転軸が端っこに来ていないスカルプのドアは、回転ドアには不向きです。 スカルプの回転軸はインワールドでは変更できないので、その場合はスカルプがいじれるお友達に相談しましょうw
そして2つめの注意点。
上の参考動画を見てもらえばわかるように、ドアをクリックするとぬるっと動いています。 が、例えば別 SIM から TP してきて初めてドアをクリックする場合などは、ぬるっと動かずにいきなりガッっと動きます。 一度動かしてしまえば、2度目以降はぬるっと動きます。 これはリンデンの仕様です。
これを回避するためには、スクリプト側で最初にちょっぴり動かしていきなりガッっと動かないように細工する必要があります。 スクリプト的には何ら特殊な技術を使っているわけではないのですが、まぁ言ってしまえばメンドクサイということで、今回の「汎用性を持たせたフリースクリプト」には仕込んでおりません。 その辺はあしからず。
注意点最後として、
これは REZ 用オブジェクト向けの可動スクリプトです。 装着用ではまた少し変わってきます。
まあ単純なことなのですが、装着してしまうとルートプリムの角度を取得するのがメンドクサイので(結局それか)、今回のスクリプトには仕込んでいません。 あしからずん。
ということで、
第1回目のドアなどの可動スクリプト特集いかがでしたでしょうか。
実は対象を回転ドアに限定すればスクリプトももっと簡単になります。
第2回目は、普通に開く回転ドアや、ゆっくりぬる~~~っと開く回転ドアのスクリプトとか。 今回はしょった装着系のものもいいかな。 まぁ中身は至極簡単なものなので、そんなもったいぶるものでもないですがw
他にも、何かしら動かすスクリプトで皆でシェアしたい!ていう要望ありましたら、コメント欄に是非どうぞ。 コメント欄にね。 IMでいきなり「スクリプト作ってくれ」て言われても困ってしまいますがな。はっはっは。
第2回、まぁ、気が向いたらそのうち。はっはっは。