Merge pull request #720 from ousttrue/fix/springbone_scaling

Fix/springbone scaling
This commit is contained in:
PoChang007
2021-02-03 15:10:11 +09:00
committed by GitHub
4 changed files with 57 additions and 21 deletions

View File

@@ -1,4 +1,5 @@
using System.Linq;
using System.Linq;
using MeshUtility;
using UnityEditor;
using UnityEngine;
@@ -39,15 +40,26 @@ namespace VRM
EditorUtility.SetDirty(m_target);
}
}
override public void OnInspectorGUI()
{
// show validate information
foreach (var v in m_target.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 +67,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();

View File

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

View File

@@ -105,11 +105,6 @@ namespace VRM
return avatar;
});
// humanPoseTransfer
// var animator = normalized.GetComponent<Animator>();
// var humanPoseTransfer = normalized.AddComponent<HumanPoseTransfer>();
// humanPoseTransfer.Avatar = animator.avatar;
CopyVRMComponents(go, normalized, bMap);
return normalized;
@@ -135,6 +130,7 @@ namespace VRM
}
{
// springbone
var secondary = go.transform.Find("secondary");
if (secondary == null)
{
@@ -148,7 +144,7 @@ namespace VRM
dstSecondary.SetParent(root.transform, false);
}
// 揺れモノ
// VRMSpringBoneColliderGroup
foreach (var src in go.transform.GetComponentsInChildren<VRMSpringBoneColliderGroup>())
{
var dst = map[src.transform];
@@ -156,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<VRMSpringBone>())
{
// Copy VRMSpringBone
var dst = dstSecondary.gameObject.AddComponent<VRMSpringBone>();
dst.m_comment = src.m_comment;
dst.m_stiffnessForce = src.m_stiffnessForce;

View File

@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using MeshUtility;
using UnityEngine;
@@ -29,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,
@@ -48,5 +58,17 @@ namespace VRM
Gizmos.DrawWireSphere(y.Offset, y.Radius);
}
}
public IEnumerable<Validation> 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");
}
}
}
}