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); }
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)); } }
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)); } }