public StaticObject(Model model, ObjectStats.StaticObjectStats staticObjectStats) : base(model, staticObjectStats) { PhysicalTransforms = Matrix.Identity; OOBoundingBox = new OOBoundingBox(new Vector3(0,0,0), new Vector3(0,0,0)); PositionChanged += OnPositionChanged; AngleChanged += OnAngleChanged; }
public Building(Model model, ObjectStats.BuildingStats buildingStats) : base(model, buildingStats) { PhysicalTransforms = Matrix.Identity; Vector3 min = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue); Vector3 max = new Vector3(float.MinValue, float.MinValue, float.MinValue); for (int i = 0; i < Model.Meshes.Count; ++i) { BoundingBox bb; BoundingBoxTools.CalculateBoundingBox(Model.Meshes[i], out bb); if (min.X > bb.Min.X) { min.X = bb.Min.X; } if (min.Y > bb.Min.Y) { min.Y = bb.Min.Y; } if (min.Z > bb.Min.Z) { min.Z = bb.Min.Z; } if (max.X < bb.Max.X) { max.X = bb.Max.X; } if (max.Y < bb.Max.Y) { max.Y = bb.Max.Y; } if (max.Z < bb.Max.Z) { max.Z = bb.Max.Z; } } BoundingBox = new BoundingBox(min, max); OOBoundingBox = new OOBoundingBox(BoundingBox, scale); Length = scale * (BoundingBox.Max.Z - BoundingBox.Min.Z); Width = scale * (BoundingBox.Max.Y - BoundingBox.Min.Y); Height = scale * (BoundingBox.Max.X - BoundingBox.Min.X); PhysicalTransforms = Matrix.Identity; PositionChanged += OnPositionChanged; AngleChanged += OnAngleChanged; }
/// <summary> /// Sprawdza, czy dwa OOBoundingBox'y koliduja. /// </summary> /// <param name="boundingBox">OOBoundingBox, kolizja z ktorym jest sprawdzana</param> /// <returns></returns> public bool Intersects(OOBoundingBox boundingBox) { if (AxisOverlap(NormalX, boundingBox)) return true; if (AxisOverlap(NormalY, boundingBox)) return true; if (AxisOverlap(NormalZ, boundingBox)) return true; if (AxisOverlap(Vector3.Cross(NormalX, boundingBox.NormalX), boundingBox)) return true; if (AxisOverlap(Vector3.Cross(NormalX, boundingBox.NormalY), boundingBox)) return true; if (AxisOverlap(Vector3.Cross(NormalX, boundingBox.NormalZ), boundingBox)) return true; if (AxisOverlap(Vector3.Cross(NormalY, boundingBox.NormalX), boundingBox)) return true; if (AxisOverlap(Vector3.Cross(NormalY, boundingBox.NormalY), boundingBox)) return true; if (AxisOverlap(Vector3.Cross(NormalY, boundingBox.NormalZ), boundingBox)) return true; if (AxisOverlap(Vector3.Cross(NormalZ, boundingBox.NormalX), boundingBox)) return true; if (AxisOverlap(Vector3.Cross(NormalZ, boundingBox.NormalY), boundingBox)) return true; if (AxisOverlap(Vector3.Cross(NormalZ, boundingBox.NormalZ), boundingBox)) return true; return false; }
private bool AxisOverlap(Vector3 Axis, OOBoundingBox boundingBox) { float min0, max0; float min1, max1; ComputeSpan(Axis, out min0, out max0); boundingBox.ComputeSpan(Axis, out min1, out max1); return SpanOverlap(min0, max0, min1, max1); }