private void CreateChildren() { var sizeOver2 = _size / 2f; var sizeOver4 = _size / 4f; _nodeUFR = new Octree(_center + new Vector3(sizeOver4, sizeOver4, -sizeOver4), sizeOver2, this); _nodeUFL = new Octree(_center + new Vector3(-sizeOver4, sizeOver4, -sizeOver4), sizeOver2, this); _nodeUBR = new Octree(_center + new Vector3(sizeOver4, sizeOver4, sizeOver4), sizeOver2, this); _nodeUBL = new Octree(_center + new Vector3(-sizeOver4, sizeOver4, sizeOver4), sizeOver2, this); _nodeDFR = new Octree(_center + new Vector3(sizeOver4, -sizeOver4, -sizeOver4), sizeOver2, this); _nodeDFL = new Octree(_center + new Vector3(-sizeOver4, -sizeOver4, -sizeOver4), sizeOver2, this); _nodeDBR = new Octree(_center + new Vector3(sizeOver4, -sizeOver4, sizeOver4), sizeOver2, this); _nodeDBL = new Octree(_center + new Vector3(-sizeOver4, -sizeOver4, sizeOver4), sizeOver2, this); _children.Add(_nodeUFR); _children.Add(_nodeUFL); _children.Add(_nodeUBR); _children.Add(_nodeUBL); _children.Add(_nodeDFR); _children.Add(_nodeDFL); _children.Add(_nodeDBR); _children.Add(_nodeDBL); }
private OctreeQueryResult GetOctreeQueryResult(Octree octree, BoundingFrustum boundingFrustum, Vector3 camPosition) { if (!octree._bbox.HasValue) { return(OctreeQueryResult.NotVisible); } if (!boundingFrustum.Intersects(octree._bbox.Value)) { return(OctreeQueryResult.NotVisible); } var bbox = octree._bbox.Value; if (bbox.Contains(camPosition) == ContainmentType.Contains) { return(OctreeQueryResult.FullDetail); } var center = (bbox.Max - bbox.Min) / 2 + bbox.Min; var v = camPosition - center; var abs = new Vector3(Math.Abs(v.X), Math.Abs(v.Y), Math.Abs(v.Z)); var point = center + ((v / abs) * (_size / 2)); //var dist = Vector2.Distance(new Vector2(point.X, point.Z), new Vector2(camPosition.X, camPosition.Z));//Vector3.Distance(point, camPosition); var dist = Vector3.Distance(point, camPosition); if (dist < EngineSettings.Instance.LevelOfDetailDistance * EngineSettings.Instance.ViewDistance) { return(OctreeQueryResult.FullDetail); } if (dist < EngineSettings.Instance.ViewDistance) { return(OctreeQueryResult.LevelOfDetail); } return(OctreeQueryResult.NotVisible); }