public override void Collide(ref Vector3 position, float spacing) { if (referenceCollider is SphereCollider) { SphereCollider collider = referenceCollider as SphereCollider; if (insideMode) { EZPhysicsUtility.PointInsideSphere(ref position, collider, spacing + margin); } else { EZPhysicsUtility.PointOutsideSphere(ref position, collider, spacing + margin); } } else if (referenceCollider is CapsuleCollider) { CapsuleCollider collider = referenceCollider as CapsuleCollider; if (insideMode) { EZPhysicsUtility.PointInsideCapsule(ref position, collider, spacing + margin); } else { EZPhysicsUtility.PointOutsideCapsule(ref position, collider, spacing + margin); } } else if (referenceCollider is BoxCollider) { BoxCollider collider = referenceCollider as BoxCollider; if (insideMode) { EZPhysicsUtility.PointInsideBox(ref position, collider, spacing + margin); } else { EZPhysicsUtility.PointOutsideBox(ref position, collider, spacing + margin); } } else if (referenceCollider is MeshCollider) { if (!CheckConvex(referenceCollider as MeshCollider)) { Debug.LogError("Non-Convex Mesh Collider is not supported", this); enabled = false; return; } if (insideMode) { Debug.LogError("Inside Mode On Mesh Collider is not supported", this); insideMode = false; return; } EZPhysicsUtility.PointOutsideCollider(ref position, referenceCollider, spacing + margin); } }
private void UpdateNode(TreeNode node, float deltaTime) { if (node.depth > startDepth) { Vector3 lastPosition = node.position; // Damping (inertia attenuation) if (node.speed.sqrMagnitude < sleepThreshold) { node.speed = Vector3.zero; } else { node.position += node.speed * deltaTime * (1 - sharedMaterial.GetDamping(node.normalizedLength)); } // Resistance (outside force resistance) Vector3 force = gravity; if (forceModule != null) { force += forceModule.GetForce(node.normalizedLength); } node.position += force * deltaTime * (1 - sharedMaterial.GetResistance(node.normalizedLength)); // Stiffness (shape keeper) Vector3 parentOffset = node.parent.position - node.parent.transform.position; Vector3 expectedPos = node.parent.transform.TransformPoint(node.originalLocalPosition) + parentOffset; node.position = Vector3.Lerp(node.position, expectedPos, sharedMaterial.GetStiffness(node.normalizedLength)); // Collision if (node.radius > 0) { foreach (EZPhysicsBoneColliderBase collider in EZPhysicsBoneColliderBase.EnabledColliders) { if (node.transform != collider.transform && collisionLayers.Contains(collider.gameObject.layer)) { collider.Collide(ref node.position, node.radius); } } foreach (Collider collider in extraColliders) { if (node.transform != collider.transform && collider.enabled) { EZPhysicsUtility.PointOutsideCollider(ref node.position, collider, node.radius); } } } // Slackness (length keeper) Vector3 nodeDir = (node.position - node.parent.position).normalized; Vector3 lengthKeeper = node.parent.position + nodeDir * node.nodeLength; node.position = Vector3.Lerp(lengthKeeper, node.position, sharedMaterial.GetSlackness(node.normalizedLength)); node.speed = (node.position - lastPosition) / deltaTime; } else { node.position = node.transform.position; } for (int i = 0; i < node.children.Count; i++) { UpdateNode(node.children[i], deltaTime); } }