public ObstructionType Obstructs(BoundingBox box) { if (!bbox.Intersects(box)) { return(ObstructionType.None); } foreach (Structure h in Structures) { ObstructionType t = h.Obstructs(box); if (t != ObstructionType.None) { return(t); } } foreach (Road r in Roads) { Vector3 d = r.B - r.A; d.Normalize(); Ray ray = new Ray(r.A, d); float?f = ray.Intersects(box); if (f.HasValue && f.Value < Vector3.Distance(r.A, r.B)) { return(ObstructionType.Virtual); } } return(ObstructionType.None); }
public ObstructionType Obstructs(BoundingBox box, Matrix transform) { foreach (Structure h in Structures) { ObstructionType t = h.Obstructs(box, transform); if (t != ObstructionType.None) { return(t); } } foreach (Road r in Roads) { Vector3 a = Vector3.Transform(r.A, Matrix.Invert(transform)); Vector3 b = Vector3.Transform(r.B, Matrix.Invert(transform)); Vector3 d = b - a; d.Normalize(); Ray ray = new Ray(r.A, d); float?f = ray.Intersects(box); if (f.HasValue && f.Value < Vector3.Distance(r.A, r.B)) { return(ObstructionType.Virtual); } } return(ObstructionType.None); }
public void GetObstruction() { Collider[] hits = Physics.OverlapBox(transform.position + Vector3.up, Vector3.one * 0.25f, Quaternion.identity, obstructionMask); if (hits.Length > 1) { Debug.LogError("Reduce extents or check tile: Too many obstructions"); return; } obstructionOBJ = hits[0].gameObject; obstructionOBJ.transform.parent = this.transform; obstruction = ObstructionType.SomethingToBeAdded; }
public ObstructionType Obstructs(Vector3 point) { if (bbox.Contains(point) != ContainmentType.Contains) { return(ObstructionType.None); } foreach (Structure s in Structures) { ObstructionType t = s.Obstructs(point); if (t != ObstructionType.None) { return(t); } } foreach (Road r in Roads) { Vector3 mid = (r.A + r.B) * .5f; float d = Vector3.Distance(r.B, r.A); BoundingBox bbox = new BoundingBox(new Vector3(-2, -1, -d / 2), new Vector3(2, 1, d / 2)); Vector3 dir = r.B - r.A; dir.Normalize(); Vector3 fxz = r.B - r.A; fxz.Y = 0; fxz.Normalize(); Vector3 right = Vector3.Cross(Vector3.Up, fxz); Vector3 up = Vector3.Cross(right, dir); Matrix rot = Matrix.CreateWorld(Vector3.Zero, dir, up); Vector3 p2 = Vector3.Transform(point, Matrix.CreateTranslation(-mid) * Matrix.Invert(rot) * Matrix.CreateTranslation(mid)); if (bbox.Contains(p2) != ContainmentType.Disjoint) { return(ObstructionType.Virtual); } } return(ObstructionType.None); }