From 31f2b5eb0cfa9282359208fbae36852474f55081 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 3 Sep 2024 16:31:45 +0900 Subject: [PATCH] =?UTF-8?q?SpringBone=20=E3=82=92=20scaling=20=E3=81=AB?= =?UTF-8?q?=E9=80=A3=E5=8B=95=E3=81=95=E3=81=9B=E3=82=8B=20ScalingParams?= =?UTF-8?q?=20=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC=E3=82=BF=E3=83=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/VRM/Editor/Meta/VRMMetaEditor.cs | 15 ++++++++++++++- .../SpringBone/Logic/SpringBoneJointInit.cs | 7 +++---- .../SpringBone/Logic/SpringBoneSettings.cs | 6 ++++-- .../Runtime/SpringBone/Logic/SpringBoneSystem.cs | 2 +- Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs | 6 +++++- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Assets/VRM/Editor/Meta/VRMMetaEditor.cs b/Assets/VRM/Editor/Meta/VRMMetaEditor.cs index c7ca40404..4acd73d51 100644 --- a/Assets/VRM/Editor/Meta/VRMMetaEditor.cs +++ b/Assets/VRM/Editor/Meta/VRMMetaEditor.cs @@ -1,4 +1,6 @@ -using UnityEditor; +using System.Linq; +using UnityEditor; +using UnityEngine; namespace VRM @@ -47,6 +49,17 @@ namespace VRM { m_Inspector.OnInspectorGUI(); } + + GUILayout.Space(16); + var current = m_target.GetComponentsInChildren().Any(x => x.ScalingParams); + var newValue = GUILayout.Toggle(current, "[experimental] SpringBone scaling params"); + if (current != newValue) + { + foreach (var sb in m_target.GetComponentsInChildren()) + { + sb.ScalingParams = newValue; + } + } } } } diff --git a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneJointInit.cs b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneJointInit.cs index 6b2b92ce0..762caea0a 100644 --- a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneJointInit.cs +++ b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneJointInit.cs @@ -34,15 +34,14 @@ namespace VRM.SpringBone /// Verlet積分で次の位置を計算する /// public Vector3 VerletIntegration(float deltaTime, Transform center, Quaternion parentRotation, - SpringBoneSettings settings, SpringBoneJointState _state) + SpringBoneSettings settings, SpringBoneJointState _state, float scalingFactor) { var state = _state.ToWorld(center); - // verlet積分で次の位置を計算 var nextTail = state.CurrentTail + (state.CurrentTail - state.PrevTail) * (1.0f - settings.DragForce) // 前フレームの移動を継続する(減衰もあるよ) - + parentRotation * LocalRotation * BoneAxis * settings.StiffnessForce * deltaTime // 親の回転による子ボーンの移動目標 - + settings.GravityDir * (settings.GravityPower * deltaTime); // 外力による移動量 + + parentRotation * LocalRotation * BoneAxis * settings.StiffnessForce * deltaTime * scalingFactor // 親の回転による子ボーンの移動目標 + + settings.GravityDir * (settings.GravityPower * deltaTime) * scalingFactor; // 外力による移動量 return nextTail; } diff --git a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSettings.cs b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSettings.cs index 8ddabf49d..160ac447b 100644 --- a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSettings.cs +++ b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSettings.cs @@ -9,8 +9,10 @@ namespace VRM.SpringBone public readonly Vector3 GravityDir; public readonly float GravityPower; public readonly float HitRadius; + public readonly bool ScalingParams; - public SpringBoneSettings(float stiffnessForce, float dragForce, Vector3 gravityDir, float gravityPower, float hitRadius) => - (StiffnessForce, DragForce, GravityDir, GravityPower, HitRadius) = (stiffnessForce, dragForce, gravityDir, gravityPower, hitRadius); + public SpringBoneSettings(float stiffnessForce, float dragForce, Vector3 gravityDir, float gravityPower, float hitRadius, bool scalingParams) => + (StiffnessForce, DragForce, GravityDir, GravityPower, HitRadius, ScalingParams) + = (stiffnessForce, dragForce, gravityDir, gravityPower, hitRadius, scalingParams); } } \ No newline at end of file diff --git a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs index 1badea980..9810ef980 100644 --- a/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs +++ b/Assets/VRM/Runtime/SpringBone/Logic/SpringBoneSystem.cs @@ -109,7 +109,7 @@ namespace VRM.SpringBone // Spring処理 var parentRotation = (transform.parent != null ? transform.parent.rotation : Quaternion.identity); - var nextTail = init.VerletIntegration(deltaTime, scene.Center, parentRotation, settings, state); + var nextTail = init.VerletIntegration(deltaTime, scene.Center, parentRotation, settings, state, settings.ScalingParams ? transform.UniformedLossyScale() : 1.0f); // 長さをboneLengthに強制 nextTail = transform.position + (nextTail - transform.position).normalized * init.Length; diff --git a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs index 9932e3394..95c85cc69 100644 --- a/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs +++ b/Assets/VRM/Runtime/SpringBone/VRMSpringBone.cs @@ -22,6 +22,9 @@ namespace VRM [SerializeField] public float m_hitRadius = 0.02f; [SerializeField] public VRMSpringBoneColliderGroup[] ColliderGroups; + // シリアライズ対象でない + public bool ScalingParams { get; set; } + public enum SpringBoneUpdateType { LateUpdate, @@ -47,7 +50,8 @@ namespace VRM dragForce: m_dragForce, gravityDir: m_gravityDir, gravityPower: m_gravityPower, - hitRadius: m_hitRadius); + hitRadius: m_hitRadius, + scalingParams: ScalingParams); [ContextMenu("Reset bones")] public void Setup(bool force = false)