2008年12月19日

特定の位置・角度にオブジェクトをRezさせるには

以前に「特定の位置・角度にオブジェクトをRezさせるには」という質問を投稿した者です。
すみません、スパム書き込みが多かったため、前記事を削除させて頂きました。
ですが、せっかくご返答頂いた内容を消すのは回答下さった方にも申し訳ないですし、また、今後同様の疑問にぶつかった方のためにも記事・回答を残したいと思います。

コメントの許可を改めて制限を設け、再投稿させて頂きます。


~~~~~質問記事(2008/12/2投稿)投稿者:まるまる~~~~~~
こんにちは。
スクリプトを使ってオブジェクトをRezする時の角度指定で悩んでおります。

A・・・BをRezするオブジェクト(本体)
B・・・Rezされるオブジェクト(Aのコンテンツ内に存在)

このような二つのオブジェクトがあり、機能の中の一部として、llRezObjectを利用してBをrezさせようと考えています。
今まではllGetPosなどで位置を事前に記憶させておいてRezしていたのですが、今回Aが移動したり角度が変わったりする可能性があり、Rezする際は相対位置・角度でBを出現させたいのです。

-----現在試してみた方法です-----
A・Bを正しい相対位置に配置してから、それぞれllGetPos、llGetRotで位置と角度を取得。
取得したposの差とrotの除を求めて、llRezObjectを実行する際の計算に使用。
--------------------
↑このように計算した値を、乗算したり除算したり、色々と試してみたのですが、どのような計算をしても、最初に並べていたような形にrezされませんでした。

このようにRezしたいオブジェクトの相対位置を簡単に取得・計算する方法、そして思った通りの角度でRezする方法はありますでしょうか?
または、回転の計算やllRezObjectなどについて詳しく載っているホームページなどがありましたら、教えて頂けますでしょうか。(LSL関連のwikiは全て読みました。wiki英語版は翻訳できる限りは目を通したので、他にご存知のサイトがありましたら・・・)



同じカテゴリー(スクリプト関連)の記事画像
オブジェクトのリンクとタッチで開く扉
自動チャットを止めたい
テレポートするとアニメーションが解除される
同じカテゴリー(スクリプト関連)の記事
 テクスチェンジのHUDについて (2015-07-01 04:51)
 モール用のプリムカウンターを探しています (2014-11-29 20:09)
 連続するアニメーションの処理 (2014-08-24 03:23)
 オブジェクトの上にフローティングテキストを出す。 (2014-08-22 16:46)
 チャットログの盗聴について (2014-02-03 03:43)
 椅子に座った後で位置調整できるスクリプト (2013-03-24 16:37)

Posted by まるまる  at 18:17 │Comments(2)スクリプト関連

この記事へのコメント
頂いたレスを再投稿させて頂きます。
本当にご助力頂りがとうございました!

~~~~~レス記事(2008/12/2投稿)投稿者:Suemi Jun様~~~~~~
どういうものが作りたいのかわからないので例文だけ。

//A側スクリプト
vector pos = llGetPos(); //A位置取得
rotation rot = llGetRot(); //A角度取得
vector up = llRot2Up(rot); //rotよりZ軸+方向の位置差分取得
pos += up; //posに差分を加算
//↓BをRez(位置以外のパラメータ指定無し)
llRezObject("B",pos,ZERO_VECTOR,ZERO_ROTATION,FALSE);

関数をllRot2FwdとllRot2Leftにすることで、それぞれX軸、Y軸の+方向への位置差分を取得できます。


~~~~~レス記事(2008/12/3投稿)投稿者:まるまる~~~~~~
Suemi様、アドバイスありがとうございます。
llRot2Fwd関係の関数は知ってはいたのですが、いままで使い方をイメージできずにいました。
もう一度llRot2Upなどについても詳しく調べてみようと思います。

今回したかったことは、


(A)
  (B)→

このような位置関係に配置したいと決めていた場合に、

  (A)→

Aが回転して配置が変わっていたら、
Aをタッチして、

  (A)→
(B)


Aの中に入れておいたBを、当初決めていた通りの相対位置・角度にRezしたい・・・というものでした。

教えていただいたことを参考に、頑張ってみようと思います。
アドバイスありがとうございました!


~~~~~レス記事(2008/12/3投稿)投稿者:Tako★MASARU様~~~~~~
AとBのオフセット値(相対値)にAの回転角を掛けてやるだけで実現出来ると思いますよ。

例えば相対位置をOFFSET、
Bの相対角をROT
とした場合


vector OFFSET = <0.5,0.5,0.5>;
vector ROT = <0,0,90>;

A_POS = llGetPos();
A_ROT = llGetRot();

REZ_POS = A_POS + OFFSET * A_ROT;
REZ_ROT = llEuler2Rot(ROT*DEG_TO_RAD) * A_ROT;

llRezObject("B",REZ_POS,ZERO_VECTOR,REZ_ROT,0);


★A_ROTは必ず最後に掛けてください。

たぶんこんな感じでいけると思います。


手前味噌になりますが、まるまるさんが作ろうとしてるのはこういうのですよね。
http://takolabo.slmame.com/c22330.html


~~~~~レス記事(2008/12/4投稿)投稿者:まるまる~~~~~~
Tako★MASARU様ありがとうございます。
なるほど、回転角を乗算すれば良いのですね!

さっそく試してみましたところ、OFFSETに入る相対位置がうまく計算できていないのか、位置はうまく反映されませんでしたが、角度はなんとか思った通りになりました。

はい、サンプル表示ではないのですが、ちょうど機能はTako★MASARU様が仰ったようなものを求めていました。
Rezする本体Aが動き回るため、その都度Rezする相対位置・角度を算出する必要がありまして・・・。

あとは試行錯誤しながら、頑張って完成までもっていきたいと思います。
アドバイスありがとうございました!


~~~~~レス記事(2008/12/4投稿)投稿者:Atami様~~~~~~
ご質問に合ってるかよく判らないですが、
うーんと、AのllGetRotでRezすると向きは同じになりますが、
BはAのオブジェクト重心?に対応してRezされるので、
Aが重心を変えずに向きを変えるとBは同じ位置で向きだけ変えるということが起こります。
カメレオンの鼻先に餌のハエをRezしようとして、ものぐさなカメレオンが向きだけ変えるとハエは元の位置にRezされてしまうということですね。
つまり、ハエのRez位置はカメレオンのお腹に対応して決めるのでなく、頭の位置に対応しないといけない。
私も似たようなことやったんですが、頭をrootにしてllGetRootPositionしても重心が返ってきてしまうので、仕方なく尻尾に自己申告させて、重心と尻尾の差分の調整値を重心に足すということをやりました。
Posted by まるまるまるまる at 2008年12月19日 18:19
Atami様、アドバイスありがとうございました。お返事が遅くなり失礼致しました。

今まで頂いたアドバイスを参考に、なんとか自分のやりたかったことを再現できそうです。

自分の制作物でも同じようなことが起きていたので、どうして重心から回転がうまく計算できないのかと、ずっと悩んでいたので、重心についてのお話、とても参考になりました。
ありがとうございました!
Posted by まるまるまるまる at 2008年12月19日 18:28
※会員のみコメントを受け付けております、ログインが必要です。
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。