예제 #1
0
        public ExplodingMesh(MeshGeometry3D inputMesh, Point3D hitpos)
        {
            var mesh = MeshGeometryHelper.NoSharedVertices(inputMesh);

            double cx, cy, cz;

            cx = cy = cz = 0;
            for (int i = 0; i < mesh.Positions.Count; i++)
            {
                cx += mesh.Positions[i].X;
                cy += mesh.Positions[i].Y;
                cz += mesh.Positions[i].Z;
            }
            int n      = mesh.Positions.Count;
            var center = new Point3D(cx / n, cy / n, cz / n);

            integrator = new VerletIntegrator();
            integrator.Resize(mesh.Positions.Count);
            var r = new Random();

            for (int i = 0; i < mesh.Positions.Count; i++)
            {
                var delta = mesh.Positions[i] - center;
                delta.Normalize();
                integrator.Positions[i]     = mesh.Positions[i] + delta * (1 + r.NextDouble() * 2);
                integrator.Positions0[i]    = mesh.Positions[i];
                integrator.Accelerations[i] = new Vector3D(0, 0, -1000);
                integrator.InverseMass[i]   = 0.01;
            }

            integrator.CreateConstraintsByMesh(mesh, 0.7);
            integrator.AddFloor(0.3);
            this.Mesh = mesh;
            watch.Start();
        }
예제 #2
0
        public ExplodingMesh(MeshGeometry3D inputMesh, Point3D hitpos)
        {
            var mesh = MeshGeometryHelper.NoSharedVertices(inputMesh);

            double cx, cy, cz;
            cx = cy = cz = 0;
            for (int i = 0; i < mesh.Positions.Count; i++)
            {
                cx += mesh.Positions[i].X;
                cy += mesh.Positions[i].Y;
                cz += mesh.Positions[i].Z;
            }
            int n = mesh.Positions.Count;
            var center = new Point3D(cx / n, cy / n, cz / n);

            integrator = new VerletIntegrator();
            integrator.Resize(mesh.Positions.Count);
            var r = new Random();
            for (int i = 0; i < mesh.Positions.Count; i++)
            {
                var delta = mesh.Positions[i] - center;
                delta.Normalize();
                integrator.Positions[i] = mesh.Positions[i] + delta * (1 + r.NextDouble() * 2);
                integrator.Positions0[i] = mesh.Positions[i];
                integrator.Accelerations[i] = new Vector3D(0, 0, -1000);
                integrator.InverseMass[i] = 0.01;
            }

            integrator.CreateConstraintsByMesh(mesh, 0.7);
            integrator.AddFloor(0.3);
            this.Mesh = mesh;
            watch.Start();
        }
예제 #3
0
 public Flag(string image)
 {
     Mesh = new MeshGeometry3D();
     Material = MaterialHelper.CreateImageMaterial(image);
     Damping = 0.98;
     integrator = new VerletIntegrator() { Iterations = 4, Damping = this.Damping };
     WindSpeed = 6;
     WindDirection = 180;
     PoleHeight = 12;
     Height = 3;
     Length = 4;
     Mass = 0.8;
 }
예제 #4
0
파일: Flag.cs 프로젝트: momogarys/CS1052
 public Flag(string image)
 {
     Mesh       = new MeshGeometry3D();
     Material   = MaterialHelper.CreateImageMaterial(image);
     Damping    = 0.98;
     integrator = new VerletIntegrator()
     {
         Iterations = 4, Damping = this.Damping
     };
     WindSpeed     = 6;
     WindDirection = 180;
     PoleHeight    = 12;
     Height        = 3;
     Length        = 4;
     Mass          = 0.8;
 }
