Example #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();
        }
Example #2
0
        /// <summary>
        /// Calculates the texture for the specified model.
        /// </summary>
        /// <param name="model">
        /// The model.
        /// </param>
        /// <param name="mesh">
        /// The mesh.
        /// </param>
        public override void Calculate(TerrainModel model, MeshGeometry3D mesh)
        {
            var normals   = MeshGeometryHelper.CalculateNormals(mesh);
            var texcoords = new PointCollection();
            var up        = new Vector3D(0, 0, 1);

            for (int i = 0; i < normals.Count; i++)
            {
                double slope = Math.Acos(Vector3D.DotProduct(normals[i], up)) * 180 / Math.PI;
                double u     = slope / 40;
                if (u > 1)
                {
                    u = 1;
                }

                if (u < 0)
                {
                    u = 0;
                }

                texcoords.Add(new Point(u, u));
            }

            this.TextureCoordinates = texcoords;
            this.Material           = MaterialHelper.CreateMaterial(this.Brush);
        }
Example #3
0
        public static Dictionary <Int32, SmileEdge> findNeighbours(MeshGeometry3D mesh)
        {
            Int32Collection edges     = MeshGeometryHelper.FindEdges(mesh);
            Int32Collection triangles = mesh.TriangleIndices;

            Dictionary <Int32, SmileEdge> l = new Dictionary <Int32, SmileEdge>();

            for (int j = 0; j < triangles.Count; j++)
            {
                SmileEdge v = new SmileEdge();
                v.me = triangles[j];
                for (int i = 1; i < edges.Count; i += 2)
                {
                    if (edges[i - 1] == triangles[j])
                    {
                        v.neighbours.Add(edges[i]);
                    }
                    else
                    if (edges[i] == triangles[j])
                    {
                        v.neighbours.Add(edges[i - 1]);
                    }
                }
                if (!l.ContainsKey(v.me))
                {
                    l.Add(v.me, v);
                }
            }
            return(l);
        }
Example #4
0
        public void Cut(Point3D position, Vector3D normal)
        {
            MeshGeometry3D worldMesh = ToWorldMesh();
            var            geo       = MeshGeometryHelper.Cut(worldMesh, position, normal);
            MeshGeometry3D localMesh = ToLocalMesh(geo);

            //MeshGeometry3D localMesh = geo;
            if (this.Content is Model3DGroup)
            {
                Model3DGroup    g  = (Model3DGroup)this.Content;
                GeometryModel3D gm = (GeometryModel3D)g.Children[0];

                Model3DGroup gr = new Model3DGroup();
                var          m  = new GeometryModel3D(localMesh, gm.Material);
                m.BackMaterial = MaterialHelper.CreateMaterial(Brushes.Black);

                gr.Children.Add(m);
                this.Content = gr;
            }
            else
            {
                GeometryModel3D gm = (GeometryModel3D)this.Content;
                var             m  = new GeometryModel3D(localMesh, gm.Material);
                m.BackMaterial = MaterialHelper.CreateMaterial(Brushes.Black);
                this.Content   = m;
            }
        }
Example #5
0
        public static ModelVisual3D AddContours(Visual3D model1, int d1, int d2, int d3, double diameter = 0.5)
        {
            var     ContourModel = new ModelVisual3D();
            Plane3D ContourPlane = null;
            Action <GeometryModel3D, Transform3D> AddContours = (model, transform) =>
            {
                var p        = ContourPlane.Position;
                var n        = ContourPlane.Normal;
                var segments = MeshGeometryHelper
                               .GetContourSegments(model.Geometry as MeshGeometry3D, p, n).ToList();
                var contours = MeshGeometryHelper.CombineSegments(segments, 1e-6).ToList();
                foreach (var contour in contours)
                {
                    if (contour.Count == 0)
                    {
                        continue;
                    }
                    ContourModel.Children.Add(new TubeVisual3D {
                        Diameter = diameter,
                        Path     = new Point3DCollection(contour),
                        Fill     = Brushes.White, ThetaDiv = 4
                    });
                }
            };
            var bounds = Visual3DHelper.FindBounds(model1, Transform3D.Identity);

            for (int i = 1; i < d3; i++)
            {
                ContourPlane = new Plane3D(
                    new Point3D(0, 0, bounds.Location.Z + bounds.Size.Z * i / d3),
                    new Vector3D(0, 0, 1));
                Visual3DHelper.Traverse <GeometryModel3D>(model1, AddContours);
            }
            for (int i = 1; i < d2; i++)
            {
                ContourPlane = new Plane3D(
                    new Point3D(0, bounds.Location.Y + bounds.Size.Y * i / d2, 0),
                    new Vector3D(0, 1, 0));
                Visual3DHelper.Traverse <GeometryModel3D>(model1, AddContours);
            }
            for (int i = 1; i < d1; i++)
            {
                ContourPlane = new Plane3D(
                    new Point3D(bounds.Location.X + bounds.Size.X * i / d1, 0, 0),
                    new Vector3D(1, 0, 0));
                Visual3DHelper.Traverse <GeometryModel3D>(model1, AddContours);
            }
            return(ContourModel);
        }
