UnityでXYZ軸での回転ってどういうこと!?

Unityでゲームオブジェクトを回転させたい時はよくありますが、そんな時に軸を使って回転させたいといった事もあります。

Unityの軸と言うのが横軸のX軸、縦軸のY軸、奥行きのZ軸になります。

Y軸で回転と言うけど、どういうことだっけ?

とたまにわからなくなるので、軸の回転について見ていきたいと思います。

スポンサーリンク

どういう回転をするかわからなくなった時の確認法

たまにY軸で回転と言った時パッと思い浮かばなくなる事があります。

Y軸の横に回転するのか?縦の回転するのか?何が何だか・・・・(‘_’)

で、わたくしの場合はいつも↓のような図を思い浮かべて、「ああ、こっちに回転か」と理解しています。

軸での回転がわからなくなった時に思い浮かべる絵

Unityでの軸を思い浮かべて、矢印の先から矢印が出ている根元((0, 0, 0)の座標)の方向(上の図の茶色い矢印方向)を見ていると仮定します。

X軸の回転であればX軸の矢印の先から(0, 0, 0)の方向を見ている状態での時計回りが正の回転になります。

他の軸でも同様になります。

こうすれば何軸でどっちに回転するかがわかります。

左手の親指(X軸)、人差し指(Y軸)、中指(Z軸)と見立てて指先から見て時計回り方向がその軸での正の回転の方向と覚えるとわかりやすいかも?

わたくし(他の人はどうなんだろ?)はどのように回転するか?というのが時々わからなくなるので、こういった感じで再認識しております。

回転のサンプルで理解を深める

軸の回転について分かったところで、Transform.RotateメソッドとTransform.RotateAroundを使ってサンプルを作り、さらに理解を深めてみましょう。

Transform.Rotateメソッドを使う

transformのRotateメソッドを使用するとVector3で与えた軸の回転をする事が出来ます。

またそのゲームオブジェクトのローカル軸(Space.Self)で回転させるのか?ワールド軸(Space.World)で回転させるかも指定が出来ます。

↑のようなスクリプトがゲームオブジェクトに設定されていると、Updateメソッドが呼び出される度にローカルのX軸で10度ずつ正の方向に回転します。

Rotateメソッドが実行されるとゲームオブジェクトが回転するので、Updateが呼び出される度に回転します。

X軸を10度にする、というわけではなく値が書き変わっていきます(10→20→30)。

ワールド軸とローカル軸についてはUnityのエディター上で表示切り替えが出来るので、ボタンを押して切り替えるとわかりやすいです。

ワールド軸とローカル軸について

↑のようにEthanを手動で回転させた後、LocalとGlobalボタンを押して切り替えます。

Rotateメソッドの第4引数で指定しているのがこのローカルかワールドかの指定になります。

ではEthanを回転させるサンプルを作成してみます。

今回のサンプルは1つの軸で回転することとし、列挙型でその軸を選択出来るようにします。

またローカル回転なのかワールド回転なのかも指定出来るようにしています。

ローカル回転とワールド回転の違いがわかるように、空のゲームオブジェクトを2つ作成し、名前をYAxisLocal、YAxisWorldと変更します。

その子要素にスタンダードアセットのEthanのモデルを配置し、RotateXYZスクリプトを取り付けます。

階層としては

回転サンプルの階層

↑のようになり、名前も変更してあります。

ローカル軸のゲームオブジェクトは

ローカル軸で回転

↑のように設定し、

ワールド軸のゲームオブジェクトは

ワールド軸で回転

↑のように設定しました。

それぞれのEthanモデルはローカル軸とワールド軸のY軸を使って回転させる設定にしています。

それでは実行してみましょう。

ローカル軸とワールド軸の回転の検証

ローカル軸で回転させる場合はRotationのYの値しか変わりませんが、ワールド軸で回転させる場合は他のRotationの値も変わっています。

このサンプルでは一つの軸で回転させてわかりやすくしてますが、当然X、Y、Z全ての値を変える事も出来ます。

Transform.RotateAround

TransformのRotateAroundメソッドを使用すると、ワールド座標の点を中心とした軸で回転をさせる事が出来ます。

点を軸に回転

例えば↑のように赤い点を指定し、向こう側から手前側の軸を指定すれば、紫のゲームオブジェクトを赤い点を中心にした軸で回転させる事が出来ます。

↑のように設定します。

RotateAroundを使ったサンプルを作成してみます。

中心点は空のゲームオブジェクトを作成し、名前をBasePositionとし、RotateAroundスクリプトのインスペクタで設定します。

BasePositionゲームオブジェクトの位置を中心点にして、軸を指定して回転させます。

軸は点からの方向を指定します。

軸には、Vector3.right(X軸方向)、Vector3.up(Y軸方向)、Vector3.forward(Z軸方向)を指定しています。

今回の場合はワールド座標のX、Y、Z軸と同じ方向を指定していますが、もちろん別の方向を指定する事も出来ます。

RotateAroundのインスペクタの設定

↑のような階層と、RotateAroundスクリプトの設定をして回転させてみます。

BasePositionの位置を中心点、Z軸を軸に回転させる為、BasePositionの位置を移動させるとEthanの回転が変わってきます。

それでは確認してみましょう。

↑のようになりました。

中心点であるBasePositionの位置を変えるとEthanがそこを中心に回転しているのがわかりますね。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます