littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

Quaternion を使って、オブジェクトの回転と位置を一致させる

2つのGameObjectツリーどうしの座標系を合わせるために、親要素を動かすためのメモ

/// <summary>
/// Transform同時の位置と回転を合わせるために、親要素のTransformを動かす
/// </summary>
/// <param name="target">基準となるTransform</param>
/// <param name="move">targetと一致させたいTransform</param>
/// <param name="moveParent">実際に移動・回転するmoveの親となるTransform</param>
void AdjusTransform(Transform target,Transform move,Transform moveParent)
{
    //回転処理

    //moveのrotationが、targetのrotationと同じになるようにするための差分のクオータニオンを取得
    //差分のquotanionを取得するには、逆のクオータニオンを掛ける
    var requiredRot = target.rotation * Quaternion.Inverse(move.rotation);

    //親オブジェクトを回転させる場合は requiredRotに対して、markerParent.transform.rotationをかける
    moveParent.transform.rotation = requiredRot * moveParent.transform.rotation;

    //移動処理

    //親要素を軸に回転すると、子要素の位置は、ずれている。そのため回転実施後に位置の差分計算を行う
    var requiredPos = target.position - move.position;
    //targetとmoveの位置を合わせる
    moveParent.transform.position += requiredPos;
}

参考