ソラマメブログ

2007年11月08日

時計

まいど、十五屋の時計台のご利用ありがとうございます。
今日も、時を刻み続けております。

この十五屋の時計の針はスクリプトで動かしているのですが、
時計の針の動かし方についてご質問があったので時計台のスクリプトを公開いたします。
サンプルも無料でおいておきますので、是非十五屋にお越しくださいませ。


時計の針を動かすには、大きく2通りあるのじゃないかと思います。ひとつは、円形のプリムにテクスチャを貼ってテクスチャを回転させるもの(IBMのCODESTATIONというSIM に無料のサンプルがあります。)この方法だとプリムの位置は気にせずテクスチャの回転だけを意識すればよいので簡単だと思います。針の部分以外を透過にした、テクスチャを用意する必要があります。そもそも、テクスチャで時計の針を描きたい方は、迷わずこの方法を使うのがよいと思います。IBMの WallClockというサンプルを参考にしてみてください。

時計台の場合は、時計の針のプリム自体を回転させております。この方が針に厚みをもたせることが出来るので、個人的にはこちらの方法のほうが好きです。ただ考慮しないといけないことがいくつか出てきますので、ちょっと面倒かもしれません。おそらく時計の針の動作でうまくいかない方はこの2番目の方法を取っているのではないでしょうか?今回、公開するサンプルは、この2番目の方法になります。

軽く説明します。。。

オブジェクト自身を回転させるときは、llLocalRot()という関数を使うのですが、回転軸を考慮する必要があります。(オブジェクトを編集するときに表示される赤青緑の矢印の交差点がオブジェクトの中心点になります。)この中心点を軸にオブジェクトは回転します。つまり、針のオブジェクトをプリムで作るときにちょっと工夫が必要になります。時計の中心に軸がくるように偏ったオブジェクトを作ってやる必要があります。

時計

針さえできてしまえば、後はサンプルのスクリプトを針自身に埋め込むだけですので、時計を動かすこと自体は難しくないと思います。長針、短針、(必要であれば)秒針にそれぞれ同じスクリプトを適応します。※timer()の中身を時針、分針、秒針によって書き換えてください。スクリプトサンプル参照。

--------------------------------------------------
//GMTとの時差
float TIME_DIFF = 9.0;

set_pos_hours(){
float rotTime = ((llGetGMTclock() / 60 / 60) + TIME_DIFF) * 30;
llSetLocalRot(llEuler2Rot(-(<0, 0, rotTime * DEG_TO_RAD>)));
}

set_pos_minutes(){
float rotTime = (llGetGMTclock() / 60) * 6;
llSetLocalRot(llEuler2Rot(-(<0, 0, rotTime * DEG_TO_RAD>)));
}

set_pos_seconds(){
float rotTime = llGetGMTclock() * 6;
llSetLocalRot(llEuler2Rot(-(<0, 0, rotTime * DEG_TO_RAD>)));
}

default{
state_entry(){
set_pos_seconds();
llSetTimerEvent(1);
}

timer(){
//長針、短針、秒針に組み込むスクリプトによってここを
//変えてください。
set_pos_hours(); //← 短針に組み込む場合はこの行のみ有効にする
set_pos_minutes(); //← 長針
set_pos_seconds(); // ← 秒針
}
}
--------------------------------------------------

ところが、、、この後、僕はハマったのですが。。。

リンクの仕方にちょっとコツがあるのです。回転させる軸だけでなく回転させる方角に注意する必要があります。時計を作り終わってオブジェクトを「リンク」したとたん、ヘンテコな動きになることがあります。そんなときは以下の注意点をチェックしてみてください。

注意点1
リンクするとき、スクリプトを埋め込んだ針をルートプリムに「しない」。ルートプリムに適応したスクリプトはリンクしたオブジェクト全体にかかる特質があります。ので、時計の針をルートプリムにすると、針ではなく時計全体が回転し始めます。サンプルでは、動きのない時計の中心の丸ポチをルートプリムにしています。(リンクする直前に、一番最後に選択したプリムがルートプリムになるようです。Shiftキーを押しながらルートにしたいプリムを最後に選択しなおしましょう。)

時計

注意点2
ルートプリムの角度に注意する。時計の針をサンプルだとZ軸の方向に時計回りに回転させています。。。が、このZ軸というのは何に対してZ軸か?ってことに、注意してください。リンクした瞬間から、「ルートプリム」のZ 軸に対して針が回転し始めます。ですので、時計の針とルートプリムのZ軸が同じ方向を指していない場合、リンクしたとたん針は思わぬ方向に回転し始めます。サンプルでは、針の軸と、ルートプリムの軸の角度が同じになるようにしています。簡単なのは、回転(度)の部分を全て0にして作成するのがよいと思います。

時計

最後に十五屋の腕時計の宣伝です。
十五屋の腕時計も基本的には同じような、考え方で作られております。
腕時計の針を動かしてみたいという方は、是非上記の方法で試してみてください。

時計

ついでに、時計の針の回転をマスターしたら、次はLSLであえてデジタル時計なんかを作ってみてはどうでしょう?時刻によってデジタル番号の各パーツの色を変更するようなスクリプトを書いております。こんな感じ。。。デジタル時計。(店舗の外に展示してあります。)

時計

同じようなスクリプトをいろいろ工夫するとものづくりの幅が広がりますね。

以上、簡易講座でした。。。



同じカテゴリー(チュートリアル?)の記事画像
スカルプ備忘録
同じカテゴリー(チュートリアル?)の記事
 スカルプ備忘録 (2009-03-23 22:55)
 スカートが消える! (2008-05-16 01:43)

 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。