えーと書くのいつぶりだろ、、、まあいいやw
生存証明っぽくちょっとしたtipsみたいなものを気まぐれで書いておくことにします。
たぶんあちこちで解説されてることなんだと思いますが、案外よく聞かれたり。
内容もカンタンで誰でもできます。サクっと覚えちゃいましょう。
[なんの話?]
乗物なり椅子なりソファーなり・・・Sitできるものを作った時、こんな経験ありませんか?
・自分の望む向きに座ってくれない><
・ケツが椅子に埋もれてるよorz
・ソコじゃないの、ソコじゃないのよ(謎)
困りますよね。アームレストに座っちゃったり、椅子の向きに微妙に合わなかったり。
[どうすればいいの?]
これは、ちょっとしたLSLを書くことでサクっと調整できちゃいます。
llSitTarget()という関数を使うことで、1つのプリムに対して1箇所1方向、Sitする位置を固定することができます。
[具体的には?]
llSitTarget()という関数に座標と回転を与えます。
座標には、そのプリムの中心点から、縦(X)、横(Y)、高さ(Z)方向にどれだけ移動した位置にSitさせるか?を指定します。vectorという型で指定します。
回転には、そのプリムの回転位置を基準に、どれだけ座る場所を回転させるか?を指定します。指定はrotationという4元数型で与えるのですが、これは非常にイメージしにくいものなので、それを補うために
llEuler2Rot()という関数を使います。llEuler2Rot()を使うと、Editモードの回転のように、X、Y、Z型での回転パラメータが与えられます。
まとめると、
llSitTarget(<縦(X)位置, 横(Y)位置, 高さ(Z)位置>, llEuler2Rot(<X方向角度, Y方向角度, Z方向角度>*DEG_TO_RAD));
こんな感じです。
DEG_TO_RADというのはおまじないみたいなものだと思ってください。ただの単位変換(DegreeからRadian)のための係数です。
たとえば、「座る位置を、プリムの中心から横(Y方向)に+20cm, Z方向に90度回転させた位置に固定したい」という場合は、
llSitTarget(<0, 0.2, 0>, llEuler2Rot(<0, 0, 90>*DEG_TO_RAD));
という具合ですし、
「プリム中心から、1m上、向きは変えずに座らせたい」という場合は、
llSitTarget(<0, 0, 1.0>, ZERO_ROTATION);
と書くことができます。
ZERO_ROTATIONTとは、回転する必要が無い場合に使います。
さて、椅子なんかの場合、座る位置は常に固定させることになると思います。
そうすると、llSitTarget()という関数を発動するのは、とにかくスクリプトが動いた時、で良いだろうと思われます。
ということで、スクリプト全体としては、以下のようなものになります。
「プリム中心から1m上」の例で書きます。
//--------------------------------------------------
default{
state_entry(){
llSitTarget(<0, 0, 1.0>, ZERO_ROTATION);
}
}
//--------------------------------------------------
簡単デスネ!!
[おわりに]
たとえば横長ベンチを作り、その座面を1プリムで仕上げたい場合とか、複数人の座る位置を固定したい!なんて思ったりするかと思います。
llSitTarget()を使った場合、1つのプリムに対して指定できる位置は1箇所だけです。なので、ちょっと不便です。
で、これに対する対応策として最も安易な方法は、透明なダミープリムを設置することです。
この方法は最もお手軽に解決できるのですが、単に座る位置を調整するためだけにプリムを1つ消費することにもなり、もったいない感じもします。
プリムを消費しないでこの問題を解決する方法もあります。ただ、ちょっと複雑な作業が入ります。
そのカラクリと設定方法については、いつか気が向いたらまた説明しようと思います(笑)