SpringBone を scaling に連動させる ScalingParams パラメーター

This commit is contained in:
ousttrue
2024-09-03 16:31:45 +09:00
parent 90ce110205
commit 31f2b5eb0c
5 changed files with 27 additions and 9 deletions

View File

@@ -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<VRMSpringBone>().Any(x => x.ScalingParams);
var newValue = GUILayout.Toggle(current, "[experimental] SpringBone scaling params");
if (current != newValue)
{
foreach (var sb in m_target.GetComponentsInChildren<VRMSpringBone>())
{
sb.ScalingParams = newValue;
}
}
}
}
}

View File

@@ -34,15 +34,14 @@ namespace VRM.SpringBone
/// Verlet積分で次の位置を計算する
/// </summary>
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;
}

View File

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

View File

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

View File

@@ -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)