mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-04-25 15:47:26 -05:00
rename
This commit is contained in:
parent
c270da62e1
commit
ee68e48f0f
49
Assets/VRM/Runtime/SpringBone/Logic/SpringBoneJointInit.cs
Normal file
49
Assets/VRM/Runtime/SpringBone/Logic/SpringBoneJointInit.cs
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
using UnityEngine;
|
||||
|
||||
namespace VRM.SpringBone
|
||||
{
|
||||
struct JointState
|
||||
{
|
||||
public Vector3 CurrentTail;
|
||||
public Vector3 PrevTail;
|
||||
|
||||
public static JointState Init(Transform center, Transform transform, Vector3 localChildPosition)
|
||||
{
|
||||
var worldChildPosition = transform.TransformPoint(localChildPosition);
|
||||
var tail = center != null
|
||||
? center.InverseTransformPoint(worldChildPosition)
|
||||
: worldChildPosition;
|
||||
return new JointState
|
||||
{
|
||||
CurrentTail = tail,
|
||||
PrevTail = tail,
|
||||
};
|
||||
}
|
||||
|
||||
public static JointState Make(Transform center, Vector3 currentTail, Vector3 nextTail)
|
||||
{
|
||||
return new JointState
|
||||
{
|
||||
PrevTail = center != null
|
||||
? center.InverseTransformPoint(currentTail)
|
||||
: currentTail,
|
||||
CurrentTail = center != null
|
||||
? center.InverseTransformPoint(nextTail)
|
||||
: nextTail,
|
||||
};
|
||||
}
|
||||
|
||||
public JointState ToWorld(Transform center)
|
||||
{
|
||||
return new JointState
|
||||
{
|
||||
CurrentTail = center != null
|
||||
? center.TransformPoint(CurrentTail)
|
||||
: CurrentTail,
|
||||
PrevTail = center != null
|
||||
? center.TransformPoint(PrevTail)
|
||||
: PrevTail,
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 3bbcafd66c035184b8aa868b65c01c1d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -3,113 +3,45 @@ using UnityEngine;
|
|||
|
||||
namespace VRM.SpringBone
|
||||
{
|
||||
struct JointInit
|
||||
{
|
||||
public Vector3 BoneAxis;
|
||||
public float Length;
|
||||
public Quaternion LocalRotation;
|
||||
|
||||
public Quaternion ApplyRotation(Transform m_transform, Vector3 nextTail)
|
||||
{
|
||||
var rotation = (m_transform.parent != null ? m_transform.parent.rotation : Quaternion.identity) * LocalRotation;
|
||||
return Quaternion.FromToRotation(rotation * BoneAxis,
|
||||
nextTail - m_transform.position) * rotation;
|
||||
}
|
||||
};
|
||||
|
||||
struct JointState
|
||||
{
|
||||
public Vector3 CurrentTail;
|
||||
public Vector3 PrevTail;
|
||||
|
||||
public static JointState Init(Transform center, Transform transform, Vector3 localChildPosition)
|
||||
{
|
||||
var worldChildPosition = transform.TransformPoint(localChildPosition);
|
||||
var tail = center != null
|
||||
? center.InverseTransformPoint(worldChildPosition)
|
||||
: worldChildPosition;
|
||||
return new JointState
|
||||
{
|
||||
CurrentTail = tail,
|
||||
PrevTail = tail,
|
||||
};
|
||||
}
|
||||
|
||||
public static JointState Make(Transform center, Vector3 currentTail, Vector3 nextTail)
|
||||
{
|
||||
return new JointState
|
||||
{
|
||||
PrevTail = center != null
|
||||
? center.InverseTransformPoint(currentTail)
|
||||
: currentTail,
|
||||
CurrentTail = center != null
|
||||
? center.InverseTransformPoint(nextTail)
|
||||
: nextTail,
|
||||
};
|
||||
}
|
||||
|
||||
public JointState ToWorld(Transform center)
|
||||
{
|
||||
return new JointState
|
||||
{
|
||||
CurrentTail = center != null
|
||||
? center.TransformPoint(CurrentTail)
|
||||
: CurrentTail,
|
||||
PrevTail = center != null
|
||||
? center.TransformPoint(PrevTail)
|
||||
: PrevTail,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// original from
|
||||
/// http://rocketjump.skr.jp/unity3d/109/
|
||||
///
|
||||
/// Joint 状態(初期・フレーム)を管理する
|
||||
/// </summary>
|
||||
class SpringBoneJointState
|
||||
struct SpringBoneJointInit
|
||||
{
|
||||
// 不変
|
||||
JointInit m_init;
|
||||
// フレーム状態
|
||||
JointState m_state;
|
||||
public Vector3 BoneAxis;
|
||||
public float Length;
|
||||
public Quaternion LocalRotation;
|
||||
|
||||
public SpringBoneJointState(Transform center, Transform transform, Vector3 localChildPosition)
|
||||
public Quaternion CalcRotation(Transform m_transform, Vector3 nextTail)
|
||||
{
|
||||
m_state = JointState.Init(center, transform, localChildPosition);
|
||||
m_init = new JointInit
|
||||
{
|
||||
LocalRotation = transform.localRotation,
|
||||
BoneAxis = localChildPosition.normalized,
|
||||
Length = localChildPosition.magnitude,
|
||||
};
|
||||
var rotation = (m_transform.parent != null ? m_transform.parent.rotation : Quaternion.identity) * LocalRotation;
|
||||
return Quaternion.FromToRotation(rotation * BoneAxis,
|
||||
nextTail - m_transform.position) * rotation;
|
||||
}
|
||||
|
||||
public void Update(float deltaTime, Transform center, Transform m_transform,
|
||||
public JointState Update(float deltaTime, Transform center, Transform m_transform,
|
||||
SpringBoneSettings settings,
|
||||
List<SphereCollider> colliders, bool calcScale = false)
|
||||
List<SphereCollider> colliders, JointState _state)
|
||||
{
|
||||
var state = m_state.ToWorld(center);
|
||||
var state = _state.ToWorld(center);
|
||||
|
||||
// verlet積分で次の位置を計算
|
||||
var scaleFactor = calcScale ? m_transform.UniformedLossyScale() : 1.0f;
|
||||
var nextTail = state.CurrentTail
|
||||
+ (state.CurrentTail - state.PrevTail) * (1.0f - settings.DragForce) // 前フレームの移動を継続する(減衰もあるよ)
|
||||
+ (m_transform.parent != null ? m_transform.parent.rotation : Quaternion.identity) * m_init.LocalRotation * m_init.BoneAxis * settings.StiffnessForce * deltaTime * scaleFactor // 親の回転による子ボーンの移動目標
|
||||
+ settings.GravityDir * (settings.GravityPower * deltaTime) * scaleFactor; // 外力による移動量
|
||||
+ (m_transform.parent != null ? m_transform.parent.rotation : Quaternion.identity) * LocalRotation * BoneAxis * settings.StiffnessForce * deltaTime // 親の回転による子ボーンの移動目標
|
||||
+ settings.GravityDir * (settings.GravityPower * deltaTime); // 外力による移動量
|
||||
|
||||
// 長さをboneLengthに強制
|
||||
var position = m_transform.position;
|
||||
nextTail = position + (nextTail - position).normalized * m_init.Length;
|
||||
nextTail = position + (nextTail - position).normalized * Length;
|
||||
|
||||
// Collisionで移動
|
||||
nextTail = Collision(m_transform, settings, colliders, nextTail);
|
||||
|
||||
m_state = JointState.Make(center, currentTail: state.CurrentTail, nextTail: nextTail);
|
||||
|
||||
//回転を適用
|
||||
m_transform.rotation = m_init.ApplyRotation(m_transform, nextTail);
|
||||
return JointState.Make(center, currentTail: state.CurrentTail, nextTail: nextTail);
|
||||
}
|
||||
|
||||
Vector3 Collision(Transform m_transform, SpringBoneSettings settings, List<SphereCollider> colliders, Vector3 nextTail)
|
||||
|
|
@ -124,13 +56,13 @@ namespace VRM.SpringBone
|
|||
var normal = (nextTail - collider.Position).normalized;
|
||||
var posFromCollider = collider.Position + normal * (m_radius + collider.Radius);
|
||||
// 長さをboneLengthに強制
|
||||
nextTail = m_transform.position + (posFromCollider - m_transform.position).normalized * m_init.Length;
|
||||
nextTail = m_transform.position + (posFromCollider - m_transform.position).normalized * Length;
|
||||
}
|
||||
}
|
||||
return nextTail;
|
||||
}
|
||||
|
||||
public void DrawGizmo(Transform center, Transform m_transform, SpringBoneSettings settings, Color color)
|
||||
public void DrawGizmo(Transform center, Transform m_transform, SpringBoneSettings settings, Color color, JointState m_state)
|
||||
{
|
||||
var state = m_state.ToWorld(center);
|
||||
var m_radius = settings.HitRadius * m_transform.UniformedLossyScale();
|
||||
|
|
@ -143,5 +75,6 @@ namespace VRM.SpringBone
|
|||
Gizmos.DrawLine(state.CurrentTail, m_transform.position);
|
||||
Gizmos.DrawWireSphere(state.CurrentTail, m_radius);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
|
@ -15,7 +15,7 @@ namespace VRM.SpringBone
|
|||
class SpringBoneSystem
|
||||
{
|
||||
Dictionary<Transform, Quaternion> m_initialLocalRotationMap;
|
||||
List<(Transform, SpringBoneJointState)> m_joints = new();
|
||||
List<(Transform, SpringBoneJointInit, JointState)> m_joints = new();
|
||||
List<SphereCollider> m_colliders = new();
|
||||
|
||||
public void Setup(SceneInfo scene, bool force)
|
||||
|
|
@ -65,14 +65,21 @@ namespace VRM.SpringBone
|
|||
localPosition = firstChild.localPosition;
|
||||
scale = firstChild.lossyScale;
|
||||
}
|
||||
m_joints.Add((
|
||||
parent,
|
||||
new SpringBoneJointState(center, parent,
|
||||
new Vector3(
|
||||
|
||||
var localChildPosition = new Vector3(
|
||||
localPosition.x * scale.x,
|
||||
localPosition.y * scale.y,
|
||||
localPosition.z * scale.z
|
||||
))));
|
||||
);
|
||||
m_joints.Add((
|
||||
parent,
|
||||
new SpringBoneJointInit
|
||||
{
|
||||
LocalRotation = parent.localRotation,
|
||||
BoneAxis = localChildPosition.normalized,
|
||||
Length = localChildPosition.magnitude,
|
||||
},
|
||||
JointState.Init(center, parent, localChildPosition)));
|
||||
|
||||
foreach (Transform child in parent) SetupRecursive(center, child);
|
||||
}
|
||||
|
|
@ -103,19 +110,23 @@ namespace VRM.SpringBone
|
|||
}
|
||||
}
|
||||
|
||||
foreach (var (transform, verlet) in m_joints)
|
||||
for (int i = 0; i < m_joints.Count; ++i)
|
||||
{
|
||||
verlet.Update(deltaTime, scene.Center, transform, settings,
|
||||
m_colliders
|
||||
);
|
||||
var (transform, init, state) = m_joints[i];
|
||||
var nextState = init.Update(deltaTime, scene.Center, transform, settings, m_colliders, state);
|
||||
m_joints[i] = (transform, init, nextState);
|
||||
|
||||
//回転を適用
|
||||
var r = init.CalcRotation(transform, nextState.CurrentTail);
|
||||
transform.rotation = r;
|
||||
}
|
||||
}
|
||||
|
||||
public void PlayingGizmo(Transform m_center, SpringBoneSettings settings, Color m_gizmoColor)
|
||||
{
|
||||
foreach (var (transform, verlet) in m_joints)
|
||||
foreach (var (transform, init, state) in m_joints)
|
||||
{
|
||||
verlet.DrawGizmo(m_center, transform, settings, m_gizmoColor);
|
||||
init.DrawGizmo(m_center, transform, settings, m_gizmoColor, state);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user