Пример #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Heightfield"/> class.
        /// </summary>
        /// <param name="b">The world-space bounds.</param>
        /// <param name="cellSize">The world-space size of each cell in the XZ plane.</param>
        /// <param name="cellHeight">The world-space height of each cell.</param>
        public Heightfield(BBox3 b, float cellSize, float cellHeight)
        {
            if (!BBox3.IsValid(ref bounds))
            {
                throw new ArgumentException("The bounds are considered invalid. See BBox3.IsValid for details.");
            }

            if (cellSize <= 0)
            {
                throw new ArgumentOutOfRangeException("cellSize", "Cell size must be greater than 0.");
            }

            if (cellHeight <= 0)
            {
                throw new ArgumentOutOfRangeException("cellHeight", "Cell height must be greater than 0.");
            }

            this.cellSize   = cellSize;
            this.cellHeight = cellHeight;
            this.bounds     = b;

            //make sure the bbox contains all the possible voxels.
            width  = (int)Math.Ceiling((b.Max.X - b.Min.X) / cellSize);
            height = (int)Math.Ceiling((b.Max.Y - b.Min.Y) / cellHeight);
            length = (int)Math.Ceiling((b.Max.Z - b.Min.Z) / cellSize);

            bounds.Max.X = bounds.Min.X + width * cellSize;
            bounds.Max.Y = bounds.Min.Y + height * cellHeight;
            bounds.Max.Z = bounds.Min.Z + length * cellSize;

            cells = new Cell[width * length];
            for (int i = 0; i < cells.Length; i++)
            {
                cells[i] = new Cell(height);
            }
        }
Пример #2
0
        public void BBoxesForElements()
        {
            Name = nameof(BBoxesForElements);

            var elements = new List <Element>();

            // mass with weird transform
            elements.Add(new Mass(Polygon.Star(5, 3, 5), 1, null, new Transform(new Vector3(4, 3, 2), new Vector3(1, 1, 1))));

            // element instances
            var contentJson = @"
            {
            ""discriminator"": ""Elements.ContentElement"",
            ""gltfLocation"": ""https://hypar-content-catalogs.s3-us-west-2.amazonaws.com/2290ea5e-98aa-429d-8fab-1f260458bf57/Steelcase+-+Convene+-+Conference+Table+Top+-+Boat+Shape+-+Flat+Profile+-+72D+x+216W.glb"",
            ""Bounding Box"": {
                ""discriminator"": ""Elements.Geometry.BBox3"",
                ""Min"": {
                    ""X"": -2.7432066856384281,
                    ""Y"": -0.91380708560943613,
                    ""Z"": 0.68884799709320077
                },
                ""Max"": {
                    ""X"": 2.7432066856384281,
                    ""Y"": 0.91380701293945321,
                    ""Z"": 0.73660002422332771
                }
            },
            ""Gltf Scale to Meters"": 1.0,
            ""SourceDirection"": {
                ""X"": 0.0,
                ""Y"": 1.0,
                ""Z"": 0.0
            },
            ""Transform"": {
                ""Matrix"": {
                    ""Components"": [
                        1.0,
                        0.0,
                        0.0,
                        0.0,
                        0.0,
                        1.0,
                        0.0,
                        0.0,
                        0.0,
                        0.0,
                        1.0,
                        0.0
                    ]
                }
            },
            ""Material"": {
                ""discriminator"": ""Elements.Material"",
                ""Color"": {
                    ""Red"": 1.0,
                    ""Green"": 1.0,
                    ""Blue"": 1.0,
                    ""Alpha"": 1.0
                },
                ""SpecularFactor"": 0.0,
                ""GlossinessFactor"": 0.0,
                ""Unlit"": false,
                ""DoubleSided"": false,
                ""Id"": ""9babb829-9b96-4e73-97f4-9658d4d6c31c"",
                ""Name"": ""default""
            },
            ""Representation"": null,
            ""IsElementDefinition"": true,
            ""Id"": ""8032b381-13c9-4870-803d-c4127c201b47"",
            ""Name"": ""Steelcase - Convene - Conference Table Top - Boat Shape - Flat Profile - 72D x 216W"",
            ""Elevation from Level"": 6.4392935428259079E-14,
            ""Host"": ""Level : Level 1"",
            ""Offset from Host"": 6.4392935428259079E-14,
            ""Moves With Nearby Elements"": 0,
            ""Opaque"": 1
        }";

            var contentElement = JsonConvert.DeserializeObject <ContentElement>(contentJson);

            elements.Add(contentElement.CreateInstance(new Transform(-6, 0, 0), null));
            elements.Add(contentElement.CreateInstance(new Transform(new Vector3(-8, 0, 0), 45), null));

            // mesh
            var meshElem = ConstructExampleMesh();

            elements.Add(meshElem);

            // model curves
            var polygon = new Circle(4).ToPolygon(10).TransformedPolygon(new Transform(new Vector3(8, 8, 8), new Vector3(1, 0, 2)));

            elements.Add(new ModelCurve(polygon));

            // model points
            var random      = new System.Random();
            var points      = Enumerable.Range(0, 20).Select((i) => new Vector3(random.Next(15, 20), random.Next(15, 20), random.Next(15, 20))).ToList();
            var modelPoints = new ModelPoints(points, BuiltInMaterials.XAxis);

            elements.Add(modelPoints);

            // profile
            var profile   = new Profile(new Circle(7).ToPolygon(10).TransformedPolygon(new Transform(new Vector3(8, 8, 8), new Vector3(1, 0, 2))));
            var xzProfile = new Profile(new Circle(7).ToPolygon(10).TransformedPolygon(new Transform(new Vector3(-8, 8, 8), new Vector3(0, 1, 0))));

            elements.Add(profile);
            elements.Add(xzProfile);
            Model.AddElements(profile.ToModelCurves());
            Model.AddElements(xzProfile.ToModelCurves());

            // non-geometric element
            var invalidBBox = new BBox3(new Material("Red", Colors.Red));

            Assert.False(invalidBBox.IsValid());

            Model.AddElements(elements);
            foreach (var element in elements)
            {
                var bbox = new BBox3(element);
                Model.AddElements(bbox.ToModelCurves());
            }
        }