//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); }
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); }
Vector3 GetBoidRuleVector(Rule rule, CubeBoid boid) { if (!boid.rule3Dirty) { return(rule.vector); } UpdateRules(boid, boid.CubeSwarm); boid.rule3Dirty = false; return(rule.vector); }
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; }
public Vector3 Rule5Vector(CubeBoid boid) { return((focusLocationRule.vector - boid._transform.localPosition) * focusLocationRule.weight); }
public Vector3 Rule4Vector(CubeBoid boid) { return(forceRule.vector * forceRule.weight); }
public Vector3 Rule3Vector(CubeBoid boid) { return(GetBoidRuleVector(flockingRule, boid)); }
//boid rule 1 - move towards center of 'mass' public Vector3 Rule1Vector(CubeBoid boid) { return(GetBoidRuleVector(centerOfMassRule, boid)); }
public float FlockRadius(CubeBoid boid) { return(boid.swarmDetectionArea.radius * 1.5f); }
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; }
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; }