BlackSheep-LSL@Wiki 椅子を作ろう
※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。


build


今回は椅子を作ってみましょう。
第一回でも触れましたが、buildで椅子を作っただけでは、正しく座ることができません。
椅子はやっぱり座れたほうが心休まりますので、座れる椅子を作ることにします。

スクリプトで椅子を作り出すことも不可能ではありませんが、いきなりでは難しいので、buildツールを使って椅子の形を作ってください。
椅子の形についてはどんなものでもかまいません。
ソファであろうが、スツールであろうが、buildの練習のために好みの形の椅子を自作してみるのが良いかもしれません。
「スクリプトだけ勉強したいんだ!」
という方は、とりあえず円柱なり立方体なりで間に合わせてもOKです。
もちろん、以前に椅子を作ったことがあって、
「ちゃんと座れるようにしたいのになぁ・・・」
という方は、ぜひその椅子に今回のスクリプトを組み込んでみてください。


私はこんなのを作ってみました。

座るための仕組み


椅子スクリプトの構成は、実にシンプルです。
やりたいことは「正しい位置に座れるようにする」ことです。

つまり、今まで説明してきたスクリプトの構成要素のうち、「反応」に当たる部分が、
「正しい位置に座れるようにする」
ということになります。

これを実現するためのスクリプトの命令を調べて見ましょう。
2007年4月現在、最も充実しているスクリプトの辞典は「lsl Wiki(英語)」です。
英語はどうも我が心の流儀に合わぬのだ・・・という方のために、当サイトにも一応「リファレンス」があります。
簡単な日本語の説明付きで、lslで使える関数(命令)の一覧を掲載しています。

まあ、ここ見ている方はほとんど日本人だと思いますので、当サイトの「リファレンス」のページで今回の目的にかなうスクリプト命令を探してみることにしましょう。
かなり下のほうまで見ないと出てきませんが、
「座る位置の調整」
をする命令が見つかるでしょうか。
llSitTarget?という名前の命令です。
今回はこのllSitTarget?を「反応」として使います。

次にステート(状態)についても考えます。
単に「正しい位置に座れるようにする」だけですので、ステートは一つだけで良いでしょう。
「初期状態」であるdefaultステートを使います。

最後はイベント(きっかけ)ですが、素直に考えると、
「座ったとき」
というきっかけにしたいところです。

ところが、残念ながらlslには「座ったとき」のイベントそのものはありません。
「オブジェクトが変化したとき」のイベントを使って、誰かが座っているかどうかの判定をすることができますが、今回は別のイベントを使います。

実は今回使うllSitTarget?という命令は、一度実行しておけば、あとは何度座っても、誰が座っても、同じ位置、同じ角度に座るようになる命令です。
座るたびに実行するものではありません。
一度実行しておけば良いのですから、ここは素直に、
「スクリプトが開始されたとき」
に実行すべきでしょう。

これでスクリプトの構成については決まりました。
「初期状態」で「スクリプトが開始されたとき」に「正しい位置に座れるようにする」スクリプトです。

これを意識しながら、実際にコードを書いていきましょう。

sitスクリプト


まずは椅子の中にスクリプトを作ります。
前回書いたように、コンテンツタブで「New Script」です。
ハロー・アバター・スクリプトが作成されますが、使えるところは残し、いらないところを消していくとしましょう。

まずはステートですが、すでにdefaultステートが書いてあるはずです。
これをそのまま利用しましょう。

イベントについても「開始されたとき」に発動するstate_entry()があります。
これも残しておきます。

state_entry?()の中にあるllSay()や、touch_start?()イベントなどは不要な部分です。
まずはこれらを消してしまいましょう。

こんなふうになります。


default
{
  state_entry()
  {

  }
}

すでにステートとイベントについては完璧ですw
あとは「正しい位置に座れるようにする」命令を書き込むだけです。

