Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }