Adsense

2008年1月4日金曜日

HUD の場合に必要な・・・向きの指定

年始早々に YazPod 2007 の不具合を発見して、「あ~、なるほど~」と反省。

これまで「玉」しか作ってなかったから(笑)、Rotation ってあまり意識してなかったんですよね。。。

HUD にすると必ずオブジェクトを Rez した時の東側西側の面が正面を向かって表示されます。オブジェクトを編集している間に回転させても、rez した時の rotation は記憶されたままです。言い換えれば、オブジェクトの Primitive Parameter の rotation が <0,0,0> で画面に装着されることになるんですね。

0

これでも・・・編集で回転すればいいのだけど、それはちょっと面倒ですね。
立方体であれば東側西側を正面として HUD オブジェクトを作成すればいいですが、他の形を使用すると必ずしもそうはいきませんよね。
そこでこの状況を回避するために attach イベント時にこの Rotation の値を変更することで、見せたい面を HUD の正面とすることが可能なんですね。つまりは、HUD  の場合には必ずいれるべきスクリプト、、、なのでしょう。 今頃、、、気がつきました。(笑
</X,Y,Z>

HUD 状態で YazPod を編集モードにして Rotation の値を変えて、本来見せたい向きにしてみます。これがその状態です。
1
すると、Y軸 で 90度、Z軸でも 90度 回転させたことがわかります。
この状態を Script で装着時に設定してあげればいいわけですよね。
そこで使ったのが関数としては llSetPrimitiveParams で、イベントは attach です。

attach(key id) {
    if (id != NULL_KEY) {
       vector d =<0,90,90>; //Degree(度) で値を設定
       d *= DEG_TO_RAD; //DEG_TO_RAD を使って、度をラジアンに変更
       rotation q = llEuler2Rot(d); //変数 d を Rotation 型の変数 q に変換・代入
       llSetPrimitiveParams([PRIM_ROTATION,q]); //q の値を ROTATION に設定
    }
}

装着というイベント(attach) で動くスクリプトが attach(key id) { } で囲まれています。
装着された時は key 型の変数 id に装着した Avatar の KEY が入ります。逆に、装着解除(要は、はずす、、)した場合は、変数 id には NULL_KEY が入ります。つまり、attach イベントは装着するときもはずすときもイベントとして発生します。
なので、装着した時だけ・・・なので if (id != NULL_KEY) という条件式をいれてあげました。
装着した時だけの if (id != NULL_KEY) { } では、llSetPrimitiveParams を使って パラメータの Rotation の値を設定しています。

ここで注意は、編集モードのオブジェクトタブの Rotation でみた数値は「度」であるのに対して、値はラジアンを使うんですよね。
このあたりはたしか Miz さんの Makapu ブログや多くの方がすでに説明されているので割愛しますが、、、はまりポイントでもあるので注意ししなくてはいけませんね~。
Degree(度) を Radian(ラジアン) に変換してRotaion(ローテーション) 型に変更して ROTATION に設定、、、となります。

と、、、単純な HUD の装着だけでもいろいろな考慮点があるんですね~。
勉強になりました。