/// <summary>
        /// 回転とスケールを除去したヒエラルキーのコピーを作成する(MeshをBakeする)
        /// </summary>
        /// <param name="go">対象のヒエラルキーのルート</param>
        /// <param name="bakeCurrentBlendShape">BlendShapeを0クリアするか否か。false の場合 BlendShape の現状を Bake する</param>
        /// <param name="createAvatar">Avatarを作る関数</param>
        /// <returns></returns>
        public static (GameObject, Dictionary <Transform, Transform>) Execute(GameObject go, CreateAvatarFunc createAvatar)
        {
            //
            // 正規化されたヒエラルキーを作る
            //
            var(normalized, boneMap) = NormalizeHierarchy(go, createAvatar);

            //
            // 各メッシュから回転・スケールを取り除いてBinding行列を再計算する
            //
            foreach (var src in go.transform.Traverse())
            {
                Transform dst;
                if (!boneMap.TryGetValue(src, out dst))
                {
                    continue;
                }

                NormalizeSkinnedMesh(src, dst, boneMap);

                NormalizeNoneSkinnedMesh(src, dst);
            }

            return(normalized, boneMap);
        }
        static (GameObject, Dictionary <Transform, Transform>) NormalizeHierarchy(GameObject go, CreateAvatarFunc createAvatar)
        {
            var boneMap = new Dictionary <Transform, Transform>();

            //
            // 回転・スケールの無いヒエラルキーをコピーする
            //
            var normalized = new GameObject(go.name + "(normalized)");

            normalized.transform.position = go.transform.position;
            CopyAndBuild(go.transform, normalized.transform, boneMap);

            //
            // 新しいヒエラルキーからAvatarを作る
            //
            {
                var animator = normalized.AddComponent <Animator>();
                var avatar   = createAvatar(go, normalized, boneMap);
                avatar.name     = go.name + ".normalized";
                animator.avatar = avatar;
            }

            return(normalized, boneMap);
        }