mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-08-28 13:54:45 -05:00
Merge pull request #720 from ousttrue/fix/springbone_scaling
Fix/springbone scaling
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user