/// <summary>Attaches the spider to the web.</summary> private void Attach(Spider spider) { ThreadSegment threadSegment = _threadSegments[_threadSegments.Count - 1]; float dist = (spider.transform.position - threadSegment.PosNow).magnitude; Vector3 changeDir = (spider.transform.position - threadSegment.PosNow).normalized; Vector3 changeAmount = changeDir * dist; spider.transform.position -= changeAmount * 0.5f; threadSegment.PosNow += changeAmount * 0.5f; _threadSegments[_threadSegments.Count - 1] = threadSegment; }
private void ApplyConstraints() { // Constraint (Attaching the web to fixed points) foreach (KeyValuePair <int, Vector3> pointCoords in _attachedPoints) { ThreadSegment segment = _threadSegments[pointCoords.Key]; segment.PosNow = pointCoords.Value; _threadSegments[pointCoords.Key] = segment; } // Constraint (Two points in the thread will always need to keep a certain distance apart) for (int i = 0; i < _threadSegments.Count - 1; i++) { ThreadSegment firstSegment = _threadSegments[i]; ThreadSegment secondSegment = _threadSegments[i + 1]; float dist = (firstSegment.PosNow - secondSegment.PosNow).magnitude; float error = Mathf.Abs(dist - ThreadSegLen); Vector3 changeDir = Vector3.zero; if (dist > ThreadSegLen) { changeDir = (firstSegment.PosNow - secondSegment.PosNow).normalized; } else { changeDir = (secondSegment.PosNow - firstSegment.PosNow).normalized; } Vector3 changeAmount = changeDir * error; if (i != 0) { firstSegment.PosNow -= changeAmount * 0.5f; _threadSegments[i] = firstSegment; secondSegment.PosNow += changeAmount * 0.5f; _threadSegments[i + 1] = secondSegment; } else { secondSegment.PosNow += changeAmount; _threadSegments[i + 1] = secondSegment; } } if (_spiderIsAttached) { Attach(_spider); } }
private void Simulate() { //SIMULATION for (int i = 0; i < _threadSegments.Count; i++) { ThreadSegment segment = _threadSegments[i]; Vector3 velocity = segment.PosNow - segment.PosOld; segment.PosOld = segment.PosNow; segment.PosNow += velocity + _forceGravity * Time.deltaTime + _wind.GetSpeed(segment.PosNow.y) * Time.deltaTime; _threadSegments[i] = segment; } //CONSTRAINTS for (int i = 0; i < 40; i++) { ApplyConstraints(); } }