Merge pull request #935 from ousttrue/fix/springbone_scale

スプリングボーンのスケールの動作を修正
This commit is contained in:
PoChang007
2021-05-10 14:23:38 +09:00
committed by GitHub
5 changed files with 59 additions and 34 deletions

View File

@@ -152,7 +152,7 @@ namespace VRM
dstColliderGroup.Colliders = src.Colliders.Select(y =>
{
var offset = dst.worldToLocalMatrix.MultiplyPoint(src.transform.localToWorldMatrix.MultiplyPoint(y.Offset));
var ls = src.UniformedLossyScale;
var ls = src.transform.UniformedLossyScale();
return new VRMSpringBoneColliderGroup.SphereCollider
{
Offset = offset,

View File

@@ -0,0 +1,16 @@
using UnityEngine;
namespace VRM
{
public static class TransformExtensions
{
public static float UniformedLossyScale(this Transform transform)
{
return Mathf.Max(
Mathf.Max(transform.lossyScale.x,
transform.lossyScale.y),
transform.lossyScale.z
);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d5465187646dee944ac1bc45ddf0fc7a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -85,7 +85,11 @@ namespace VRM
private Quaternion LocalRotation { get; }
public float Radius { get; set; }
float m_radius;
public void SetRadius(float radius)
{
m_radius = radius * m_transform.UniformedLossyScale();
}
private Quaternion ParentRotation =>
m_transform.parent != null
@@ -139,12 +143,12 @@ namespace VRM
{
foreach (var collider in colliders)
{
var r = Radius + collider.Radius;
var r = m_radius + collider.Radius;
if (Vector3.SqrMagnitude(nextTail - collider.Position) <= (r * r))
{
// ヒット。Colliderの半径方向に押し出す
var normal = (nextTail - collider.Position).normalized;
var posFromCollider = collider.Position + normal * (Radius + collider.Radius);
var posFromCollider = collider.Position + normal * (m_radius + collider.Radius);
// 長さをboneLengthに強制
nextTail = m_transform.position + (posFromCollider - m_transform.position).normalized * m_length;
}
@@ -152,7 +156,7 @@ namespace VRM
return nextTail;
}
public void DrawGizmo(Transform center, float radius, Color color)
public void DrawGizmo(Transform center, Color color)
{
var currentTail = center != null
? center.TransformPoint(m_currentTail)
@@ -163,13 +167,14 @@ namespace VRM
Gizmos.color = Color.gray;
Gizmos.DrawLine(currentTail, prevTail);
Gizmos.DrawWireSphere(prevTail, radius);
Gizmos.DrawWireSphere(prevTail, m_radius);
Gizmos.color = color;
Gizmos.DrawLine(currentTail, m_transform.position);
Gizmos.DrawWireSphere(currentTail, radius);
Gizmos.DrawWireSphere(currentTail, m_radius);
}
}
List<VRMSpringBoneLogic> m_verlet = new List<VRMSpringBoneLogic>();
void Awake()
@@ -217,26 +222,29 @@ namespace VRM
private void SetupRecursive(Transform center, Transform parent)
{
Vector3 localPosition = default;
Vector3 scale = default;
if (parent.childCount == 0)
{
// 子ードが無い。7cm 固定
var delta = parent.position - parent.parent.position;
var childPosition = parent.position + delta.normalized * 0.07f;
m_verlet.Add(new VRMSpringBoneLogic(center, parent,
parent.worldToLocalMatrix.MultiplyPoint(childPosition)));
var childPosition = parent.position + delta.normalized * 0.07f * parent.UniformedLossyScale();
localPosition = parent.worldToLocalMatrix.MultiplyPoint(childPosition); // cancel scale
scale = parent.lossyScale;
}
else
{
var firstChild = GetChildren(parent).First();
var localPosition = firstChild.localPosition;
var scale = firstChild.lossyScale;
m_verlet.Add(new VRMSpringBoneLogic(center, parent,
new Vector3(
localPosition.x * scale.x,
localPosition.y * scale.y,
localPosition.z * scale.z
)))
;
localPosition = firstChild.localPosition;
scale = firstChild.lossyScale;
}
m_verlet.Add(new VRMSpringBoneLogic(center, parent,
new Vector3(
localPosition.x * scale.x,
localPosition.y * scale.y,
localPosition.z * scale.z
)))
;
foreach (Transform child in parent) SetupRecursive(center, child);
}
@@ -302,7 +310,7 @@ namespace VRM
foreach (var verlet in m_verlet)
{
verlet.Radius = m_hitRadius;
verlet.SetRadius(m_hitRadius);
verlet.Update(m_center,
stiffness,
m_dragForce,
@@ -317,7 +325,9 @@ namespace VRM
if (!m_drawGizmo) return;
foreach (var verlet in m_verlet)
verlet.DrawGizmo(m_center, m_hitRadius, m_gizmoColor);
{
verlet.DrawGizmo(m_center, m_gizmoColor);
}
}
}
}

View File

@@ -31,23 +31,11 @@ namespace VRM
[SerializeField]
Color m_gizmoColor = Color.magenta;
public float UniformedLossyScale
{
get
{
return Mathf.Max(
Mathf.Max(transform.lossyScale.x,
transform.lossyScale.y),
transform.lossyScale.z
);
}
}
private void OnDrawGizmosSelected()
{
Gizmos.color = m_gizmoColor;
Matrix4x4 mat = transform.localToWorldMatrix;
var ls = UniformedLossyScale;
var ls = transform.UniformedLossyScale();
Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
1.0f / transform.lossyScale.x * ls,
1.0f / transform.lossyScale.y * ls,