ソラマメブログ

2008年01月17日

ミステリーサークル出現

Sapporoの土地のレンタル期限も、あと10日。
メインランドの土地は、土地の編集の限界があり(元々の地形から±4mまでしか編集できない)、地形編集のスクリプトが試せないので、こちらでモコモコと土地編集を実験しています。


(渦巻きぃ~~)




(ひしゃくをもっている理由は分かりません・・・)

//--------------------------------------
// land_leveller
// 2.0.0
// 2008/01/15
// created by sasapy Beck

// Define
    vector center_point = <228.0, 170.0, 20.1>; // 中心地点の座標
    float radius = 18.0; // 最大時の半径
    float radius_meter = 7.2; // 1周したときの半径の縮小
    float radius_step; // 1度ごとの半径の縮小
    vector modify_point; // 編集地点の座標
    integer theta; // 角度(度)
    float now_r; // 現在の半径

    integer size_number = 0; // llModifyLandの編集サイズ
    integer repeat = 10; // 土地編集回数

    integer i; // forループ用

// Function
// 指定位置へ移動する
    ssMovePosition(vector position)
    {
        vector now_position; // 現在位置
        vector move; // 移動する距離

        now_position = llGetPos(); // 現在位置取得
        move = position - now_position; // 指定位置と現在位置の差

        while(move != ZERO_VECTOR) // 移動距離が0になるまでループ
        {
            if(llVecMag(move) > 10.0) // 一回で移動できる距離が10m以内なので、10mを超えた場合
            {
                move = move / llVecMag(move) * 10); // 移動距離が10mとなるようにベクトルの長さで割って10倍する
            }

            now_position += move; // 現在位置に移動距離を足す
            llSetPos(now_position); // 移動する
            move = position - now_position; // 移動距離の取得
        }
    }

// Main
    default
    {

// Touch Event
// タッチしたら土地編集を開始
        touch_start(integer num_detected)
        {
            radius_step = radius_meter / 360; // 1周で縮小する半径の値から1度ごとの縮小する値を算出
            theta = 0; // 角度
            now_r = radius - theta * radius_step; // 現在の半径を算出

            while(now_r > 1.0) // 現在の半径が1m以上の時に処理する
            {
                modify_point = center_point + 
                        <llCos(theta * DEG_TO_RAD) * now_r, 
                        llSin(theta * DEG_TO_RAD) * now_r, 
                        0.0>; // 編集位置を算出

                ssMovePosition(modify_point); // 編集位置に移動
                while(llGround(ZERO_VECTOR) < modify_point.z) // プリムの中心位置まで土地を上下させる
                {
                    llModifyLand(LAND_LEVEL, size_number);
                }
                for(i = 0; i < repeat; i++) // 編集サイズ内の高さが揃うようにしつこく編集する
                {
                    llModifyLand(LAND_LEVEL, size_number);
                }

                theta++; // 角度の更新
                now_r = radius - theta * radius_step; // 現在の半径を算出
            }
        }
    }
//--------------------------------------
(前提として編集する土地は、設定する高さより低くなっていることが条件となります)

まずユーザー関数のssMovePosition(vector position)ですが、llSetPosで移動できる距離は10mまでです。指定の位置が10m以上離れている場合は、何度かに分けて移動しなければならないため、ユーザー関数を作り、指定の位置まで移動します。
指定位置(position)と現在位置(now_position)から移動距離(move)をもとめ、移動距離が0になるまでwhileループします。移動距離の長さを求め(llVecMag)が10mを超えている場合は小さくします。
小さくする方法ですが、移動距離を長さで割って10倍します。分かりにくいですが、移動距離ベクトルのXYZをそのベクトルの長さで割れば、割った後のベクトルの長さは1になります。10mにしたいので10倍しているわけです。
この部分は、モノを動かすときに使える部分です。

次に中心位置から半径rの円で、円周部分を計算する部分ですが、ちょっと理系の話になりますが、スクリプトでは
modify_point = center_point +
<llCos(theta * DEG_TO_RAD) * now_r,
llSin(theta * DEG_TO_RAD) * now_r,
0.0>;
の部分です。



(ちょっとグラフがいびつですが)

図の左側の円内の単位ベクトル(長さが1のベクトル)青線が中心を基準にグルグル回る場合のXとYの取る値は、右グラフのようになります(三角関数のSINとCOSの波形となるわけです)。
その単位ベクトルの角度を1度づつ増やしていき、そのときのXとYを求めて、その点をつなぐと円が書けるわけです(正確には正360角形)。
具体的にはXはllCos(角度)で単位ベクトルを求め半径(now_r)をかけています。Yも同様にllSinで求めています。求めたXとYを中心位置(center_point)に加えた座標が、編集する位置になるわけです。
今回は「渦巻き」にしたかったので、半径を徐々に減らしていっています。
ちなみに角度(変数theta)ですが、1周分の角度(360度)を超えても気にせずインクリメントしています。グラフを見てもらえば分かるように、360度を越えても取りうる値は360度以内のときと同じになりますので、いちいち360度を超えたかという判断はしていません。
この部分は、ある位置から指定の角度で位置を計算するときに使える部分です。

最後に土地編集をするllModifyLandですが、パラメータとしてLAND_LEVELを指定します。これはこのスクリプトが入っているプリムの中心位置まで土地を上下させるパラメータです。ほかに隆起、低地、慣らす等のパラメータもありますので、LSL wikiなどで調べてください。
スクリプト的には
while(llGround(ZERO_VECTOR) < modify_point.z)
として現在位置の地面の高さが指定の高さより低い間繰り返します。ですが、編集範囲(今回は2m×2mの範囲)の全てがきれいに同じ高さに揃わないので、しつこくrepeat回数分繰り返してます。

すでに低地になっていることを前提としていますが、これはプリムを編集位置に移動したときに、指定の高さが地中になっていると、XとYは指定位置に移動しますが地面の表面の高さになってしまいます。
実はこのスクリプトとは別に土地編集スクリプトを作ってあるのですが、そちらでは、移動したときに高さを取得し、指定位置より高かったらまず低地にしてから移動しなおすようにしています。

まぁ、あいかわらず役に立たないスクリプトなのですが、部分部分で流用できると思います。

ちなみにこのミステリーサークルは、sasapy's studio, Sapporo (228/170/21)【SLURL】です。


この記事へのトラックバックURL

http://sasapy.slmame.com/t116536
この記事へのコメント
おぉぉ色々やっちょるね!!!
覗きにいかなきゃ!
Posted by jesmin yifujesmin yifu at 2008年01月23日 18:27
じゃすさん、こんにちは。

Sapporoの土地もレンタル期限が切れたので、元の地形に戻されるのも時間の問題かも・・・。
昨日はまだそのまま残ってたけどねぇ。

本格復帰をお待ちしてます。
Posted by ささぴささぴ at 2008年01月29日 08:51