llSitTarget?を使うときは、「位置」と「角度」を指定します。

 llSitTarget(<0.0,0.0,0.5>, <0.0,0.0,0.0,1.0>);

<>で囲まれた数字が何やら二つありますが、最初の<>が位置、二番目の<>が角度です。
ここに指定する数字は、皆さんが作った椅子によってそれぞれ異なります。
ひとまず数字の意味を説明しておきましょう。

位置を示す<0.0,0.0,0.5>は、vector(ベクタ)型と言われるデータです。
,で区切られた3つの数字が並んでいます。
最初の数字はX値、真ん中はY値、最後はZ値です。
XYZと聞くと、buildツールに出てくる赤と緑と青の矢印を思い出す方もいるでしょう。
まさにアレです。
今回使うこのvector型のデータは、椅子の座標から、XYZ方向にどれだけズレた位置に座るか、を意味します。
単位はmです。

<0.0,0.0,0.0,1.0>は回転を示すrotatin(ローテーション)型のデータです。
数字が増えて4つになっています。
最初の三つはvector型と一緒で、X,Y,Zですが、最後の一つはSという隠れキャラです(謎
サンバルカンに白バラ仮面がついているようなものです・・・いや、よくわかんないんですが(^^;

少々専門的になりますが、この4つの数の組み合わせは「四元数(クォータニオン)」と言い、3D座標系において回転の計算をする上で非常に便利な行列です。
SLでは内部的に回転のデータは全てこの四元数で管理されています。
ですが、4つの数字を見て、どのような回転をするのかパッとイメージできる人は多くはないでしょう。
buildツールのように、XYZのそれぞれの角度を度数で指定するほうがやはり馴染みがあります。

そのあたりは当然考慮されており、X,Y,Zの回転角度からrotation型のデータを作り出すための命令が用意されています。
llEuler2Rotという関数がそれで、この関数に<X,Y,Z>の回転角度を指定すると、<X,Y,Z,S>のrotation型に変換してくれます。
私は3D回転のエキスパートではないので素直にこのllEuler2Rotを使うことにします。

しかし難点がもう一つあります。
llEuler2Rotに指定する<X,Y,Z>は度数ではなく、ラジアンなのです。
ラジアンは高校の数学で出てくるのでなんとなくわかる人もいるかもしれませんが、やはり度数のほうがわかりやすいでしょう。
そこでもう一つ小細工をします。

度数で<X,Y,Z>を指定し、そこにDEG_TO_RADという呪文をかけると、なんと、ラジアンに変わるのです。

以上2つの小細工をすることによって、
 度数>ラジアン>四元数
の変換ができます。

具体的にはこんなふうに書きます。
 llEuler2Rot(<0.0, 0.0, 90.0> * DEG_TO_RAD)
lslで角度を扱うときにはこの方法が便利ですので、この書き方は覚えてしまったほうが早いです。

さて、これでようやく位置と回転の設定ができます。
llSitTarget?に位置と回転を指定して、スクリプトに追加しましょう。


default
{
  state_entry()
  {
    llSitTarget(<0.0, -0.3, 0.4>, 
      llEuler2Rot(<0.0, 0.0, 270.0> * DEG_TO_RAD));
  }
}

この例では、Y軸のマイナス方向(後ろ)に30cm、Z軸の+方向(上方向)に40cmずれた位置で、Z軸まわりに270度回転した格好で座るようになります。
皆さんの作った椅子ではこの数字はそれぞれ違ってくると思いますので、書き換えて試してみて下さい。

正しい位置に座らなかった場合は、スクリプトの数字を調整し、保存してから座りなおします。
座ったままですと位置は変わりませんので注意しましょう。


きちんと座れるようになったら、椅子のスクリプトは見事完成です。
うまくできたら、家の中に置くのも良いですし、商品にさえなるでしょう。
ぜひ素敵な椅子を作ってみて下さい。

次回は「ドア」のスクリプトを作ってみたいと思います。

名前:
コメント: