ソラマメブログ

2007年07月07日

llSetLinkPrimitiveParamsの謎

llSetLinkPrimitiveParamsだと、PRIM_POSITIONが機能しない現象が起こってます。
PRIM_POSITION以外は機能しているようです。llSetPrimitiveParamsでは、確かに機能し
していたので、これは便利と思っていたのですが・・・。
もっとっも、簡単なTEST文を載せてみました。何か問題があるのでしょうか?
ご存知の方がいらしゃったら是非お教えください。

-----------------------------------------------------------------------------------------
default
{ touch_start(integer total_number)
{
llSetLinkPrimitiveParams(LINK_ALL_OTHERS, [PRIM_POSITION, <148, 188, 30>]);
}
}
---------------------------------------------------------------------------------------

これを前提とした便利ツールを考えていて、かなりの部分ができた段階で
この問題に直面・・・一気にやる気が・・・。


同じカテゴリー(LSL)の記事
 リッスン (2007-06-25 23:05)
 パーミッション問題解決 (2007-06-15 08:30)
 パーミッション (2007-06-12 19:33)

Posted by T4476 at 14:18│Comments(8)LSL
この記事へのコメント
はじめまして。
llSetLinkPrimitiveParamsで動かすプリムはChildrenです。しかしPRIM_POSITIONの値がグローバルコーディネートの値が入れられているため、ルートプリムから<148,188,30>離れた場所へ移動させようとしています。リンクされた子プリムは大きさにもよりますがそれほど遠くへは動けず、動きがキャンセルされているのではないでしょうか?
Posted by Seagel at 2007年07月08日 11:35
補足訂正。
「ルートプリムから」というのは間違いですね。「どこからであれ絶対座標の<148,188,30>へ移動しようとしている」となります。
<148,188,30>の代わりに、llGetPos() + <動かしたいルートからの相対座標>とするべきでしょう。ベクトルもルートからの相対座標を取るためには、llGetPos() + <動かしたいルートからの相対座標>*llGetRot()になります。
Posted by Seagel at 2007年07月08日 11:44
Seagelさまアドバイスありがとうございます。
親primeから、10m以内にしか移動できなそうだという事は、
なんとなく知ってはおりましたが、ご指摘のとうり(?)

default
{
touch_start(integer total_number)
{
llSetLinkPrimitiveParams(LINK_ALL_OTHERS, [PRIM_POSITION, llGetPos()]);
}
}

とやってもだめでした。
LINKナンバーが親だと作動しますが子だと作動しません。
子への座標指定の問題なのか、リンクナンバーの指定の仕方の問題なのか
・・・・・
Posted by at 2007年07月08日 19:01
いや、llGetPos()だけだと「その場所」ですから動きませんよ。llGetPos() + <5.0, 5.0, 5.0>とか(10m以内の座標)にしないと。
Posted by Seagel at 2007年07月09日 01:16
あ、あと訂正の方が間違っていたかも。最初のはルートからその相対座標に動こうとしています。
あと、リスト中ではllGetPos()が有効ではないでしょう。
default
{
touch_start(integer total_number)
{
vector pos = llGetPos();
llSetLinkPrimitiveParams(LINK_ALL_OTHERS, [PRIM_POSITION, pos + <5.0, 5.0, 5.0>]);
}
}
Posted by Seagel at 2007年07月09日 01:20
あー、さらに間違えた。10m以内というのはllSetPosの制限です。リンクした物はさらに短くなると思います。実験は<1.0, 1.0, 1.0>ぐらいでしてみてください。
Posted by Seagel at 2007年07月09日 01:24
ぎゃー、何度もすいません。わたしも勘違いしてました。
整理しますと、リンクされた子プリムに座標を与えると、ルートプリムからの座標になります。これはリンクできる距離までしか動けません。
いっぽう、llGetPosを使ってしまうと、絶対値が得られてしまうので、余計でした。
動かなかった理由は単にルートから<148,188,30>の距離は遠すぎた、というだけです。
llSetLinkPrimitiveParams(LINK_ALL_OTHERS, [PRIM_POSITION, <1, 1, 1>]);なら動くことを確認できると思います。
Posted by Seagel at 2007年07月09日 01:42
Seagel様、丁寧な解説ありがとうございます。やっと理解いたしました。
rootのローカル座標10m以下にしか反応しないんですね。
なるほど・・・・実は、OBJの整列toolを考えていたのですがどうやllSetLinkPrimitiveParamsでは使い勝手の面ではちと問題があるようです。なんいせよ、もやもやしていた物がとれて大変助かりました。
ありがとうございます。
Posted by t4476 at 2007年07月09日 09:20
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。