ソラマメブログ

2009年04月24日

HUDとアタッチオブジェクトの移動 (スクリプト)

こんばんは^^なつです。

今日は、ちょっと変な(自分が理解出来てないだけ><)スクリプトのお話です。

ふと、思った事がありまして・・・
えっと、
たとえば、当店の懐中時計を購入して頂いて、装着したら埋まってしまって、
位置調整しようとしても、タッチできないから、編集できない!
って方がいるのではないか?

またまた、編集画面なんて、出したことない!
っていう方がいるかもしれない?

とか、思ったりします。

それで、HUDから、位置調整までできたら、便利かも?

早速実験です^^
簡易版の実験用HUDです

HUDとアタッチオブジェクトの移動 (スクリプト)
白い文字は、SSに画像加工して付けたしてます。
それぞれのボタンプリムのプリム名です。

ボタンプリムは、すべて子プリムでスクリプトは入ってません。
それぞれオブジェクト名を付けてるだけです。

木のテクスチャの球が親プリムです。

HUD親プリムのスクリプト

default
{

touch_start(integer total_number)
{
string prim_name = llGetLinkName(llDetectedLinkNumber(0));
llRegionSay(723,prim_name);
}
}

たったこれだけ^^

タッチされた時に、タッチされたプリム名を拾って、
それを723チャンネルで喋るだけです^^

で、動かされる実験用オブジェクト

HUDとアタッチオブジェクトの移動 (スクリプト)

白いお団子に、赤青緑のくしがささったようなオブジェクトです(埋まってもどこにいるか?わかりやすくするためです)

白いお団子が親プリムです。

移動オブジェクト 親プリムスクリプト

integer LHandle;
integer CHANNEL = 723;
float mm = 0.1;
vector mypos;

pospos(){
llSetPos(llGetLocalPos() + mypos);
}



default
{
state_entry()
{
LHandle = llListen(CHANNEL, "", "NULL_KEY", "");
}

listen(integer channel, string name, key id, string message)
{
if(message == "xp"){
mypos = <mm, 0, 0>;
}
else if(message == "xm"){
mypos = <-mm, 0, 0>;
}
else if(message == "yp"){
mypos = <0, mm, 0>;
}
else if(message == "ym"){
mypos = <0, -mm, 0>;
}
else if(message == "zp"){
mypos = <0, 0, mm>;
}
else if(message == "zm"){
mypos = <0, 0, -mm>;
}
else{
mypos = <0, 0, 0>;
}
pospos();


}
}

後の拡張を考えて、すこしややこしい書き方してますけど、

