mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-09-11 21:38:56 -05:00
SpringBone を scaling に連動させる ScalingParams パラメーター
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user