【Unity】オブジェクトの移動、回転、拡大縮小 その1

3D空間でのオブジェクトの動かし方

表題にすでに書いてありますが、3D空間上で3Dモデルを動かすときは、3つの動きを組み合わせて表現します。その方法は、移動、回転、拡大縮小です。それぞれ3Dを扱うときは移動はTranslate、回転はRotate、拡大縮小はScaleという言葉が使われます。ちなみにUnityエディタ上ではTranslateがWキー、RotateがEキー、ScaleがRキーでそれぞれ操作出来ます。これはだいたいの3Dソフトウェアで共通な操作です。

これらの操作はすべてX,Y,Z軸に対して値を変更することで表現しますが、その時にワールド座標に対して行うのか、ローカル座標に対して行うのかによって結果が異なるものになります。

ワールド座標とは、オブジェクトの親子関係などにかかわらず、オブジェクトを設置している3D空間上の原点に対してオブジェクトを変化させます。

ローカル座標とは、逆にオブジェクトの親オブジェクトに対して動作し、親オブジェクトを原点としてオブジェクトを変化させます。

この2つの違いは、移動だけだとあまり実感は湧きにくいですが、回転が絡むと全く違う結果になるので、自分がどのように動かしたいのかを意識して考える必要があります。

 

オブジェクトを移動させる

オブジェクトを移動させるためには、Translateメソッドを使用して、指定したベクトルの分現在の位置から移動させるか、positionプロパティやlocalPositionプロパティを直接変化させて移動させることが出来ます。このとき変化する時間は画面が更新されたときのみですので、アニメーションさせたい場合は連続で移動させる必要があります。positionプロパティはワールド座標、localPositionプロパティはローカル座標での値です。

 

オブジェクトをアニメーションで移動させる場合、どのようなアニメーションによって移動させるかを考えなければなりません。

アニメーションの種類としては等速度で移動するか、加速度をもたせるかの2つが基本的にはあると思います。等速度で移動させる場合、更新フレームごとに同じ値を座標に対して追加し続ければ移動させることが出来ます。加速度をもたせる場合は、更新フレームごとに値を追加し続けるのは同じですが、追加する値自体を増加させることで加速アニメーションを作成することが出来ます。

 

オブジェクトを回転させる

3D上でオブジェクトを回転させる場合、アフィン変換をする方法と、オイラー角で変換する方法と、クォータニオンで変換する方法があります。しかし、今はどのソフトでも回転させる場合はクォータニオンを使用しています。これらについては説明するととても長くなってしまうのですが、前2つを使用しようとした場合、移動と回転を行う順番によって結果が変わってしまい、回転と移動を切り離して考えることが出来ないということが問題になります。クォータニオンでは回転のみを考えることができるため、基本的にはこの方法が使われます。

 

ちなみにUnity上ではどうかというと、スクリプトではオイラー角での変換もクォータニオンの変換のどちらでも指定することが出来ます。オイラー角で指定する場合はeulerAnglesメソッド、クォータニオンで指定する場合はRotateメソッドがよく使われます。Rotateメソッドはオイラー角で指定することも可能です。

オイラー角で指定するほうが直感的にわかりやすいのですが、オイラー角の特性上意図した回転が行われないことがあります。

 

オブジェクトの大きさを変更する

オブジェクトの大きさを変更する場合は、localScaleプロパティを変更します。軸の方向それぞれに対し、どれくらいのサイズにするかを指定することでサイズを変更することが出来ます。例えば、横にオブジェクトを伸ばしたい場合は、X軸に対して数値を変更します。

この場合、X軸方向に4倍スケーリングされて表示されます。

 

終わりに

今回はUnityで動かすというよりは3Dでの概念的な動作を多く書きました。実際に使って行くとなった時は、これらのメソッドなどは使うこともありますが、簡単な移動であればアセットを使うことで簡単に作ることが出来ます。なので、次回はそのアセットを使って移動や回転などのアニメーションについて書いていこうと思います。

 

 

 

では、また。

 

●この記事を書いた人