integer LHandle; 
integer CHANNEL = 723; これは、任意でOKなんですけど、HUDで723チャンネルを指定してるのであわせてます。
float mm = 0.1;       これは、1回のクリックで移動する距離です(実験では移動が目視しやすくするために0.1を指定
vector mypos;        これは、ここで宣言しなくていいんですけど、変更時にいじりやすくするためにここで宣言

state_entry()
{
LHandle = llListen(CHANNEL, "", "NULL_KEY", "");
}

これは、もうHUDからの命令を聞く準備ですね。
この状態では、723チャンネルの発言をすべて聞きます。
実際に使用する場合は、誰の発言(オーナーとか)とかのフィルタが必要ですけど、
あくまでも、実験なので^^

listen(integer channel, string name, key id, string message)
{
if(message == "xp"){
mypos = ;
}
else if(message == "xm"){
mypos = <-mm, 0, 0>;
}
else if(message == "yp"){
mypos = <0, mm, 0>;
}
else if(message == "ym"){
mypos = <0, -mm, 0>;
}
else if(message == "zp"){
mypos = <0, 0, mm>;
}
else if(message == "zm"){
mypos = <0, 0, -mm>;
}
else{
mypos = <0, 0, 0>;
}

pospos();


何か聞こえてきた場合の処理です。
もう、見てのとおりですけど
たとえば、 zm と聞こえたら、mypos に0,0.mm(0,0,0.1 ですね)を代入します。

で、最後にpospos();を呼び出してますけど、

pospos(){
llSetPos(llGetLocalPos() + mypos);
}

ここは、現在の位置を所得して、それに増加量(mypos)を追加して、
新しい位置に移動させてます。

そんなに、複雑な事はしてないですね^^


で、ここから重要?

この串刺しおだんごオブジェクトをrezした状態では、
HUDからの制御で思ったような結果が得られました^^

しかしです。

この串刺しお団子オブジェクトを装着したら、へんなことになります。

HUDのボタンを押しても、無反応・・・・

オブジェクトを右クリックして、黄色に光った状態にすると、
思い出したように移動・・・・

なんかへん・・・・・
スクリプトをいろいろ書き換えたりしたけど、結果は変わらず・・・・

実験2↓
HUDとアタッチオブジェクトの移動 (スクリプト)

別に親プリムを作って、
白い球、赤くし、青くし、緑くしをそれぞれ子プリムとして、
先ほどのスクリプトをすべての子プリムに入れたら、
若干移動時に、ばらつきはありますけど、動きました。

あ、あくまでも実験なので、同一のスクリプトで実験しましたが、
これは、それぞれに、重たいスクリプトと言われてるlistenを使ってますので、
実際に使われるときは、
listenは、親プリムだけで、親から子にリンクメッセージで送信したほうがいいです(念のために^^)

ここからは、想像なんですけど~

アタッチされてるオブジェクトの親プリムって
スクリプトからは移動出来ないような制限とがあるのかな~
と思います。

もしかして、アタッチ位置(箇所じゃなくて)指定のスクリプトがあるのかな~
とかも、思って、自分で探せるだけ探してみたけど、
見つかりませんでした><

とりあえず、実験2の方法でやってみようと思いますけど、
平行して、親プリムごと移動の方法も模索してみま~す。

いい方法があったら、教えてくださいませ^^

では、今日はこのへんで^^
おやすみなさい~




同じカテゴリー(商品開発秘話(スクリプト、プリムなど))の記事画像
普通のプリム?スカルププリム?の続き
普通のプリム?スカルププリム?
心が折れた・・・><
作業進行状況
色変更スクリプト(RGB微調整)
もうすぐ発売
 普通のプリム?スカルププリム?の続き (2009-12-09 15:58)
 普通のプリム?スカルププリム? (2009-12-07 20:44)
 心が折れた・・・>< (2009-10-28 15:48)
 作業進行状況 (2009-09-21 21:59)
 色変更スクリプト(RGB微調整) (2009-09-11 03:11)
 もうすぐ発売 (2009-09-07 00:51)
この記事へのコメント
llSetPosは移動量がすくないと、表示に反映されません。オブジェクトにタッチすると、反映されるけど。
http://shirousagi.slmame.com/c5152.html
私は、わずかな距離を移動するときは
vector apos = llGetLocalPos( );
vector asize = llGetScale();
vector tmp = asize;
tmp.x = asize.x + 0.05;
llSetScale( tmp);

apos.x = apos.x + adj;
llSetPos( apos);
llSetScale( asize);、
こんな感じでやってます。
Posted by りな at 2009年04月28日 04:40
りなさん、ありがとうございます(#^.^#)
そうですね!思い出しました^^
小さい距離は、数値入力でもちゃんと移動して見えなくて、
困った事ありました^^

試しに1m移動で実験してみたんですけど、
私の場合は、どうしても親プリムごとの移動では、思うような結果が得られないので、
親プリム固定で、子プリムだけの移動になってます^^

表現がおかしいかもですけど、
体に装備すると、装備した物の親プリムと体が1つの親プリムになってる?
ような気がします(勝手な解釈です)
体と親プリムが一体してるから、親プリムだけ動かせないのかな?

教えてもらったコードで実験してみます^^
ありがとうございました。
Posted by DCCXXIII(natu) at 2009年04月28日 22:37
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。