2007/10/10

水平楕円軌道フライスルーカメラの飛翔速度を可変にしたい  VRMスクリプト禅問答
こちらのコメント欄Caldia氏のリクエストにお応えします。
水平楕円軌道フライスルーカメラなんですが、これの回転速度を可変にしたいのです。
操作変数は外部にある0〜1のグローバル変数で、これに回転速度を乗算して操作したいな、と。
とりあえず、スクロールを組み込んでください。レイアウトスクリプトの最後の方に、以下に示す部分があるはずです。
<レイアウトスクリプト>
(前略)
  SetFlyCameraPos RoundPos CameraPos
  add Angle AngularRate
  SetEventAfter this MtdRound FlyTimer WizInterval
EndFunc
このスクロールは、けしからんことにまったくコメントが書かれていないというヒドい代物です。ゴルァッ、作者出て来いッ!!


まぁ、そういうお約束のボケはさておき、2行目の add Angle AngularRate が、三角関数の引数に使われる角度に飛翔速度を加算する部分になります。Caldia氏が言っているのは、この飛翔速度=AngularRateに0〜1の割合を乗じて、最小は0(つまり停止)、最大はAngularRateの初期値(つまり、スクリプトウィザードの質問から入力する書く速度)の間で変化させたい、という話です。

で、仮にCaldia氏の言う“グローバル変数”を VarHoge とします。これはグローバル変数ですから、レイアウトスクリプトの冒頭で、
<レイアウトスクリプト>
Var VarHoge
setf VarHoge 1.0
のように、変数宣言し、さらにsetf命令で初期値(上例は速度最大状態)を設定しておく必要があります。

んでもって、これを前述の AngularRate に乗じてやるワケですから、先の抜粋部を以下のように書き換えましょう。
<レイアウトスクリプト>
(前略)
  SetFlyCameraPos RoundPos CameraPos
  Var AngularRateTmp
  mov AngularRateTmp AngularRate
  mul AngularRateTmp VarHoge

  add Angle AngularRateTmp
  SetEventAfter this MtdRound FlyTimer WizInterval
EndFunc
書き加えたり変更した部分は太字で示しています。

上から順に解説しますと、まず、ローカル変数AngularRateTmpを宣言しています。メソッドの中ほどに変数宣言が出てくるのが気持ち悪いと思う人は、上ロジックを含むメソッドMtdRoundの冒頭で宣言してください。

次にmov命令で、AngularRateTmpにAngularRateの値を代入しています。これは、飛翔速度の基準値であるAngularRateを以下の計算で失わないための措置です。

で、これにmul命令でVarHogeを乗じます。この時点でAngularRateTmpには、AngularRateの値がVarHogeが示す割合に変化したものが収まることになります。たとえば、VarHogeがこの時点で0.5であれば、AngularRateTmpはAngularRateの半分になり、これは飛翔速度が半分に(ゆっくりに)なることを意味します。

最後に、オリジナルのコードではAngularRateを加算していたadd命令の末尾をAngularRateTmpに変更します。これで、従来はAngularRateだけ加算されていたものが、AngularRateにVarHogeを乗じた分だけ加算されるように変わったことになりますね。しかも、AngularRateの値自体は変化していませんから、続くSetEventAfter命令によって次回同じロジックが実行されたときも、同じ処理がおこなわれることが保障されます。

あとは、適当にキーイベントその他を使ってVarHogeを増やしたり減らしたりするメソッドを実行できるようにしてやればOK。これは敢えて例を示さないので各自で考えてみてください。

*     *     *

毎度の如く、手元にVRM環境がない状態で記事を書いていますので、上掲コードは未検証です。多分大丈夫だとは思いますが、うまく動かなかったらごめんね、と言うことで。何か不具合があったらコメント欄にレポートよろしくです。
0

コメントを書く

この記事にはコメントを投稿できません




teacup.ブログ “AutoPage”
AutoPage最新お知らせ