littlewing

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

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

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;
    }

参考