From 00e12781233664bf847e7308d7d7deb5967642ca Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 1 Dec 2023 17:17:48 +0900 Subject: [PATCH] fix NormalizeNoneSkinnedMesh --- .../UniGLTF/Runtime/MeshUtility/BoneNormalizer.cs | 9 +++++---- .../UniGLTF/Runtime/MeshUtility/GltfMeshUtility.cs | 2 +- Assets/UniGLTF/Runtime/MeshUtility/MeshFreezer.cs | 13 +++++++++++-- .../Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Assets/UniGLTF/Runtime/MeshUtility/BoneNormalizer.cs b/Assets/UniGLTF/Runtime/MeshUtility/BoneNormalizer.cs index 81be0e9ac..a5f6891cd 100644 --- a/Assets/UniGLTF/Runtime/MeshUtility/BoneNormalizer.cs +++ b/Assets/UniGLTF/Runtime/MeshUtility/BoneNormalizer.cs @@ -9,7 +9,7 @@ namespace UniGLTF.MeshUtility { public static class BoneNormalizer { - private static MeshAttachInfo CreateMeshInfo(Transform src) + private static MeshAttachInfo CreateMeshInfo(Transform src, bool freezeRotation) { // SkinnedMeshRenderer var smr = src.GetComponent(); @@ -29,7 +29,7 @@ namespace UniGLTF.MeshUtility var mr = src.GetComponent(); if (mr != null) { - var dstMesh = MeshFreezer.NormalizeNoneSkinnedMesh(mr); + var dstMesh = MeshFreezer.NormalizeNoneSkinnedMesh(mr, freezeRotation); if (dstMesh != null) { return new MeshAttachInfo @@ -48,12 +48,13 @@ namespace UniGLTF.MeshUtility /// 各レンダラー(SkinnedMeshRenderer と MeshRenderer)にアタッチされた sharedMesh に対して /// 回転とスケールを除去し、BlendShape の現状を焼き付けた版を作成する(まだ、アタッチしない) /// - public static Dictionary NormalizeHierarchyFreezeMesh(GameObject go) + public static Dictionary NormalizeHierarchyFreezeMesh( + GameObject go, bool freezeRotation) { var result = new Dictionary(); foreach (var src in go.transform.Traverse()) { - var info = CreateMeshInfo(src); + var info = CreateMeshInfo(src, freezeRotation); if (info != null) { result.Add(src, info); diff --git a/Assets/UniGLTF/Runtime/MeshUtility/GltfMeshUtility.cs b/Assets/UniGLTF/Runtime/MeshUtility/GltfMeshUtility.cs index 270876ccf..adad8582c 100644 --- a/Assets/UniGLTF/Runtime/MeshUtility/GltfMeshUtility.cs +++ b/Assets/UniGLTF/Runtime/MeshUtility/GltfMeshUtility.cs @@ -180,7 +180,7 @@ namespace UniGLTF.MeshUtility if (FreezeBlendShape || FreezeRotation || FreezeScaling) { // MeshをBakeする - var newMesh = BoneNormalizer.NormalizeHierarchyFreezeMesh(target); + var newMesh = BoneNormalizer.NormalizeHierarchyFreezeMesh(target, FreezeRotation); // - ヒエラルキーから回転・拡縮を除去する // - BakeされたMeshで置き換える diff --git a/Assets/UniGLTF/Runtime/MeshUtility/MeshFreezer.cs b/Assets/UniGLTF/Runtime/MeshUtility/MeshFreezer.cs index 4648bbf7c..fcd185a04 100644 --- a/Assets/UniGLTF/Runtime/MeshUtility/MeshFreezer.cs +++ b/Assets/UniGLTF/Runtime/MeshUtility/MeshFreezer.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using UnityEngine; +using UnityEngine.UIElements; using VRMShaders; namespace UniGLTF.MeshUtility @@ -330,7 +331,7 @@ namespace UniGLTF.MeshUtility } } - public static Mesh NormalizeNoneSkinnedMesh(MeshRenderer srcRenderer) + public static Mesh NormalizeNoneSkinnedMesh(MeshRenderer srcRenderer, bool freezeRotation) { if (srcRenderer == null || !srcRenderer.enabled) { @@ -347,7 +348,15 @@ namespace UniGLTF.MeshUtility var dstMesh = srcFilter.sharedMesh.Copy(false); // Meshに乗っているボーンの姿勢を適用する - dstMesh.ApplyRotationAndScale(srcRenderer.transform.localToWorldMatrix); + if (freezeRotation) + { + dstMesh.ApplyRotationAndScale(srcRenderer.transform.localToWorldMatrix); + } + else + { + var (t, r, s) = srcRenderer.transform.localToWorldMatrix.Decompose(); + dstMesh.ApplyRotationAndScale(Matrix4x4.TRS(t, Quaternion.identity, s)); + } return dstMesh; } } diff --git a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs index 3004d866a..81f630c52 100644 --- a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs +++ b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs @@ -67,7 +67,7 @@ namespace VRM } // Meshの焼きこみ - var newMesh = BoneNormalizer.NormalizeHierarchyFreezeMesh(go); + var newMesh = BoneNormalizer.NormalizeHierarchyFreezeMesh(go, true); // 焼いたMeshで置き換える BoneNormalizer.Replace(go, newMesh, true, true);