2009年07月04日
回転看板のアレ
先日、友人から妙な事を相談された。
llTargetOmega、いわゆる、回転する看板に使われる、プリムをグルグル回すアレだ。
こいつは物理でも使えるが、普通は非物理プリムを回し続けるのに使われる。
非物理の場合、最も負荷の少ないプリム移動スクリプトである。
コイツの回転はサーバー側ではなくクライアント側で制御されているため、「PC上で回っているように見える」だけなんだ。
何百個あろうが、SIM負荷はほとんど無い。
安心して使ってくれ(見る方はラグがあるかも知れんがなw)。
でだ、何が相談なのかと言うと、回転しているプリムの角度を変えると、回転方向がおかしくなるらしい。
私はてっきりローカル回転をしているのだと勘違いしていたのだが、これはワールド回転をしているのだった。
つまり、横に回っているものを横倒しにすると、縦に回ってしまう。

輪を縦にすると・・・

おーまいがっと。
これはちょっと不便だ。
そこで、プリムの角度に縛られずに同じように回る方法を考えた。
その前に、llTargetOmegaをおさらい。
---------------------
llTargetOmega(vector axis, float spinrate, float gain)
---------------------
vector axis は回転させる軸を単位ベクトルで指定する。
<1,0,0>ならX軸、<0,1,0>ならY軸、<0,0,1>ならZ軸である。
普通は横回転が多いので、<0,0,1>を使うことが多い。
ワールド座標なので、プリムの初期角度に関係ないことに注意。
float spinrate は回転速度をラジアン/秒で指定する。
ラジアンは 2π で360度になるため、PI * 2 で1秒に1回転することになる。
看板で使うなら PI * 0.5 以下くらいがいいかも。
float gain は物理プリムでの強度であるようだが、普段は使わないしあまり使い道も無い。
1.0固定でキニシナイ。
ここで大事なのは、「単位ベクトル」ってやつ。
単位ベクトルは1を最大にするベクター表記なんだが、それ自体は特定の意味があるわけじゃないんだ。
言葉では解らないので、実際に見てみる。

これがXの単位ベクトル<1,0,0>だ。
座標では、X方向に1mの位置になる。

次にYの単位ベクトル<0,1,0>。
Y方向に1mの位置。
ここで問題。
「円を描くように、XとYの中間の単位ベクトルを出すと、数値と位置は?」

答えはこう。
絶対に単位ベクトルは1を超える事は無い。
反対方向ではマイナスになる。
初めに戻ろう。
ローカルでの回転軸を得ると、どう回しても同じように回転させるllTargetOmegaが作れる事になる。
指定が単位ベクトルなのだから、「現在の角度を単位ベクトル」にすればいいわけだ。
-------------------------------------
integer flag = FALSE;
default
{
state_entry()
{
llTargetOmega(ZERO_VECTOR, PI, 1);
}
touch_start(integer num)
{
if(llDetectedKey(0) == llGetOwner())
{
if(!(flag))
{
llTargetOmega(llRot2Fwd(llGetRot()), PI * 0.5, 1); //チューブ、トーラス、リング用
//llTargetOmega(llRot2Up(llGetRot()), PI * 0.5, 1); //キューブ、シリンダー用
flag = TRUE;
}
else if(flag)
{
llTargetOmega(ZERO_VECTOR, PI, 1);
flag = FALSE;
}
}
}
}
------------------------------------------------------
タッチすると回ったり止まったり、オーナーじゃないとタッチできないとか色々追加はあるが、重要なのはllTargetOmegaの第一引数の llRot2Up(llGetRot()) の部分。
現在の角度を元に、プリムのZ軸のローカルの単位ベクトルを出せという命令だ。
ちなみに、座標では現在のプリムのZ軸1m先という意味になる。
単位ベクトルは、使い道で意味が変わる良い例だな。
なお、プリムによって軸は違うので、llRot2Fwd になるか llRot2Up になるか気を付けること。
回転速度でベクターを変えている人がいると思うが、それはダメだ。
ここは回転軸を設定するものなので、速度を変えるのにいじってはいけないんだ。
従って、速度は PI * 0.5 の部分で変えること。
PI * 2 で1秒1回転なのだから、この場合は約4秒で1回転するわけだ、まぁそこまで正確ではないけど。
些細な例だが、スクリプトはこういう事の積み重ねで覚えるもの。
何事も経験があればデッカイものも作れるようになるさ。
llTargetOmega、いわゆる、回転する看板に使われる、プリムをグルグル回すアレだ。
こいつは物理でも使えるが、普通は非物理プリムを回し続けるのに使われる。
非物理の場合、最も負荷の少ないプリム移動スクリプトである。
コイツの回転はサーバー側ではなくクライアント側で制御されているため、「PC上で回っているように見える」だけなんだ。
何百個あろうが、SIM負荷はほとんど無い。
安心して使ってくれ(見る方はラグがあるかも知れんがなw)。
でだ、何が相談なのかと言うと、回転しているプリムの角度を変えると、回転方向がおかしくなるらしい。
私はてっきりローカル回転をしているのだと勘違いしていたのだが、これはワールド回転をしているのだった。
つまり、横に回っているものを横倒しにすると、縦に回ってしまう。

輪を縦にすると・・・

