예제 #1
0
        //boid rule 2 - move away from things
        public Vector3 Rule2Vector(CubeBoid boid)
        {
            GetBasicRuleVector(crowdingRule, boid);
            GetBoidRuleVector(crowdingRule, boid);

            crowdingRule.vector = crowdingRule.boidAwayVector + crowdingRule.wallAwayVector;

            return(crowdingRule.vector * crowdingRule.weight);
        }
예제 #2
0
        public Vector3 GetMovementVector(CubeBoid boid)
        {
            Vector3 result = Rule1Vector(boid) + Rule2Vector(boid) + Rule3Vector(boid) + Rule4Vector(boid) + Rule5Vector(boid);

            centerOfMassRule.vector     = Vector3.zero;
            crowdingRule.vector         = Vector3.zero;
            flockingRule.vector         = Vector3.zero;
            crowdingRule.boidAwayVector = Vector3.zero;
            crowdingRule.wallAwayVector = Vector3.zero;
            return(result);
        }
예제 #3
0
        Vector3 GetBoidRuleVector(Rule rule, CubeBoid boid)
        {
            if (!boid.rule3Dirty)
            {
                return(rule.vector);
            }

            UpdateRules(boid, boid.CubeSwarm);
            boid.rule3Dirty = false;

            return(rule.vector);
        }
예제 #4
0
        void UpdateRules(CubeBoid boid, List <Collider> swarm)
        {
            if (swarm.Count <= 0)
            {
                return;
            }

            Vector3 pos = boid._transform.localPosition;

            pos.y = 0f;

            //rule vectors
            Vector3 awayDir = Vector3.zero;
            float   c       = 0;

            for (int i = 0; i < swarm.Count; ++i)
            {
                if (swarm[i] == null)
                {
                    continue;
                }

                Vector3 boundsPoint = swarm[i].ClosestPointOnBounds(pos);
                boundsPoint.y = 0f;

                //calculate rule 2
                Vector3 diff = boundsPoint - pos;
                float   dist = diff.magnitude;

                if (dist < crowdingRule.minWallDistance)
                {
                    float normalizedAwayPower = Mathf.Clamp01(dist / crowdingRule.minWallDistance);

                    float awayPower = crowdingRule.wallAwayDistancePower.Evaluate(normalizedAwayPower);

                    awayDir = awayDir - diff * awayPower;
                }

                c += 1f;
            }

            //finalize rule 2
            crowdingRule.wallAwayVector = awayDir * crowdingRule.wallAwayWeight;
        }
예제 #5
0
 public Vector3 Rule5Vector(CubeBoid boid)
 {
     return((focusLocationRule.vector - boid._transform.localPosition) * focusLocationRule.weight);
 }
예제 #6
0
 public Vector3 Rule4Vector(CubeBoid boid)
 {
     return(forceRule.vector * forceRule.weight);
 }
예제 #7
0
 public Vector3 Rule3Vector(CubeBoid boid)
 {
     return(GetBoidRuleVector(flockingRule, boid));
 }
예제 #8
0
 //boid rule 1 - move towards center of 'mass'
 public Vector3 Rule1Vector(CubeBoid boid)
 {
     return(GetBoidRuleVector(centerOfMassRule, boid));
 }
예제 #9
0
 public float FlockRadius(CubeBoid boid)
 {
     return(boid.swarmDetectionArea.radius * 1.5f);
 }
