Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
        }