Beispiel #1
0
    Vector3 CalculateSceneAvoidanceForce(FeelerInfo info)
    {
        Vector3 force = Vector3.zero;

        Vector3 fromTarget = fromTarget = transform.position - info.point;
        float   dist       = Vector3.Distance(transform.position, info.point);

        switch (forceType)
        {
        case ForceType.normal:
            force = info.normal * (forwardFeelerDepth * scale / dist);
            break;

        case ForceType.incident:
            fromTarget.Normalize();
            force -= Vector3.Reflect(fromTarget, info.normal) * (forwardFeelerDepth / dist);
            break;

        case ForceType.up:
            force += Vector3.up * (forwardFeelerDepth * scale / dist);
            break;

        case ForceType.braking:
            force += fromTarget * (forwardFeelerDepth / dist);
            break;
        }
        return(force);
    }
        void UpdateFeeler(int feelerNum, Quaternion localRotation, float baseDepth, FeelerInfo.FeelerType feelerType)
        {
            Vector3    direction = localRotation * transform.rotation * Vector3.forward;
            float      depth     = baseDepth + ((boid.velocity.magnitude / boid.maxSpeed) * baseDepth);
            RaycastHit info;
            bool       collided  = Physics.SphereCast(transform.position, feelerRadius, direction, out info, depth, mask.value);
            Vector3    feelerEnd = collided ? info.point : (transform.position + direction * depth);

            feelers[feelerNum] = new FeelerInfo(feelerEnd, info.normal, collided, feelerType);
        }
 public override Vector3 Calculate()
 {
     force = Vector3.zero;
     for (int i = 0; i < feelers.Length; i++)
     {
         FeelerInfo info = feelers[i];
         if (info.collided)
         {
             force += CalculateSceneAvoidanceForce(info);
         }
     }
     return(force);
 }
Beispiel #4
0
    System.Collections.IEnumerator UpdateFrontFeelers()
    {
        yield return(new WaitForSeconds(Random.Range(0.0f, 0.5f)));

        while (true)
        {
            RaycastHit info;
            float      forwardFeelerDepth = this.forwardFeelerDepth + ((boid.velocity.magnitude / boid.maxSpeed) * this.forwardFeelerDepth);

            // Forward feeler
            //int mask.value = 1 << 9;
            bool collided = Physics.SphereCast(transform.position, feelerRadius, boid.TransformDirection(Vector3.forward), out info, forwardFeelerDepth, mask.value);
            feelers[0] = new FeelerInfo(info.point, info.normal
                                        , collided, FeelerInfo.FeeelerType.front);
            yield return(new WaitForSeconds(1.0f / frontFeelerUpdatesPerSecond));
        }
    }
Beispiel #5
0
    System.Collections.IEnumerator UpdateSideFeelers()
    {
        yield return(new WaitForSeconds(Random.Range(0.0f, 0.5f)));

        while (true)
        {
            Vector3    feelerDirection;
            RaycastHit info;
            bool       collided;

            float sideFeelerDepth = this.sideFeelerDepth + ((boid.velocity.magnitude / boid.maxSpeed) * this.sideFeelerDepth);


            // Left feeler
            feelerDirection = Vector3.forward;
            feelerDirection = Quaternion.AngleAxis(-45, Vector3.up) * feelerDirection;
            collided        = Physics.SphereCast(transform.position, feelerRadius, transform.TransformDirection(feelerDirection), out info, sideFeelerDepth, mask.value);
            feelers[1]      = new FeelerInfo(info.point, info.normal,
                                             collided, FeelerInfo.FeeelerType.side);

            // Right feeler
            feelerDirection = Vector3.forward;
            feelerDirection = Quaternion.AngleAxis(-45, Vector3.up) * feelerDirection;
            collided        = Physics.SphereCast(transform.position, 2, transform.TransformDirection(feelerDirection), out info, sideFeelerDepth, mask.value);
            feelers[2]      = new FeelerInfo(info.point, info.normal
                                             , collided, FeelerInfo.FeeelerType.side);

            // Up feeler
            feelerDirection = Vector3.forward;
            feelerDirection = Quaternion.AngleAxis(45, Vector3.right) * feelerDirection;
            collided        = Physics.SphereCast(transform.position, 2, transform.TransformDirection(feelerDirection), out info, sideFeelerDepth, mask.value);
            feelers[3]      = new FeelerInfo(info.point, info.normal
                                             , collided, FeelerInfo.FeeelerType.side);

            // Down feeler
            feelerDirection = Vector3.forward;
            feelerDirection = Quaternion.AngleAxis(-45, Vector3.right) * feelerDirection;
            collided        = Physics.SphereCast(transform.position, 2, transform.TransformDirection(feelerDirection), out info, sideFeelerDepth, mask.value);
            feelers[4]      = new FeelerInfo(info.point, info.normal
                                             , collided, FeelerInfo.FeeelerType.side);
            yield return(new WaitForSeconds(1.0f / sideFeelerUpdatesPerSecond));
        }
    }