2007年07月23日
マンタの円運動(1)
1.リンクした親プリムをllTargetOmegaで回転させる方法。
円の中心点に回転する親プリムを置き、マンタを子プリムとしてリンクさせる方法。
回転体を作る場合、もっとも簡単でかつ美しく回転する方法と言える。(効率も良いらしい)
2.マンタ本体をllSetPos()やllSetRot()を使って、単独で自由に動き回る方法。
元々はこの方式をメインに考えていました。
ただllSetPosは直線移動になっています。単独で円周上を動かすには、三角関数の知識が必要
です。それに単に位置を移動させるだけでは無く、常に円周上の接線に正面が向くように補正し
続けないといけません。けっこう面倒です。
もう一つ問題が・・・llSetPosでは移動スピードが指定できません。従って円周上を移動するため
の方向調整とスピードをコントロールする為にTimerイベントと連動させる必要があります。
3.物理オブジェクトにしてllMoveToTarget()等で動かす方法。
物理オブジェクトはまだ勉強中で詳細は試していませんが、llMoveToTarget()の場合は、
移動先と移動速度がパラメータで指定できます。llSetPosよりは優れていると思います。
ただ、物理の場合特殊な制御が色々と必要なようです。可能であれば使わない方向で検討中
です。
今回はまず1のllTargetOmegaの使用に関して補足しておきます。
llTargetOmega(vector axis, float spinrate, float gain)
vector axis:<X軸方向,Y軸方向,Z軸方向>の形式で、回転する方向を指定できる。
<1.0,0.0,0.0>ならX軸方向に時計と逆周りで回転する。(-1.0なら時計周り)
float spinrate:回転速度の指定で、値はラジアン/秒を示すそうだ。つまり1秒間にどれだけの
角度を回転させるかを指定する事になる。
gain:回転の強さを示す値です。物理オブジェクトの場合は、この値が関係して来るようですが、
今回は0以外なら問題ないです。
llTargetOmegaを利用した場合、実にマンタは綺麗に旋回運動をします。非常に滑らかで一定のスピードで回遊します。
そしてスクリプトも実に簡単です。
親プリムに入れるスクリプトは
default {
state_entry(){
llTargetOmega<0.0, 0.0, 1.0>,0.1, 1.0);
}
}
こんな感じで良いのです。
実際にはタッチ・スタート、エンドやプリム間でのメッセージリンク等の制御も必要ですが、実にシンプルなスクリプトです。
問題は・・・
(1)リンクプリムの性格上、子プリムは親プリムからの距離に制約がある。
(2)単純な円運動しかできない(親プリムの回転速度や方向等での変化は可能)
実は、マンタは単純な円運動だけでは無く、もう少し複雑な動きをさせたいと思っていました。
また、将来商品化した場合、旋回運動する距離等もある程度ユーザが設定できるような仕組みにしたいと思っていました。その意味ではけっこうな制約事項になってしまうと思っています。
そこで最初は2の方式を中心にしていたのですが・・・これも実際には難しいと思います。
何故なら動きがカクカクしてしまい、llTargetOmegaのように美しく旋回しないのです。
詳しい話は次回でさせてもらいますが、ここで悩んでいる状態です。