Example #6
0
        private void AddContours(GeometryModel3D model, Transform3D transform)
        {
            var p        = ContourPlane.Position;
            var n        = ContourPlane.Normal;
            var segments = MeshGeometryHelper.GetContourSegments(model.Geometry as MeshGeometry3D, p, n).ToList();

            foreach (var contour in MeshGeometryHelper.CombineSegments(segments, 1e-6).ToList())
            {
                if (contour.Count == 0)
                {
                    continue;
                }
                view2.Children.Add(new TubeVisual3D {
                    Diameter = 0.03, Path = new Point3DCollection(contour), Fill = Brushes.Green
                });
            }
        }
Example #7
0
        internal List <GeometryModel3D> manualSegment(Point3DCollection points, Vector3DCollection vectors)
        {
            List <GeometryModel3D> models = new List <GeometryModel3D>();
            //MeshGeometry3D worldMesh = GetMesh();//ToWorldMesh();
            MeshGeometry3D worldMesh = ToWorldMesh();

            for (var i = 1; i < points.Count; i++)
            {
                Point3D  p0 = points[i - 1];
                Vector3D n0 = vectors[i - 1];
                Point3D  pi = points[i];
                Vector3D ni = vectors[i];

                Point3D  pp = new Point3D(0, 0, 0);
                Vector3D nn = Point3D.Subtract(p0, pp);
                if (i == 1)
                {
                    nn = Point3D.Subtract(pi, pp);
                }
                var g1 = MeshGeometryHelper.Cut(worldMesh, pp, nn);
                this.Children.Add(new RectangleVisual3D {
                    Origin = ToLocal(pp), Normal = nn, Fill = new SolidColorBrush(Colors.LightGoldenrodYellow), BackMaterial = MaterialHelper.CreateMaterial(new SolidColorBrush(Colors.Blue))
                });

                if (i > 1)
                {
                    n0.Negate();
                }
                //var geo = MeshGeometryHelper.Cut(worldMesh, p0, n0);
                var geo = MeshGeometryHelper.Cut(g1, p0, n0);
                this.Children.Add(new RectangleVisual3D {
                    Origin = ToLocal(p0), Normal = n0, Fill = new SolidColorBrush(Colors.LightGoldenrodYellow), BackMaterial = MaterialHelper.CreateMaterial(new SolidColorBrush(Colors.Blue))
                });
                //Console.WriteLine(i+" = "+p0.ToString());
                var geo1 = MeshGeometryHelper.Cut(geo, pi, ni);
                this.Children.Add(new RectangleVisual3D {
                    Origin = ToLocal(pi), Normal = ni, Fill = new SolidColorBrush(Color.FromArgb(80, 255, 0, 0)), BackMaterial = MaterialHelper.CreateMaterial(new SolidColorBrush(Colors.Green))
                });

                //var geo2 = ToLocalMesh(geo1);

                var model = new GeometryModel3D(geo1, MaterialHelper.CreateMaterial(TeethVisual3D.getTeethColor(i)));
                models.Add(model);
            }
            return(models);
        }
Example #8
0
        public void drawBorderEdges(MeshGeometry3D mesh)
        {
            Int32Collection   edges = MeshGeometryHelper.FindBorderEdges(mesh);
            Point3DCollection pos   = mesh.Positions;

            for (int i = 1; i < edges.Count; i += 2)
            {
                Point3DCollection paths = new Point3DCollection();
                paths.Add(pos[edges[i - 1]]);
                paths.Add(pos[edges[i]]);
                TubeVisual3D t = new TubeVisual3D {
                    Diameter = 0.02, Path = paths, Fill = Brushes.Yellow
                };
                //t.Transform = new TranslateTransform3D(1, 1, 1);
                this.Children.Add(t);
            }
        }
