From ef8d929e06541cd78e03ed049884758cd17d8d17 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 2 Feb 2021 16:02:54 +0900 Subject: [PATCH 1/4] add collider warning message for scaled node #673 --- .../VRMSpringBoneColliderGroupEditor.cs | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs index 89f5192fe..0d9a248d0 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs @@ -1,4 +1,6 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; +using MeshUtility; using UnityEditor; using UnityEngine; @@ -39,15 +41,35 @@ namespace VRM EditorUtility.SetDirty(m_target); } } - + + public IEnumerable Validate() + { + if (m_target.transform.lossyScale != Vector3.one) + { + yield return Validation.Warning("this or parent GameObject has none 1 scaling"); + } + } + + + override public void OnInspectorGUI() + { + // show validate information + foreach (var v in Validate()) + { + v.DrawGUI(); + } + + base.OnInspectorGUI(); + } + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/X Mirror")] private static void InvertOffsetX(MenuCommand command) { var target = command.context as VRMSpringBoneColliderGroup; if (target == null) return; - + Undo.RecordObject(target, "X Mirror"); - + foreach (var sphereCollider in target.Colliders) { var offset = sphereCollider.Offset; @@ -55,24 +77,24 @@ namespace VRM sphereCollider.Offset = offset; } } - + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/Sort Colliders by Radius")] private static void SortByRadius(MenuCommand command) { var target = command.context as VRMSpringBoneColliderGroup; if (target == null) return; - + Undo.RecordObject(target, "Sort Colliders by Radius"); target.Colliders = target.Colliders.OrderBy(x => -x.Radius).ToArray(); } - + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/Sort Colliders by Offset Y")] private static void SortByOffsetY(MenuCommand command) { var target = command.context as VRMSpringBoneColliderGroup; if (target == null) return; - + Undo.RecordObject(target, "Sort Colliders by Offset Y"); target.Colliders = target.Colliders.OrderBy(x => -x.Offset.y).ToArray(); From d90b7df4657959c0a9726ef791ee4cd8c354a720 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 2 Feb 2021 16:11:39 +0900 Subject: [PATCH 2/4] update validation --- .../SpringBone/VRMSpringBoneColliderGroupEditor.cs | 12 +----------- .../Editor/SpringBone/VRMSpringBoneValidator.cs | 5 +++++ .../SpringBone/VRMSpringBoneColliderGroup.cs | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs index 0d9a248d0..8201e3c05 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using System.Linq; using MeshUtility; using UnityEditor; @@ -42,19 +41,10 @@ namespace VRM } } - public IEnumerable Validate() - { - if (m_target.transform.lossyScale != Vector3.one) - { - yield return Validation.Warning("this or parent GameObject has none 1 scaling"); - } - } - - override public void OnInspectorGUI() { // show validate information - foreach (var v in Validate()) + foreach (var v in m_target.Validate()) { v.DrawGUI(); } diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneValidator.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneValidator.cs index 5809b6938..0d3b29fef 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneValidator.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneValidator.cs @@ -63,6 +63,11 @@ namespace VRM yield return Validation.Error($"{sb.name}.ColliderGroups[{i}] is out of hierarchy"); continue; } + + foreach (var x in c.Validate()) + { + yield return x; + } } } } diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs index b6692ac74..0656d7425 100644 --- a/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs +++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using MeshUtility; using UnityEngine; @@ -48,5 +50,17 @@ namespace VRM Gizmos.DrawWireSphere(y.Offset, y.Radius); } } + + public IEnumerable Validate() + { + if (transform.localScale != Vector3.one) + { + yield return Validation.Warning($"'{name}' GameObject has none 1 scaling"); + } + else if (transform.lossyScale != Vector3.one) + { + yield return Validation.Warning($"'{name}' parent GameObject has none 1 scaling"); + } + } } } From 1bf79f326ff4b3c2acf5748026959e33d1fc5d84 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 2 Feb 2021 16:15:07 +0900 Subject: [PATCH 3/4] remove comment --- Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs index 6ff4265bd..bf7271c5e 100644 --- a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs +++ b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs @@ -105,11 +105,6 @@ namespace VRM return avatar; }); - // humanPoseTransfer - // var animator = normalized.GetComponent(); - // var humanPoseTransfer = normalized.AddComponent(); - // humanPoseTransfer.Avatar = animator.avatar; - CopyVRMComponents(go, normalized, bMap); return normalized; From 4da433fb247de67011e90a7080aa3546097e67de Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 2 Feb 2021 16:28:17 +0900 Subject: [PATCH 4/4] implement normalization for VRMSpringBoneColliderGroup --- .../SkinnedMeshUtility/VRMBoneNormalizer.cs | 8 +++++--- .../SpringBone/VRMSpringBoneColliderGroup.cs | 18 +++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs index bf7271c5e..9fbdcf5d8 100644 --- a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs +++ b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs @@ -130,6 +130,7 @@ namespace VRM } { + // springbone var secondary = go.transform.Find("secondary"); if (secondary == null) { @@ -143,7 +144,7 @@ namespace VRM dstSecondary.SetParent(root.transform, false); } - // 揺れモノ + // VRMSpringBoneColliderGroup foreach (var src in go.transform.GetComponentsInChildren()) { var dst = map[src.transform]; @@ -151,17 +152,18 @@ namespace VRM dstColliderGroup.Colliders = src.Colliders.Select(y => { var offset = dst.worldToLocalMatrix.MultiplyPoint(src.transform.localToWorldMatrix.MultiplyPoint(y.Offset)); + var ls = src.UniformedLossyScale; return new VRMSpringBoneColliderGroup.SphereCollider { Offset = offset, - Radius = y.Radius + Radius = y.Radius * ls }; }).ToArray(); } + // VRMSpringBone foreach (var src in go.transform.GetComponentsInChildren()) { - // Copy VRMSpringBone var dst = dstSecondary.gameObject.AddComponent(); dst.m_comment = src.m_comment; dst.m_stiffnessForce = src.m_stiffnessForce; diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs index 0656d7425..9ad63c3ae 100644 --- a/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs +++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBoneColliderGroup.cs @@ -31,15 +31,23 @@ namespace VRM [SerializeField] Color m_gizmoColor = Color.magenta; + public float UniformedLossyScale + { + get + { + return Mathf.Max( + transform.lossyScale.x, + transform.lossyScale.y, + transform.lossyScale.z + ); + } + } + private void OnDrawGizmosSelected() { Gizmos.color = m_gizmoColor; Matrix4x4 mat = transform.localToWorldMatrix; - var ls = Mathf.Max( - transform.lossyScale.x, - transform.lossyScale.y, - transform.lossyScale.z - ); + var ls = UniformedLossyScale; Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3( 1.0f / transform.lossyScale.x * ls, 1.0f / transform.lossyScale.y * ls,