おーまいがっと。
これはちょっと不便だ。
そこで、プリムの角度に縛られずに同じように回る方法を考えた。
その前に、llTargetOmegaをおさらい。
---------------------
llTargetOmega(vector axis, float spinrate, float gain)
---------------------
vector axis は回転させる軸を単位ベクトルで指定する。
<1,0,0>ならX軸、<0,1,0>ならY軸、<0,0,1>ならZ軸である。
普通は横回転が多いので、<0,0,1>を使うことが多い。
ワールド座標なので、プリムの初期角度に関係ないことに注意。
float spinrate は回転速度をラジアン/秒で指定する。
ラジアンは 2π で360度になるため、PI * 2 で1秒に1回転することになる。
看板で使うなら PI * 0.5 以下くらいがいいかも。
float gain は物理プリムでの強度であるようだが、普段は使わないしあまり使い道も無い。
1.0固定でキニシナイ。
ここで大事なのは、「単位ベクトル」ってやつ。
単位ベクトルは1を最大にするベクター表記なんだが、それ自体は特定の意味があるわけじゃないんだ。
言葉では解らないので、実際に見てみる。

これがXの単位ベクトル<1,0,0>だ。
座標では、X方向に1mの位置になる。

次にYの単位ベクトル<0,1,0>。
Y方向に1mの位置。
ここで問題。
「円を描くように、XとYの中間の単位ベクトルを出すと、数値と位置は?」

答えはこう。
絶対に単位ベクトルは1を超える事は無い。
反対方向ではマイナスになる。
初めに戻ろう。
ローカルでの回転軸を得ると、どう回しても同じように回転させるllTargetOmegaが作れる事になる。
指定が単位ベクトルなのだから、「現在の角度を単位ベクトル」にすればいいわけだ。
-------------------------------------
integer flag = FALSE;
default
{
state_entry()
{
llTargetOmega(ZERO_VECTOR, PI, 1);
}
touch_start(integer num)
{
if(llDetectedKey(0) == llGetOwner())
{
if(!(flag))
{
llTargetOmega(llRot2Fwd(llGetRot()), PI * 0.5, 1); //チューブ、トーラス、リング用
//llTargetOmega(llRot2Up(llGetRot()), PI * 0.5, 1); //キューブ、シリンダー用
flag = TRUE;
}
else if(flag)
{
llTargetOmega(ZERO_VECTOR, PI, 1);
flag = FALSE;
}
}
}
}
------------------------------------------------------
タッチすると回ったり止まったり、オーナーじゃないとタッチできないとか色々追加はあるが、重要なのはllTargetOmegaの第一引数の llRot2Up(llGetRot()) の部分。
現在の角度を元に、プリムのZ軸のローカルの単位ベクトルを出せという命令だ。
ちなみに、座標では現在のプリムのZ軸1m先という意味になる。
単位ベクトルは、使い道で意味が変わる良い例だな。
なお、プリムによって軸は違うので、llRot2Fwd になるか llRot2Up になるか気を付けること。
回転速度でベクターを変えている人がいると思うが、それはダメだ。
ここは回転軸を設定するものなので、速度を変えるのにいじってはいけないんだ。
従って、速度は PI * 0.5 の部分で変えること。
PI * 2 で1秒1回転なのだから、この場合は約4秒で1回転するわけだ、まぁそこまで正確ではないけど。
些細な例だが、スクリプトはこういう事の積み重ねで覚えるもの。
何事も経験があればデッカイものも作れるようになるさ。
2009年07月04日
メインランド旅行10

さぁて行こうか。
忙しかったり調子悪かったり(SLが)、なかなか続きができない。
前回の終了地点から水路を渡った先に、道の先端があるから向かう。

こんな感じ。
なかなか整備はされているようだ。
やはりここもREZ許可されている。

さっそく分かれ道。
この大陸の道は網目のようになっているので、分かれ道が多い。
道を間違えたらどこに行くか解らない。

びっくりしてバイクを止めた。
木の上に日本屋敷が乗っている。。。
いわゆるツリーハウスなんだが、それを日本屋敷でやる発想は無かった。
建物自体の出来が良いので、なおさら違和感があるw

マクドナルドの看板かと思ってよく見たら違った。
それより向こうの巨大なドラゴンの骨格標本がすごい。

橋と別れ道。
ここは右折。

道は常に確認しないとなー。
ここで南。

横断歩道があった。
右手は空港(?)。
左手はモール。
何か、どっかで見た看板が。。。

結構、整備されたモールで、ちょっとした町のようになっている。
ただ何だろうなぁ、この原色バリバリ感。
この辺がイマイチ感覚が合わない。
商品もいかにも海外もので、深く見る気にならなかった。

モールの隅に、川の対岸のビルとをつなぐ跳ね橋があった。
のだが、残念ながら形だけで動かなかった。
残念。

モールかと思ったら、これはブティック店だった。
本格的なようなので、中に入って見ることに。


フォーマル、カジュアルの女性もののお店だな。
デザインと色彩は、やっぱり海外海外してる。
値段は150くらいから450くらいだったか。
モデルまで配置してる本格派ぽいのだが、気に入るものは無かった。
まぁ、物は試しで見てみてもいいのかな。
**AKERS Fine Clothing**

LMがもらえたので、今回はここまで。
この店はREZもできるし。