Example #9
0
        public override void Calculate(TerrainModel model, MeshGeometry3D mesh)
        {
            var normals   = MeshGeometryHelper.CalculateNormals(mesh);
            var texcoords = new PointCollection();

            for (int i = 0; i < normals.Count; i++)
            {
                double slopedir = Math.Atan2(normals[i].Y, normals[i].X) * 180 / Math.PI;
                if (slopedir < 0)
                {
                    slopedir += 360;
                }
                double u = slopedir / 360;
                texcoords.Add(new Point(u, u));
            }
            TextureCoordinates = texcoords;
            Material           = MaterialHelper.CreateMaterial(Brush);
        }
Example #10
0
        private void AddContours(GeometryModel3D model, Transform3D transform)
        {
            var wPosition = ContourPlane.Position;
            var wNormal   = ContourPlane.Normal;
            var wSegments = MeshGeometryHelper.GetContourSegments(model.Geometry as MeshGeometry3D, wPosition, wNormal).ToList();

            foreach (var wContour in MeshGeometryHelper.CombineSegments(wSegments, 1e-6).ToList())
            {
                if (wContour.Count == 0)
                {
                    continue;
                }
                HelixViewPort.Children.Add(new TubeVisual3D
                {
                    Diameter = Properties.LineDiameter / 100,
                    Path     = new Point3DCollection(wContour),
                    Fill     = new SolidColorBrush(Properties.WireframeColor)
                });
            }
        }
Example #11
0
        internal GeometryModel3D cutByPlane()
        {
            var p = new Point3D(0, 0, 0);

            //MeshGeometry3D worldMesh = GetMesh();//ToWorldMesh();
            MeshGeometry3D worldMesh = ToWorldMesh();
            var            n         = _plane.Normal;
            var            nn        = _plane.Normal;

            nn.Negate();
            nn.Normalize();
            var geo = MeshGeometryHelper.Cut(worldMesh, p, nn);
            //var geo1 = ToLocalMesh(geo);
            var model = new GeometryModel3D(geo, MaterialHelper.CreateMaterial(Colors.Tomato));

            model.BackMaterial = MaterialHelper.CreateMaterial(Colors.Bisque);

            this.Cut(p, n);
            showManipulator = false;
            showHideManipulator();

            return(model);
        }
Example #12
0
 private void Timer_Tick(object sender, EventArgs e)
 {
     if (DynamicTexture)
     {
         var texture = new Vector2Collection(Model.TextureCoordinates);
         for (int i = 1; i < Model.TextureCoordinates.Count; ++i)
         {
             texture[i - 1] = Model.TextureCoordinates[i];
         }
         texture[texture.Count - 1] = Model.TextureCoordinates[0];
         Model.TextureCoordinates   = texture;
         if (ReverseInnerRotation)
         {
             var texture1 = new Vector2Collection(texture);
             texture1.Reverse();
             InnerModel.TextureCoordinates = texture1;
         }
         else
         {
             InnerModel.TextureCoordinates = texture;
         }
     }
     if (DynamicVertices)
     {
         var positions = new Vector3Collection(initialPosition);
         for (int i = 0; i < positions.Count; ++i)
         {
             positions[i] = positions[i] * (float)rnd.Next(95, 105) / 100;
         }
         Model.Normals        = MeshGeometryHelper.CalculateNormals(positions, Model.Indices);
         InnerModel.Normals   = new Vector3Collection(Model.Normals.Select(x => { return(x * -1); }));
         Model.Positions      = positions;
         InnerModel.Positions = positions;
         //Alternative implementation
         //Floor.DisablePropertyChangedEvent = true;
         //Floor.Positions = positions;
         //Floor.CalculateNormals();
         //Floor.DisablePropertyChangedEvent = false;
         //Floor.UpdateVertex();
     }
     if (DynamicTriangles)
     {
         var indices = new IntCollection(initialIndicies);
         if (isRemoving)
         {
             removedIndex += 3 * 8;
             if (removedIndex >= initialIndicies.Count)
             {
                 removedIndex = initialIndicies.Count;
                 isRemoving   = false;
             }
         }
         else
         {
             removedIndex -= 3 * 8;
             if (removedIndex <= 0)
             {
                 isRemoving   = true;
                 removedIndex = 0;
             }
         }
         indices.RemoveRange(0, removedIndex);
         Model.Indices      = indices;
         InnerModel.Indices = indices;
     }
 }