Site search
2008年7月16日水曜日
普通にドアのスクリプト
今回は開き戸のスクリプトです。角度だけ操作できればいいので引き戸より簡単なんですが、最初rotation型変数の概念がさっぱりわかりませんでしたw あ、いや今もよくはわかってないんですが^^;
オブジェクトを編集するとき角度は3つの値、X、Y、Zのベクトルで扱いますが、スクリプトではrotation型変数のクォータニオン(四元数)っていう4つの値で処理しないといけないんですよ。だから角度はラジアンに変換して、クォータニオンに変換して。。。うわぁあああwという過程が入るのでその分ややこしいんですよねwww
オブジェクトは中心の座標を軸に回転するのでパスカットして作ってください。サイズ<0.100, 4.000, 3.000>みたいにXをドアの厚みにしたときパス・カットは始点0.375終点0.875ですね^^
// 開き戸
rotation closed;
rotation open;
default
{
state_entry()
{
closed=llGetRot(); // 閉じたときのクォータニオン
open=closed*llEuler2Rot(<0,0,-90>*DEG_TO_RAD); // 開いたときのクォータニオン
}
touch_start(integer total_number)
{
if (llGetRot() == closed) { // 閉じてたら
llSetRot(open); // 開く
llSetTimerEvent(10); // タイマーセット10秒
}
else { // そうでないときは
llSetTimerEvent(0); // タイマーをクリアして
llSetRot(closed); // 閉じる
}
}
timer()
{
llSetTimerEvent(0); // タイマークリア
llSetRot(closed); // 閉じる
}
}
ドアをタッチで-90度の方向に開きます。もう一度タッチか10秒で閉まります。
設定はスクリプトをリセットでドアの角度が記憶されます。
オブジェクトを編集するとき角度は3つの値、X、Y、Zのベクトルで扱いますが、スクリプトではrotation型変数のクォータニオン(四元数)っていう4つの値で処理しないといけないんですよ。だから角度はラジアンに変換して、クォータニオンに変換して。。。うわぁあああwという過程が入るのでその分ややこしいんですよねwww
オブジェクトは中心の座標を軸に回転するのでパスカットして作ってください。サイズ<0.100, 4.000, 3.000>みたいにXをドアの厚みにしたときパス・カットは始点0.375終点0.875ですね^^
// 開き戸
rotation closed;
rotation open;
default
{
state_entry()
{
closed=llGetRot(); // 閉じたときのクォータニオン
open=closed*llEuler2Rot(<0,0,-90>*DEG_TO_RAD); // 開いたときのクォータニオン
}
touch_start(integer total_number)
{
if (llGetRot() == closed) { // 閉じてたら
llSetRot(open); // 開く
llSetTimerEvent(10); // タイマーセット10秒
}
else { // そうでないときは
llSetTimerEvent(0); // タイマーをクリアして
llSetRot(closed); // 閉じる
}
}
timer()
{
llSetTimerEvent(0); // タイマークリア
llSetRot(closed); // 閉じる
}
}
ドアをタッチで-90度の方向に開きます。もう一度タッチか10秒で閉まります。
設定はスクリプトをリセットでドアの角度が記憶されます。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