예제 #5
0
        public MainViewModel(MainWindow mainWindow)
        {
            // TODO: Complete member initialization
            this.mainWindow = mainWindow;

            Model3DGroup modelGroup = new Model3DGroup();

            TubeVisual3D      tube1     = GenerateTube();
            RectangleVisual3D rectangle = GenerateRectangle();
            SphereVisual3D    sphere    = new SphereVisual3D()
            {
                Center = new Point3D(1.5, 2.5, -0.7), Radius = 2
            };

            //modelGroup.Children.Add(tube1.Model);
            //modelGroup.Children.Add(rectangle.Model);
            //modelGroup.Children.Add(sphere.Model);

            /*
             *
             * Point3D point;
             * Point3D point2;
             * Point3D point3;
             * Point3D point4;
             * AddElementsPart2(modelGroup, out point, out point2, out point3, out point4);
             *
             *
             * TubeVisual3D path = new TubeVisual3D()
             * {
             *  Path =  new Point3DCollection(new List<Point3D>(){
             *  point + new Vector3D(0, 0, 20),
             *  point2 + new Vector3D(0, 0, 19),
             *  point3 + new Vector3D(0, 0, 18),
             *  point4 + new Vector3D(0, 0, 17)
             *  }),
             *  Diameter = 0.5,
             *  ThetaDiv = 20,
             *  IsPathClosed = false,
             *  Fill = Brushes.Green
             *  //Fill = new Brush() { Colors.Blue}
             * };
             *
             * modelGroup.Children.Add(path.Content);
             *
             */
            //AddSolidBox(modelGroup);

            //AddRevolved(modelGroup);



            HelixVisual3D helixItem = new HelixVisual3D();

            helixItem.Fill     = new SolidColorBrush(Colors.Violet);
            helixItem.Origin   = new Point3D(0, 0, -0.45);
            helixItem.Diameter = 0.1;
            helixItem.Turns    = 2;
            helixItem.Length   = 0.9;
            helixItem.Radius   = 0.35;

            //modelGroup.Children.Add(helixItem.Content);
            //modelGroup.Children.Add(box.Content);


            //<helix:HelixVisual3D
            //Origin="0 0 -0.45"
            //Diameter="0.1"
            //Turns="2"
            //Length="0.9"
            //Radius="0.35"
            //Fill="Violet"
            //Visible="{Binding IsChecked, ElementName=HelixVisible}"/>


            numberOfPoints = 100;

            // wireLines = new WireLines { Color = Colors.Black, Thickness = 3,  };
            Points = new Point3DCollection(GeneratePoints(numberOfPoints, 7000 * 0.001));
            //wireLines.Lines = Points;


            //modelGroup.Children.Add(wireLines.Content);


            var y0          = 0d;
            var theta       = Math.PI / 180 * 30;
            var roofBuilder = new MeshBuilder(false, false);
            var y1          = y0 + Math.Tan(theta) * 5 / 2;
            var p0          = new Point(0, y1);
            var p1          = new Point(5 / 2 + 0.2 * Math.Cos(theta), y0 - 0.2 * Math.Sin(theta));
            var p2          = new Point(p1.X + 0.1 * Math.Sin(theta), p1.Y + 0.1 * Math.Cos(theta));
            var p3          = new Point(0, y1 + 0.1 / Math.Cos(theta));
            var p4          = new Point(-p2.X, p2.Y);
            var p5          = new Point(-p1.X, p1.Y);


            IList <Point> roofSection = new List <Point>()
            {
                p0, p1, p1, p2, p2, p3, p3, p4, p4, p5, p5, p0
            };
            var roofAxisX  = new Vector3D(0, -1, 0);
            var roofAxisY  = new Vector3D(0, 0, 1);
            var roofOrigin = new Point3D(1, 1, 1);
            //roofBuilder.AddPolygon(roofSection, roofAxisX, roofAxisY, roofOrigin);


            Point3DCollection simplePoly = new System.Windows.Media.Media3D.Point3DCollection(
                new List <Point3D>()
            {
                new Point3D(1, 0, 1),
                new Point3D(1, 1, 1),
                new Point3D(0, 1, 1),
                new Point3D(0, 0, 1),

                /*
                 * //new Point3D(1,0, 1),
                 * new Point3D(0,0, -1),
                 * new Point3D(1,0, -1),
                 * new Point3D(1,1, -1),
                 * new Point3D(0,1, -1),
                 * //new Point3D(1,0, 1),
                 * new Point3D(0,0, -1),
                 * new Point3D(0,0, 1),
                 */
            }
                );


            roofBuilder.AddPolygon(simplePoly);

            //roofBuilder.AddRectangularMesh()

            GeometryModel3D roofGeometry = new GeometryModel3D();

            //var material = MaterialHelper.CreateMaterial(Brushes.LightBlue, ambient: 77, freeze: false);
            var material = MaterialHelper.CreateMaterial(Colors.LawnGreen, 0.25);


            roofGeometry.Material     = material;
            roofGeometry.BackMaterial = material;

            roofGeometry.Geometry = roofBuilder.ToMesh(true);
            modelGroup.Children.Add(roofGeometry);



            //ScreenSpaceLines3D Wireframe = new ScreenSpaceLines3D();

            //Wireframe.Thickness = 2;
            //Wireframe.Color = Colors.Black;
            //Wireframe.Points = simplePoly;
            ////Wireframe.MakeWireframe(roofGeometry);
            //modelGroup.Children.Add(Wireframe.Content);



            var Mesh = new MeshGeometry3D();
            //var Material = MaterialHelper.CreateImageMaterial(image);
            var Damping    = 0.98;
            var integrator = new VerletIntegrator()
            {
                Iterations = 4, Damping = 0.98
            };
            var WindSpeed     = 6;
            var WindDirection = 180;
            var PoleHeight    = 12;
            var Height        = 3;
            var Length        = 4;
            var Mass          = 0.8;
            var m             = 48;
            var n             = 32;

            var pts = new Point3D[n, m];

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    pts[i, j] = new Point3D(-Length * j / (m - 1), 0, PoleHeight - Height * i / (n - 1));
                }
            }


            var pts2 = new Point3D[2, 4];

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    double x = 0, z = 0;
                    if (i == 0)
                    {
                        x = 0; z = 0;
                    }
                    if (i == 1)
                    {
                        x = 1; z = 0;
                    }
                    if (i == 2)
                    {
                        x = 1; z = 1;
                    }
                    if (i == 3)
                    {
                        x = 0; z = 1;
                    }

                    pts[i, j] = new Point3D(x, i, PoleHeight - z);
                }
            }


            var mb = new MeshBuilder(false, true);

            //mb.AddRectangularMesh(pts, null, false, false);
            mb.AddRectangularMesh(pts, null, false, false);
            Mesh = mb.ToMesh();

            var gradientMaterial = CreateGradientBrushMaterial();


            gradientMaterial = MaterialHelper.CreateMaterial(Colors.LightBlue, 0.25);


            GeometryModel3D meshGeometry = new GeometryModel3D();

            meshGeometry.Geometry     = Mesh;
            meshGeometry.Material     = gradientMaterial;
            meshGeometry.BackMaterial = gradientMaterial;
            modelGroup.Children.Add(meshGeometry);


            this.Model = modelGroup;
        }