スクリプト:地形のスカルプを作る

えすつー

2011年02月03日 23:50


どもどもこんちゃ。


さて、先日ツイッターの方で
「地形をスカルプにするフリーは結構出回ってるよー」
と言ったにもかかわらず自分が探せなかったのでw


非常にシンプルではありますが、サンプルスクリプトを作って公開しておきます。 もっと便利に作り直して商品化しても別にかまいませんので、どぞご自由にご利用くださいませ。


■ 機能と用途:

指定された範囲でSIMの地形を読み込み、スカルプデータを出力します。
地形にフィットしたスカルプを地面に置きたい場合にご利用ください。


■ 前提条件:


■ SL以外に必要なもの:


スカルプデータを出力するという事ではプリムオーブンと似たようなモンですが、こちらはフリー公開なシロモノですので、手作業の部分が多少めんどくさいです。その辺はフリーもんとしてご了承くださいませ。





さてではさっそく。


■ 利用手順

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 色々応用はきくと思いますので、スクリプトが判る方はどんどん改造して使ってくださいませ。





応用編として、地形で好きな形を作ってそれをスカルプに変換する、って手もありますね。

こんなぽっこりしたスカルプも思いのまま。


お試しあれ。
lslスクリプト