こんにちは、開発の杉原です。
いろいろなタスクを抱え込み、個人的にちょっと余裕がなくなってしまっていますこの頃。
先週は一泊二日の出張で会社にいなかったこともあり、ブログが更新できませんでした。
そういうこともあって、今回は2週分……って、そんな余裕はないですね、残念。
というか、依然忙しいので、予定を変更して簡単に書けそうな「回転するBox」についての報告をお送りします。
前回書きましたように、新卒の方々には3種類のモデルを作成してもらいました。
その中から今回ご紹介するのは、順番は前後しますが3つ目の回転するBoxとなります。
イメージをお伝えしたいのですが、静止画では伝わらないので割愛いたしますが、単純な白いBoxが自身のY軸を中心にクルクルと回転する、というものです。
まずはチームAのものをご紹介します。
function Box1_OnReset( sender : Demo3D.Visuals.BoxVisual ) { sender.WorldLocation = new Vector3 (0, 0.5 , 0); sender.WorldRotationDegrees = new Vector3 (0, 0, 0); } function Box1_OnInitialize( sender : Demo3D.Visuals.BoxVisual ) { sender.Rotate(Axis.Y, 360, 360); }
// JScriptによる演習のため省略
このチームは後述するほかのチームと違って、OnResetイベントで初期角度を設定しているところがポイントでしょうか。
要件としては「回転する」ということだけを伝えていたので、私としてはそこまで要求はしていなかったのですが、現実的には初期状態を設定することは必要なので、とてもいい考えだと思っています。
回転にはRotateメソッドを使い、速度と加速度を指定しています。
実行してみると、結構軽快にクルクルと回ります。
次はチームBです。
function Box1_OnReset( sender : Demo3D.Visuals.BoxVisual ) { } function Box1_OnInitialize( sender : Demo3D.Visuals.BoxVisual ) { sender.Rotate(Axis.Y,45); }
// JScriptによる演習のため省略
ここは最もシンプルですね。
特に初期化もせず、Rotateメソッドには速度だけ渡して回転させています。
チームAよりも速度は小さいので、比較的ゆっくり目に回転します。
最後はチームC。
function Box1_OnReset( sender : Demo3D.Visuals.BoxVisual ) { } function Box1_OnInitialize( sender : Demo3D.Visuals.BoxVisual ) { var speed = new SpeedProfile(300,10,0.1); sender.Rotate(sender,Axis.Y,speed); }
// JScriptによる演習のため省略
こちらは速度の指定にSpeedProfileを使用しています。
最高速度は300と早いはずなんですが、実行してみるとかなり鈍重な動きです。減速度が影響しているのでしょうか?
以上のように、三者三様な結果となったかには見えますが、どのチームにも共通している点として「Rotateメソッドを使用している」ことが挙げられます。
実を言いますと、私はRotateメソッドの存在を知らずにこの課題を考えました。(ちなみに15分での思い付きです)
動作に必要なDemo3D独自のメソッドはScripting APIを見て調べるようにという、新卒の子には割とスパルタな指示をしていたのですが、どのチームもこのメソッドを見つけ出して実装したということなんでしょう。(もしかするとほかのチームからアドバイスをもらったのかもしれませんが)
今年の新卒、なかなかやりますよ!
ただ、ちょっと残念だったのは、3チームともRotateメソッドを使ったという点でしょうか。
私としては3チームそれぞれ違った回答を出して、いろんなプロセスがあるということを知ってほしかったな、という思いがありました。
なので、1チームくらいは別な方法で回転させてくれたらなぁと思いました。
ちなみに、Rotateメソッドを知らなかった私はというと、以下のようなスクリプトでサンプルモデルを作成しました。
function Box1_OnReset( sender : Demo3D.Visuals.BoxVisual ) { } function Box1_OnInitialize( sender : Demo3D.Visuals.BoxVisual ) { do{ while(true) { var deg = sender.WorldRotationDegrees.Y; sender.TurnTo(Demo3D.Common.Axis.Y, deg + 40, 160); sender.WaitForAnimator(); wait(0.01); } } }
// JScriptによる演習のため省略
回転にはTurnToメソッドを利用し、40度回転する処理を無限ループで実行しています。
TurnToとRotateの違いは、TurnToが指定した角度になるまで回転させるのに対し、Rotateは指定した速度で回り続けるという点です。
今回の要件としてはRotateが行うような動きになるので、通常実装するのであれば新卒の皆さんがやったようなRotateによる回転となります。
一方TurnToは、回転し続けるのではなくて進行方向を変えるときのように、単純に向きを変えるだけの場合に使われるものとなります。
ちなみに、新卒以外にも他部署からの異動などによって新しく入ったメンバーもこの研修に参加していて、その中の1人は私と同じよう無限ループを非同期に行い、その中でWorldRotationを少しずつ変更させる方法で回転を行っていました。力技ですね。
こんな感じで、なんだかんだで全体でみれば三様な手法が出てきたので、私の思っていたいろんな手法の紹介はできてよかったです。
以上が課題3の結果報告となります。
次回の新卒研修報告こそは「ワークの加工装置」をお送りできればと思っています。
また、更新も7/5(木)にはやりたいですが、もしかすると翌週、7/12(木)になるかもしれません。
すみませんが、気長にお待ちいただければと思います。
コメントをお書きください