【Unity】二本指でオブジェクトを回転させる方法

 二本指でCanvas上のSpriteを回転させる方法は、 1. タップしている指の座標を取得する.  2. 2点間をベクトルとして、1フレーム前のベクトルとのなす角を求める.  3. 現在の角度にその角度を足す. といった手順で実現できます。 以下で具体的に説明していきたいと思います。

Tags

タップしている指の座標を取得する


Input.touches :
最後のフレーム間ですべてのタッチ情報のオブジェクトリストを返します(読み取り専用)

[リファレンス]

とあるので二本指の座標は以下のようにして取得することができます。

Vector3 pos1 = Input.touches[0].position;
Vector3 pos2 = Input.touches[1].position;

2点間をベクトルとして、1フレーム前のベクトルとのなす角を求める


 まず、最初のタッチでは前フレームのベクトル(_beforeVec)がないので、それを決定したらreturnで処理を終了するようにします。

Vector3.Angle : 2点間( from と to )の角度を返します
Vector3.Cross : 2つのベクトルの外積

[リファレンス]

とあるので、Vector3.Angleによって角度を求めた後に外積のzの値を用いて正負を決定します。

少し面倒ですがVector3.Angleは0~180の正の値を返すので、外積などから正負を求める必要があります。

※外積は2つのベクトル両方と直角に交わるベクトルです。向きは右ねじの法則で決定し、下のコードでは0未満のとき-を掛けているので、右回りが負の方向となります。

bool _firstTouch = true;
Vector3 _beforeVec = Vector3.zero;

void Update(){

if(_firstTouch){
   _beforVec = pos1 - pos2;
   _firstTouch = false;
   return;
}

float angle = Vector3.Angle(_beforVec, pos1 - pos2);
Vector3 cross = Vector3.Cross(_beforVec, pos1- pos2);
if(cross.z < 0) angle *= -1;

_beforVec = pos1 - pos2;

}

現在の角度にその角度を足す


transform.Rotate: public void Rotate (Vector3 eulerAngles, Space relativeTo= Space.Self);
xAngle X 軸の周りで回転する角度
yAngle Y 軸の周りで回転する角度
zAngle Z 軸の周りで回転する角度
relativeTo 回転はオブジェクトに対してローカルか、ワールド

[リファレンス]

とあるので、ローカルが相対的回転なので

transform.Rotate(new Vector3(0,0,angle));

これでオーケーです。

オイラー角とかの説明はここでは省略したいと思います。


ここまで読んでいただきありがとうございました。