2009年04月24日
HUDとアタッチオブジェクトの移動 (スクリプト)
こんばんは^^なつです。
今日は、ちょっと変な(自分が理解出来てないだけ><)スクリプトのお話です。
ふと、思った事がありまして・・・
えっと、
たとえば、当店の懐中時計を購入して頂いて、装着したら埋まってしまって、
位置調整しようとしても、タッチできないから、編集できない!
って方がいるのではないか?
またまた、編集画面なんて、出したことない!
っていう方がいるかもしれない?
とか、思ったりします。
それで、HUDから、位置調整までできたら、便利かも?
早速実験です^^
簡易版の実験用HUDです
↓

白い文字は、SSに画像加工して付けたしてます。
それぞれのボタンプリムのプリム名です。
ボタンプリムは、すべて子プリムでスクリプトは入ってません。
それぞれオブジェクト名を付けてるだけです。
木のテクスチャの球が親プリムです。
HUD親プリムのスクリプト
default
{
touch_start(integer total_number)
{
string prim_name = llGetLinkName(llDetectedLinkNumber(0));
llRegionSay(723,prim_name);
}
}
たったこれだけ^^
タッチされた時に、タッチされたプリム名を拾って、
それを723チャンネルで喋るだけです^^
で、動かされる実験用オブジェクト
↓

白いお団子に、赤青緑のくしがささったようなオブジェクトです(埋まってもどこにいるか?わかりやすくするためです)
白いお団子が親プリムです。
移動オブジェクト 親プリムスクリプト
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↓

別に親プリムを作って、
白い球、赤くし、青くし、緑くしをそれぞれ子プリムとして、
先ほどのスクリプトをすべての子プリムに入れたら、
若干移動時に、ばらつきはありますけど、動きました。
あ、あくまでも実験なので、同一のスクリプトで実験しましたが、
これは、それぞれに、重たいスクリプトと言われてるlistenを使ってますので、
実際に使われるときは、
listenは、親プリムだけで、親から子にリンクメッセージで送信したほうがいいです(念のために^^)
ここからは、想像なんですけど~
アタッチされてるオブジェクトの親プリムって
スクリプトからは移動出来ないような制限とがあるのかな~
と思います。
もしかして、アタッチ位置(箇所じゃなくて)指定のスクリプトがあるのかな~
とかも、思って、自分で探せるだけ探してみたけど、
見つかりませんでした><
とりあえず、実験2の方法でやってみようと思いますけど、
平行して、親プリムごと移動の方法も模索してみま~す。
いい方法があったら、教えてくださいませ^^
では、今日はこのへんで^^
おやすみなさい~
今日は、ちょっと変な(自分が理解出来てないだけ><)スクリプトのお話です。
ふと、思った事がありまして・・・
えっと、
たとえば、当店の懐中時計を購入して頂いて、装着したら埋まってしまって、
位置調整しようとしても、タッチできないから、編集できない!
って方がいるのではないか?
またまた、編集画面なんて、出したことない!
っていう方がいるかもしれない?
とか、思ったりします。
それで、HUDから、位置調整までできたら、便利かも?
早速実験です^^
簡易版の実験用HUDです
↓

白い文字は、SSに画像加工して付けたしてます。
それぞれのボタンプリムのプリム名です。
ボタンプリムは、すべて子プリムでスクリプトは入ってません。
それぞれオブジェクト名を付けてるだけです。
木のテクスチャの球が親プリムです。
HUD親プリムのスクリプト
default
{
touch_start(integer total_number)
{
string prim_name = llGetLinkName(llDetectedLinkNumber(0));
llRegionSay(723,prim_name);
}
}
たったこれだけ^^
タッチされた時に、タッチされたプリム名を拾って、
それを723チャンネルで喋るだけです^^
で、動かされる実験用オブジェクト
↓

白いお団子に、赤青緑のくしがささったようなオブジェクトです(埋まってもどこにいるか?わかりやすくするためです)
白いお団子が親プリムです。
移動オブジェクト 親プリムスクリプト
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↓

別に親プリムを作って、
白い球、赤くし、青くし、緑くしをそれぞれ子プリムとして、
先ほどのスクリプトをすべての子プリムに入れたら、
若干移動時に、ばらつきはありますけど、動きました。
あ、あくまでも実験なので、同一のスクリプトで実験しましたが、
これは、それぞれに、重たいスクリプトと言われてるlistenを使ってますので、
実際に使われるときは、
listenは、親プリムだけで、親から子にリンクメッセージで送信したほうがいいです(念のために^^)
ここからは、想像なんですけど~
アタッチされてるオブジェクトの親プリムって
スクリプトからは移動出来ないような制限とがあるのかな~
と思います。
もしかして、アタッチ位置(箇所じゃなくて)指定のスクリプトがあるのかな~
とかも、思って、自分で探せるだけ探してみたけど、
見つかりませんでした><
とりあえず、実験2の方法でやってみようと思いますけど、
平行して、親プリムごと移動の方法も模索してみま~す。
いい方法があったら、教えてくださいませ^^
では、今日はこのへんで^^
おやすみなさい~
Posted by natu(DCCXXIII) at 01:40│Comments(2)
│商品開発秘話(スクリプト、プリムなど)
この記事へのコメント
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);、
こんな感じでやってます。
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つの親プリムになってる?
ような気がします(勝手な解釈です)
体と親プリムが一体してるから、親プリムだけ動かせないのかな?
教えてもらったコードで実験してみます^^
ありがとうございました。
そうですね!思い出しました^^
小さい距離は、数値入力でもちゃんと移動して見えなくて、
困った事ありました^^
試しに1m移動で実験してみたんですけど、
私の場合は、どうしても親プリムごとの移動では、思うような結果が得られないので、
親プリム固定で、子プリムだけの移動になってます^^
表現がおかしいかもですけど、
体に装備すると、装備した物の親プリムと体が1つの親プリムになってる?
ような気がします(勝手な解釈です)
体と親プリムが一体してるから、親プリムだけ動かせないのかな?
教えてもらったコードで実験してみます^^
ありがとうございました。
Posted by DCCXXIII(natu) at 2009年04月28日 22:37