Example #1
0
    /// <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;
    }
Example #2
0
    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);
        }
    }
Example #3
0
    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();
        }
    }