ソラマメブログ

2008年06月16日

LSL:座ったアバターを回転させる

ぱるちゃんから、「座ったアバターを回転する方法」を聞かれて、
試してみました。



座ってるアバターは、オブジェクトにリンクされている状態なので、
llSetLinkPrimitiveParamsという関数でコントロールする


というのがポイントなんですけど、回転っていうのが、よくわかってなくて、
試行錯誤してしまいました^^;

回転の詳しい説明のページは、こちらです。
(1)wikiのRotationのページ
(2)BlackSheep-LSL@Wiki 回転について

どちらも丁寧に書いてくれているのですが、いまだに回転はよくわかりません^^;
手取り足取り教えてくれる先生募集中です^^(←本気)

とりあえず、タッチでグローバルのZ軸まわりに45度ずつ回転させる
サンプルを公開してみます。
なお、回転軸は考慮されていませんので、お気をつけください。



//座っているアバターを回転させるサンプル
// Jun 16, 2008 by Jinko Spitteler

//コンフィグレーション
integer gDegStep = 45;
vector gvSitPos = <1.000000, 0.250000, -0.350000>;
vector gvSitRot = <0.000000, 90.000000, 90.000000>;

//グローバル変数
float fRot = 0.0;
rotation grSitRot;

default {
state_entry() {
grSitRot = llEuler2Rot(gvSitRot * DEG_TO_RAD);
llSitTarget(gvSitPos, grSitRot);
}
touch_start(integer total_number) {
integer i;
key av = llAvatarOnSitTarget();
integer no = 0;

//誰も座ってなければなにもしない
if (av == NULL_KEY) return;

//アバターのリンクナンバーを探す
for (i = 1; i <= llGetNumberOfPrims() && no == 0; i++)
if (llGetLinkKey(i) == av) no = i;

//回転させる
fRot = (float)(((integer)fRot + gDegStep) % 360);
rotation rot = llEuler2Rot(<0,0, fRot> * DEG_TO_RAD)
           * grSitRot / llGetRot();
llSetLinkPrimitiveParams(no, [PRIM_ROTATION, rot]);

}
}


llSitTargetって、前も書いたことあるけど、深いです^^;
(過去記事は→こちら


この記事へのトラックバックURL

http://jinko.slmame.com/t275167
この記事へのコメント
ひさー^^

おお、これ、いいねー。おれもためしてみよっと^^
Posted by ファルコンファルコン at 2008年06月19日 12:26
ファルコンさん^^

お久しぶりですー

うん、おかしいかもなんですけど・・・

是非、試してみてください

回転のひみつわかったら教えてくださいねー
Posted by jinkojinko at 2008年06月20日 01:20