public void Process(Transform center) { m_center = center; if (Joints == null) { return; } // gather colliders m_colliderList.Clear(); if (ColliderGroups != null) { foreach (var group in ColliderGroups) { if (group != null) { foreach (var collider in group.Colliders) { switch (collider.ColliderType) { case VRM10SpringBoneColliderTypes.Sphere: m_colliderList.Add(new SpringBoneLogic.InternalCollider { ColliderTypes = VRM10SpringBoneColliderTypes.Sphere, WorldPosition = group.transform.TransformPoint(collider.Offset), Radius = collider.Radius, }); break; case VRM10SpringBoneColliderTypes.Capsule: m_colliderList.Add(new SpringBoneLogic.InternalCollider { ColliderTypes = VRM10SpringBoneColliderTypes.Capsule, WorldPosition = group.transform.TransformPoint(collider.Offset), Radius = collider.Radius, WorldTail = group.transform.TransformPoint(collider.Tail) }); break; } } } } } { // udpate joints VRM10SpringJoint lastJoint = Joints.FirstOrDefault(x => x != null); foreach (var joint in Joints.Where(x => x != null).Skip(1)) { lastJoint.Update(center, Time.deltaTime, m_colliderList, joint); lastJoint = joint; } lastJoint.Update(center, Time.deltaTime, m_colliderList, null); } }
public void Update(Transform center, float deltaTime, List <SpringBoneLogic.InternalCollider> colliders, VRM10SpringJoint tail) { if (m_logic == null) { // 初期化 if (tail != null) { var localPosition = tail.Transform.localPosition; var scale = tail.Transform.lossyScale; m_logic = new SpringBoneLogic(center, Transform, new Vector3( localPosition.x * scale.x, localPosition.y * scale.y, localPosition.z * scale.z )); } else { // 親からまっすぐの位置に tail を作成 var delta = Transform.position - Transform.parent.position; var childPosition = Transform.position + delta.normalized * 0.07f; m_logic = new SpringBoneLogic(center, Transform, Transform.worldToLocalMatrix.MultiplyPoint(childPosition)); } } m_logic.Update(center, m_stiffnessForce * deltaTime, m_dragForce, m_gravityDir * (m_gravityPower * deltaTime), colliders, m_jointRadius); }