2008年11月17日月曜日

位置と回転を理解したい その1

Computer Graphics やゲームの制作に携わってこられた方にとっては当たり前のことだと思うのですが、なかなかそのエリアとの関連が薄かった人(私含め、、)にとっては、LSL でオブジェクトの位置と回転を理解するのに相当の時間がかかるのではないかと思います。

ネット上に情報はたくさんあるのですが、とにかく専門用語がいっぱいで、記事を読めばまた知らない単語が出て、その繰り返しでなかなか学習が進まないんですよね。

反面、ネットの情報では平面上に3次元に見える絵を書いて苦労しながら説明しているのを見ると、Second Life ってこういうことを理解するには安上がりでお手軽な手段じゃないかな、と思います。高価なソフトを購入しなくてもよいですし、前提の知識が他の環境に比べて比較的に少ないのも敷居を低くしてくれているように思います。(それでも苦労したのですが、、、)

ダンス スクリプトしか興味のない私がなぜ位置と回転なのか、、、実は通称「ネジ」と呼んでいる、Sit することでダンサーのポジション(位置)を決めるためのオブジェクトを作ったときに思いっきりはまっちゃったわけです。

そこでちょっとその時に学習したことを備忘録的にまとめてみよう、と急に思い立ちました。(笑

llSetPos を使った位置の指定

位置を指定する関数としては llSetPos があります。また、LSL を使わなくても、プリムの [編集] で位置の X, Y, Z の値を変えたりしてると思います。
0
llSetPos はこの X, Y, Z の数値をスクリプトから変更する関数になります。そのため X, Y, Z の3つの数値を扱うために LSL ではベクター型 (vector, ベクトル) という 3 つの数値をひとまとめにした入れ物が用意されています。

vector nowPos;

nowPos というベクター型の入れものを宣言すると上記のようになります。
X, Y, Z にはその SIM の絶対位置が使われます。<0.0, 0.0, 0.0> という位置は SIM の地図上の左下の高度 0 mになります。
1
現在の位置を取得する関数は llGetPos です。タッチしたら現在の位置から 1m 上に上がるといった動きをするスクリプトは以下のようになります。

default{
      state_entry(){
          llSay(0,"Hello Avatar!");
      }
      touch(integer num_detected){
          vector nowPos = llGetPos();
          llSetPos(nowPos+<0.0,0.0,1.0>); // X, Y は変えず Z だけ現在の位置から 1m 上に設定
      }
}

touch イベントの中で現在の位置を取得して、1m 上の位置を指定していますから、タッチするたびに 1m ずつ上にあがっていきます。
現在の位置を state_entry や on_rez の中でとってしまうと、一回目のタッチでは 1m 上にあがりますが、動いた後の位置をとらないので次からはオブジェクトが動かないスクリプトになってしまいます。
ここで X, Y, Z という方向が「絶対位置」として、この3軸が必ず「直交」していることに注意します。
地図上では X 軸は東西、Y軸は南北、Z軸は上下(天地)です。
「今の位置から西に1m, 南に2m, 上に1m移動します」
こういう指示ならば llSetPos(llGetPos()+<-1.0, -2.0, 1.0>) という位置指定でいいのですが、おおよそ移動したい位置を指定するときは
「前に1m, 左に2m, 上方に1m」
こういうことを考えますよね。
そうすると「前ってどっち?」となります。もしかしたら、今向いているのは東北北東の方向で X, Y, Z といった軸に重なっていないかもしれません。
そこで出てくるのが「回転」の考え方になります。
つづく・・・

0 件のコメント:

コメントを投稿