예제 #10
0
        void UpdateRules(CubeBoid boid, List <CubeBoid> swarm)
        {
            if (swarm.Count <= 0)
            {
                //finalize rule 1
                //centerOfMassRule.vector = nv.Dev.VectorXZ( -boid._transform.localPosition ).normalized;
                //finalize rule 3
                flockingRule.vector = Vector3.zero;
                return;
            }

            Vector3 pos = boid._transform.localPosition;

            pos.y = 0f;

            Vector3 awayDir     = Vector3.zero;
            Vector3 positionSum = Vector3.zero;
            Vector3 velocitySum = Vector3.zero;
            float   vc          = 0;
            float   pc          = 0;

            for (int i = 0; i < swarm.Count; ++i)
            {
                if (swarm[i] == null)
                {
                    continue;
                }

                //Vector3 boundsPoint = swarm[i].boidCollider.ClosestPointOnBounds(pos);
                Vector3 boundsPoint = swarm[i]._transform.localPosition;
                boundsPoint.y = 0f;

                //calculate rule 2
                Vector3 diff = boundsPoint - pos;
                float   dist = diff.magnitude;

                if (dist < crowdingRule.minBoidDistance)
                {
                    float normalizedAwayPower = Mathf.Clamp01(dist / crowdingRule.minBoidDistance);

                    float awayPower = crowdingRule.boidAwayDistancePower.Evaluate(normalizedAwayPower);

                    awayDir = awayDir - diff * awayPower;
                }

                if (dist < FlockRadius(boid))
                {
                    //calculate for rule 1
                    positionSum += swarm[i]._transform.localPosition;
                    pc          += 1f;

                    //calculate for rule 3
                    Rigidbody body = swarm[i].body;
                    if (body != null)
                    {
                        velocitySum += body.velocity;
                        vc          += 1f;
                    }
                }
            }

            positionSum.y = 0f;
            velocitySum.y = 0f;

            Vector3 boidPos = pos;

            //finalize rule 1
            centerOfMassRule.vector = ((positionSum / pc) - boidPos) * centerOfMassRule.weight;

            //finalize rule 2
            crowdingRule.boidAwayVector = awayDir * crowdingRule.boidAwayWeight;

            //finalize rule 3
            flockingRule.vector = ((velocitySum / vc)) * flockingRule.weight;
        }
예제 #11
0
파일: CubeBoid.cs 프로젝트: Kerr1291/common
        void CleanSwarmObjects()
        {
            if (!swarmDirty)
            {
                return;
            }

            List <Collider> cleanSwarm     = new List <Collider>();
            List <CubeBoid> cleanCubeSwarm = new List <CubeBoid>();

            Vector3 pos = _transform.localPosition;

            pos.y = 0f;

            for (int i = 0; i < swarm.Count; ++i)
            {
                if (swarm[i] == null)
                {
                    continue;
                }

                //K2.Tools.LogVar( pos );
                //K2.Tools.LogVar( swarm[ i ].transform.localPosition );
                Vector3 diff = swarm[i].transform.localPosition - pos;
                diff.y = 0f;
                //K2.Tools.LogVar( diff );
                float dist = diff.magnitude;

                //K2.Tools.LogVar( dist );
                //K2.Tools.LogVar( rules.FlockRadius( this ) );
                if (dist > rules.FlockRadius(this))
                {
                    continue;
                }

                //K2.Tools.Log( "adding" );
                CubeBoid cube = swarm[i].GetComponentInChildren <CubeBoid>();

                if (cube == null)
                {
                    cleanSwarm.Add(swarm[i]);
                }
                else
                {
                    if (cube.gameObject.tag != body.gameObject.tag)
                    {
                        cleanSwarm.Add(swarm[i]);
                        continue;
                    }

                    cleanCubeSwarm.Add(cube);
                }
            }

            swarm = cleanSwarm;

            for (int i = 0; i < cubeswarm.Count; ++i)
            {
                if (cubeswarm[i] == null)
                {
                    continue;
                }

                Vector3 diff = cubeswarm[i]._transform.localPosition - pos;
                diff.y = 0f;
                float dist = diff.magnitude;
                if (dist > rules.FlockRadius(this))
                {
                    continue;
                }

                cleanCubeSwarm.Add(cubeswarm[i]);
            }

            cubeswarm = cleanCubeSwarm;

            ////trim all non-null, "nearby" things
            //swarm = swarm.Select( x => x ).Where( x =>
            //{
            //    if( x != null )
            //    {
            //        return true;
            //    }
            //    return false;
            //}
            //).ToList();

            //cubeswarm = swarm.Select( x =>  ).Where( x => x != null ).ToList();
            swarmDirty = false;
        }