private void btnBodyPlate_Click(object sender, RoutedEventArgs e)
        {
            RemoveCurrentBody();

            _world.Pause();

            #region Main Body

            #region WPF Model

            // Material
            MaterialGroup materials = new MaterialGroup();
            materials.Children.Add(new DiffuseMaterial(new SolidColorBrush(_colors.HullFace)));
            materials.Children.Add(_colors.HullFaceSpecular);

            // Geometry Mesh
            MeshGeometry3D mesh = UtilityWPF.GetCube_IndependentFaces(new Point3D(-1, -1, -.1), new Point3D(1, 1, .1));
            CollisionHull collisionHull = CollisionHull.CreateBox(_world, 0, new Vector3D(2, 2, .2), null);

            // Geometry Model
            GeometryModel3D geometry = new GeometryModel3D();
            geometry.Material = materials;
            geometry.BackMaterial = materials;
            geometry.Geometry = mesh;

            // Transform
            //transform = new Transform3DGroup();		// rotate needs to be added before translate
            //rotation = _defaultDirectionFacing.GetAngleAroundAxis(directionFacing);
            //transform.Children.Add(new RotateTransform3D(new QuaternionRotation3D(rotation)));
            //transform.Children.Add(new TranslateTransform3D(position.ToVector()));

            // Model Visual
            ModelVisual3D model = new ModelVisual3D();
            model.Content = geometry;
            //model.Transform = _modelOrientationTrackball.Transform;		// start this in that orientation, but let physics take over from there (_modelOrientationTrackball update won't touch this body)

            #endregion

            // Body
            _body = new Body(collisionHull, _modelOrientationTrackball.Transform.Value, 1, null);
            collisionHull.Dispose();

            // Hull
            _fluidHull = new FluidHull();
            _fluidHull.Triangles = FluidHull.FluidTriangle.GetTrianglesFromMesh(mesh);
            _fluidHull.IsClosedConvexInUniformField = chkClosedHulls.IsChecked.Value;
            _fluidHull.Field = _field;
            _fluidHull.Body = _body;

            // Wireframe
            ScreenSpaceLines3D modelWireframe = GetModelWireframe(_fluidHull);
            modelWireframe.Transform = _modelOrientationTrackball.Transform;
            _viewport.Children.Add(modelWireframe);

            #endregion

            // Rope1
            Point3D bodyAttachPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(1, -1, 0));
            Point3D anchorPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(2, -3, 0));
            AddRope(bodyAttachPoint, anchorPoint, null);

            if (StaticRandom.Next(2) == 0)
            {
                // Rope2
                bodyAttachPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(1, 1, 0));
                anchorPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(2, 3, 0));
                AddRope(bodyAttachPoint, anchorPoint, null);
            }

            // Add to the viewport
            _viewport.Children.Add(model);		// this must be last, or it won't appear transparent to models added after it

            // Finish setting up the body
            _body.Visuals = new Visual3D[] { model, modelWireframe };
            _body.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(Body_ApplyForceAndTorque);
            _body.BodyMoved += new EventHandler(Body_BodyMoved);

            _world.UnPause();
        }
        private void btnBodyPropeller3_Click(object sender, RoutedEventArgs e)
        {
            //TODO:  This is just a tweaked copy of 2 (I was feeling lazy).  They should really be merged

            RemoveCurrentBody();

            _world.Pause();

            // Materials
            MaterialGroup materialsFluidBlade = new MaterialGroup();		// These blades are what the fluid model knows about, but newton will know about a more complex object
            materialsFluidBlade.Children.Add(new DiffuseMaterial(new SolidColorBrush(_colors.HullFace)));
            materialsFluidBlade.Children.Add(_colors.HullFaceSpecular);

            MaterialGroup materialsPhysics = new MaterialGroup();		// this is the material for the composite physics object
            materialsPhysics.Children.Add(new DiffuseMaterial(new SolidColorBrush(_colors.GhostBodyFace)));
            materialsPhysics.Children.Add(_colors.GhostBodySpecular);

            // Geometries
            MeshGeometry3D meshFluidBlade = new MeshGeometry3D();

            MeshGeometry3D meshPhysicsBlade1 = null;
            MeshGeometry3D meshPhysicsBlade2 = null;
            MeshGeometry3D meshPhysicsBlade3 = null;
            MeshGeometry3D meshPhysicsCone = null;

            // Centered blade positions (these are defined once, then copies will be transformed and commited)
            Point3D[] bladePositionsFluid = new Point3D[4];
            bladePositionsFluid[0] = new Point3D(-1d, .25d, 0d);
            bladePositionsFluid[1] = new Point3D(-1d, -.25d, 0d);
            bladePositionsFluid[2] = new Point3D(1d, -.25d, 0d);
            bladePositionsFluid[3] = new Point3D(1d, .25d, 0d);

            Point3D[] bladePositionsPhysics = new Point3D[2];
            bladePositionsPhysics[0] = new Point3D(-1d, -.25d, -.05d);
            bladePositionsPhysics[1] = new Point3D(1d, .25d, .05d);

            // This tranform is throw away.  It's just used to transform points
            Transform3DGroup transform = new Transform3DGroup();
            transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 90d + 5d)));		// rotar tilt (the flow defaults to -x, so face them into the wind)
            transform.Children.Add(new TranslateTransform3D(new Vector3D(1d + .33d, 0, 0)));		// pull away from the center a bit
            transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), 90)));		// I don't want it along X, I want it along Y

            // Fluid blade 1
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[0]));
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[1]));
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[2]));
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[3]));

            meshFluidBlade.TriangleIndices.Add(0);
            meshFluidBlade.TriangleIndices.Add(1);
            meshFluidBlade.TriangleIndices.Add(2);
            meshFluidBlade.TriangleIndices.Add(2);
            meshFluidBlade.TriangleIndices.Add(3);
            meshFluidBlade.TriangleIndices.Add(0);

            // Physics blade 1
            meshPhysicsBlade1 = UtilityWPF.GetCube_IndependentFaces(bladePositionsPhysics[0], bladePositionsPhysics[1]);
            CollisionHull collisionPhysicsBlade1 = CollisionHull.CreateBox(_world, 0, bladePositionsPhysics[1] - bladePositionsPhysics[0], transform.Value);
            Transform3D transformPhysicsBlade1 = transform.Clone();

            transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 120d)));		// rotate the whole thing 120 degrees

            // Fluid blade 2
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[0]));
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[1]));
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[2]));
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[3]));

            meshFluidBlade.TriangleIndices.Add(0 + 4);
            meshFluidBlade.TriangleIndices.Add(1 + 4);
            meshFluidBlade.TriangleIndices.Add(2 + 4);
            meshFluidBlade.TriangleIndices.Add(2 + 4);
            meshFluidBlade.TriangleIndices.Add(3 + 4);
            meshFluidBlade.TriangleIndices.Add(0 + 4);

            // Physics blade 2
            meshPhysicsBlade2 = UtilityWPF.GetCube_IndependentFaces(bladePositionsPhysics[0], bladePositionsPhysics[1]);
            CollisionHull collisionPhysicsBlade2 = CollisionHull.CreateBox(_world, 0, bladePositionsPhysics[1] - bladePositionsPhysics[0], transform.Value);
            Transform3D transformPhysicsBlade2 = transform.Clone();

            transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 120d)));		// rotate the whole thing 120 degrees

            // Fluid blade 3
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[0]));
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[1]));
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[2]));
            meshFluidBlade.Positions.Add(transform.Transform(bladePositionsFluid[3]));

            meshFluidBlade.TriangleIndices.Add(0 + 8);
            meshFluidBlade.TriangleIndices.Add(1 + 8);
            meshFluidBlade.TriangleIndices.Add(2 + 8);
            meshFluidBlade.TriangleIndices.Add(2 + 8);
            meshFluidBlade.TriangleIndices.Add(3 + 8);
            meshFluidBlade.TriangleIndices.Add(0 + 8);

            // Physics blade 3
            meshPhysicsBlade3 = UtilityWPF.GetCube_IndependentFaces(bladePositionsPhysics[0], bladePositionsPhysics[1]);
            CollisionHull collisionPhysicsBlade3 = CollisionHull.CreateBox(_world, 0, bladePositionsPhysics[1] - bladePositionsPhysics[0], transform.Value);
            Transform3D transformPhysicsBlade3 = transform.Clone();

            //TODO:  Make an overload on some of the geometry builders that take a tranform
            //meshPhysicsCone = UtilityWPF.GetCone_AlongX();

            // Geometry Models
            GeometryModel3D geometryFluidBlade = new GeometryModel3D();
            geometryFluidBlade.Material = materialsFluidBlade;
            geometryFluidBlade.BackMaterial = materialsFluidBlade;
            geometryFluidBlade.Geometry = meshFluidBlade;

            GeometryModel3D geometryPhysicsBlade1 = new GeometryModel3D();
            geometryPhysicsBlade1.Material = materialsPhysics;
            geometryPhysicsBlade1.BackMaterial = materialsPhysics;
            geometryPhysicsBlade1.Geometry = meshPhysicsBlade1;
            geometryPhysicsBlade1.Transform = transformPhysicsBlade1;

            GeometryModel3D geometryPhysicsBlade2 = new GeometryModel3D();
            geometryPhysicsBlade2.Material = materialsPhysics;
            geometryPhysicsBlade2.BackMaterial = materialsPhysics;
            geometryPhysicsBlade2.Geometry = meshPhysicsBlade2;
            geometryPhysicsBlade2.Transform = transformPhysicsBlade2;

            GeometryModel3D geometryPhysicsBlade3 = new GeometryModel3D();
            geometryPhysicsBlade3.Material = materialsPhysics;
            geometryPhysicsBlade3.BackMaterial = materialsPhysics;
            geometryPhysicsBlade3.Geometry = meshPhysicsBlade3;
            geometryPhysicsBlade3.Transform = transformPhysicsBlade3;

            // Model Visual
            ModelVisual3D modelFluidBlade = new ModelVisual3D();
            modelFluidBlade.Content = geometryFluidBlade;
            modelFluidBlade.Transform = _modelOrientationTrackball.Transform;

            ModelVisual3D modelPysicsBlade1 = new ModelVisual3D();
            modelPysicsBlade1.Content = geometryPhysicsBlade1;
            modelPysicsBlade1.Transform = _modelOrientationTrackball.Transform;

            ModelVisual3D modelPysicsBlade2 = new ModelVisual3D();
            modelPysicsBlade2.Content = geometryPhysicsBlade2;
            modelPysicsBlade2.Transform = _modelOrientationTrackball.Transform;

            ModelVisual3D modelPysicsBlade3 = new ModelVisual3D();
            modelPysicsBlade3.Content = geometryPhysicsBlade3;
            modelPysicsBlade3.Transform = _modelOrientationTrackball.Transform;

            CollisionHull collisionHull = CollisionHull.CreateCompoundCollision(_world, 0, new CollisionHull[] { collisionPhysicsBlade1, collisionPhysicsBlade2, collisionPhysicsBlade3 });

            // Body
            _body = new Body(collisionHull, _modelOrientationTrackball.Transform.Value, 1, null);
            collisionHull.Dispose();
            collisionPhysicsBlade1.Dispose();
            collisionPhysicsBlade2.Dispose();
            collisionPhysicsBlade3.Dispose();

            // Hull
            _fluidHull = new FluidHull();
            _fluidHull.Triangles = FluidHull.FluidTriangle.GetTrianglesFromMesh(meshFluidBlade);
            _fluidHull.IsClosedConvexInUniformField = false;
            _fluidHull.Transform = _modelOrientationTrackball.Transform;
            _fluidHull.Field = _field;
            _fluidHull.Body = _body;

            // Wireframe
            ScreenSpaceLines3D modelWireframe = GetModelWireframe(_fluidHull);
            modelWireframe.Transform = _modelOrientationTrackball.Transform;
            _viewport.Children.Add(modelWireframe);

            // Rope
            Point3D bodyAttachPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(.25, 0, 0));
            Point3D anchorPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(3, 0, 0));
            //Point3D bodyAttachPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(0, 0, 0));
            //Point3D anchorPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(.33, 0, 0));
            AddRope(bodyAttachPoint, anchorPoint, Math1D.DegreesToRadians(1d));

            // Add to the viewport
            _viewport.Children.Add(modelFluidBlade);
            _viewport.Children.Add(modelPysicsBlade1);
            _viewport.Children.Add(modelPysicsBlade2);
            _viewport.Children.Add(modelPysicsBlade3);

            // Finish setting up the body
            _body.Visuals = new Visual3D[] { modelPysicsBlade1, modelPysicsBlade2, modelPysicsBlade3, modelWireframe, modelFluidBlade };
            _body.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(Body_ApplyForceAndTorque);
            _body.BodyMoved += new EventHandler(Body_BodyMoved);

            _world.UnPause();
        }
        private ScreenSpaceLines3D GetModelWireframe(FluidHull hull)
        {
            ScreenSpaceLines3D retVal = new ScreenSpaceLines3D();
            retVal.Thickness = 1d;
            retVal.Color = _colors.HullWireFrame;

            FluidHull.FluidTriangle[] triangles = hull.Triangles;

            if (triangles.Length > 0)
            {
                Point3D[] allPoints = triangles[0].AllPoints;

                foreach (Tuple<int, int> line in TriangleIndexed.GetUniqueLines(triangles))
                {
                    retVal.AddLine(allPoints[line.Item1], allPoints[line.Item2]);
                }
            }

            return retVal;
        }
        private void btnStaticSphere3_Click(object sender, RoutedEventArgs e)
        {
            RemoveCurrentBody();

            #region WPF Model

            // Material
            MaterialGroup materials = new MaterialGroup();
            materials.Children.Add(new DiffuseMaterial(new SolidColorBrush(_colors.HullFace)));
            materials.Children.Add(_colors.HullFaceSpecular);

            // Geometry Mesh
            MeshGeometry3D mesh = UtilityWPF.GetSphere_LatLon(4, 1d);

            // Geometry Model
            GeometryModel3D geometry = new GeometryModel3D();
            geometry.Material = materials;
            geometry.BackMaterial = materials;
            geometry.Geometry = mesh;

            // Transform
            //transform = new Transform3DGroup();		// rotate needs to be added before translate
            //rotation = _defaultDirectionFacing.GetAngleAroundAxis(directionFacing);
            //transform.Children.Add(new RotateTransform3D(new QuaternionRotation3D(rotation)));
            //transform.Children.Add(new TranslateTransform3D(position.ToVector()));

            // Model Visual
            _model = new ModelVisual3D();
            _model.Content = geometry;
            _model.Transform = _modelOrientationTrackball.Transform;

            #endregion

            // Hull
            _fluidHull = new FluidHull();
            _fluidHull.Triangles = FluidHull.FluidTriangle.GetTrianglesFromMesh(mesh);
            _fluidHull.IsClosedConvexInUniformField = chkClosedHulls.IsChecked.Value;
            _fluidHull.Field = _field;

            // Wireframe
            _modelWireframe = GetModelWireframe(_fluidHull);
            _modelWireframe.Transform = _modelOrientationTrackball.Transform;
            _viewport.Children.Add(_modelWireframe);

            // Add to the viewport
            _viewport.Children.Add(_model);
        }
        private void RemoveCurrentBody()
        {
            _forceLines.Clear();

            #region Rope Joints

            foreach (JointBase joint in _ropeJoints)
            {
                joint.Dispose();
            }

            _ropeJoints.Clear();

            #endregion

            #region Anchor Bodies

            foreach (Body body in _anchorBodies)
            {
                if (body.Visuals != null)
                {
                    foreach (Visual3D visual in body.Visuals)		// visuals may be stored here, or in _model/_modelWireframe.  Putting if statements all over to be safe
                    {
                        if (_viewport.Children.Contains(visual))
                        {
                            _viewport.Children.Remove(visual);
                        }
                    }
                }

                body.Dispose();
            }

            _anchorBodies.Clear();

            #endregion
            #region Rope Bodies

            foreach (Body body in _ropeBodies)
            {
                if (body.Visuals != null)
                {
                    foreach (Visual3D visual in body.Visuals)		// visuals may be stored here, or in _model/_modelWireframe.  Putting if statements all over to be safe
                    {
                        if (_viewport.Children.Contains(visual))
                        {
                            _viewport.Children.Remove(visual);
                        }
                    }
                }
            }

            _ropeBodies.Clear();

            #endregion
            #region Main Body

            if (_body != null)
            {
                if (_body.Visuals != null)
                {
                    foreach (Visual3D visual in _body.Visuals)		// visuals may be stored here, or in _model/_modelWireframe.  Putting if statements all over to be safe
                    {
                        if (_viewport.Children.Contains(visual))
                        {
                            _viewport.Children.Remove(visual);
                        }
                    }
                }

                _body.BodyMoved -= new EventHandler(Body_BodyMoved);
                _body.ApplyForceAndTorque -= new EventHandler<BodyApplyForceAndTorqueArgs>(Body_ApplyForceAndTorque);
                _body.Dispose();
                _body = null;
            }

            #endregion

            #region Model

            if (_model != null)
            {
                _viewport.Children.Remove(_model);
                _model = null;
            }

            #endregion
            #region Model Wireframe

            if (_modelWireframe != null)
            {
                _viewport.Children.Remove(_modelWireframe);
                _modelWireframe = null;
            }

            #endregion

            _fluidHull = null;
        }
        private void btnBodyPropellerPlates_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                RemoveCurrentBody();

                _world.Pause();

                // Material
                MaterialGroup materials = new MaterialGroup();
                materials.Children.Add(new DiffuseMaterial(new SolidColorBrush(_colors.HullFace)));
                materials.Children.Add(_colors.HullFaceSpecular);

                #region Templates

                // These positions are transformed for each blade
                Point3D[] bladePositions = new Point3D[2];
                bladePositions[0] = new Point3D(-1d, -.25d, -.05d);
                bladePositions[1] = new Point3D(1d, .25d, .05d);

                // This tranform is throw away.  It's just used to transform points
                Transform3DGroup transform = new Transform3DGroup();
                transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 90d + 15d)));		// rotar tilt (the flow defaults to -x, so face them into the wind)
                transform.Children.Add(new TranslateTransform3D(new Vector3D(1d + .5d, 0, 0)));		// pull away from the center a bit
                transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), 90)));		// I don't want it along X, I want it along Y

                #endregion

                // Blades
                MeshGeometry3D[] meshBlades = new MeshGeometry3D[StaticRandom.Next(1, 8)];
                CollisionHull[] collisionBlades = new CollisionHull[meshBlades.Length];
                Transform3D[] transformBlades = new Transform3D[meshBlades.Length];
                GeometryModel3D[] geometryBlades = new GeometryModel3D[meshBlades.Length];
                ModelVisual3D[] modelBlades = new ModelVisual3D[meshBlades.Length];

                for (int cntr = 0; cntr < meshBlades.Length; cntr++)
                {
                    meshBlades[cntr] = UtilityWPF.GetCube_IndependentFaces(bladePositions[0], bladePositions[1]);
                    collisionBlades[cntr] = CollisionHull.CreateBox(_world, 0, bladePositions[1] - bladePositions[0], transform.Value);
                    transformBlades[cntr] = transform.Clone();

                    geometryBlades[cntr] = new GeometryModel3D();
                    geometryBlades[cntr].Material = materials;
                    geometryBlades[cntr].BackMaterial = materials;
                    geometryBlades[cntr].Geometry = meshBlades[cntr];
                    geometryBlades[cntr].Transform = transformBlades[cntr];

                    modelBlades[cntr] = new ModelVisual3D();
                    modelBlades[cntr].Content = geometryBlades[cntr];
                    modelBlades[cntr].Transform = _modelOrientationTrackball.Transform;

                    // Prep for the next blade
                    transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 360d / meshBlades.Length)));
                }

                // Body
                CollisionHull collisionHull = CollisionHull.CreateCompoundCollision(_world, 0, collisionBlades);

                _body = new Body(collisionHull, _modelOrientationTrackball.Transform.Value, 1, null);
                collisionHull.Dispose();
                foreach (CollisionHull hull in collisionBlades)
                {
                    hull.Dispose();
                }

                _fluidHull = new FluidHull();
                _fluidHull.Triangles = FluidHull.FluidTriangle.GetTrianglesFromMesh(meshBlades, transformBlades);
                _fluidHull.IsClosedConvexInUniformField = false;
                _fluidHull.Transform = _modelOrientationTrackball.Transform;
                _fluidHull.Field = _field;
                _fluidHull.Body = _body;

                // Wireframe
                ScreenSpaceLines3D modelWireframe = GetModelWireframe(_fluidHull);
                modelWireframe.Transform = _modelOrientationTrackball.Transform;
                _viewport.Children.Add(modelWireframe);

                // Rope
                Point3D bodyAttachPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(.25, 0, 0));
                Point3D anchorPoint = _modelOrientationTrackball.Transform.Transform(new Point3D(3, 0, 0));
                AddRope(bodyAttachPoint, anchorPoint, Math1D.DegreesToRadians(1d));

                // Add to the viewport
                foreach (ModelVisual3D model in modelBlades)
                {
                    _viewport.Children.Add(model);
                }

                // Finish setting up the body
                Visual3D[] visuals = new Visual3D[meshBlades.Length + 1];
                for (int cntr = 0; cntr < meshBlades.Length; cntr++)
                {
                    visuals[cntr] = modelBlades[cntr];
                }
                visuals[visuals.Length - 1] = modelWireframe;

                _body.Visuals = visuals;
                _body.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(Body_ApplyForceAndTorque);
                _body.BodyMoved += new EventHandler(Body_BodyMoved);

                _world.UnPause();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
Пример #7
0
        private void ApplyFluidHull(Body body)
        {
            if (body.Visuals != null)
            {
                foreach (Visual3D visual in body.Visuals)
                {
                    if (visual is ModelVisual3D)
                    {
                        ModelVisual3D visualCast = (ModelVisual3D)visual;
                        if (visualCast.Content is GeometryModel3D)
                        {
                            GeometryModel3D contentCast = (GeometryModel3D)visualCast.Content;

                            if (contentCast.Geometry is MeshGeometry3D)
                            {
                                FluidHull hull = new FluidHull();
                                hull.Triangles = FluidHull.FluidTriangle.GetTrianglesFromMesh((MeshGeometry3D)contentCast.Geometry, contentCast.Transform);
                                hull.IsClosedConvexInUniformField = true;
                                hull.Field = _fluidField;
                                hull.Body = body;

                                if (!_fluidHulls.ContainsKey(body))
                                {
                                    _fluidHulls.Add(body, new List<FluidHull>());
                                }

                                _fluidHulls[body].Add(hull);
                            }
                        }
                    }
                }
            }
        }
Пример #8
0
        private void AddNewBody(MeshGeometry3D mesh, bool shouldChangeFieldSize)
        {
            RemoveCurrentBody();

            #region WPF Model

            // Material
            MaterialGroup materials = new MaterialGroup();
            materials.Children.Add(new DiffuseMaterial(new SolidColorBrush(_colors.HullFace)));
            materials.Children.Add(_colors.HullFaceSpecular);

            // Geometry Model
            GeometryModel3D geometry = new GeometryModel3D();
            geometry.Material = materials;
            geometry.BackMaterial = materials;
            geometry.Geometry = mesh;

            // Model Visual
            _bodyVisual = new ModelVisual3D();
            _bodyVisual.Content = geometry;
            _bodyVisual.Transform = _modelOrientationTrackball.Transform;

            #endregion

            #region Fluid Hull

            _fluidHull = new FluidHull();
            _fluidHull.Triangles = FluidHull.FluidTriangle.GetTrianglesFromMesh(mesh);
            _fluidHull.Transform = _modelOrientationTrackball.Transform;

            //_fluidHull.Field = _fieldUniform;
            _fluidHull.Field = _fieldField;

            #endregion

            ITriangleIndexed[] modelHull = UtilityWPF.GetTrianglesFromMesh(mesh);

            double farthestPosition = mesh.Positions.AsEnumerable().Max(o => Math1D.Max(Math.Abs(o.X), Math.Abs(o.Y), Math.Abs(o.Z)));

            if (shouldChangeFieldSize)
            {
                _field.SizeWorld = farthestPosition * 2d * (1.5d + (StaticRandom.NextDouble() * 1.5d));
                _fieldCells = _field.GetCells(false);       // need to rebuild this, because the world's size changed
            }

            // Wireframe
            _bodyWireframe = GetModelWireframe(modelHull);
            _bodyWireframe.Transform = _modelOrientationTrackball.Transform;
            _viewport.Children.Add(_bodyWireframe);

            // Add this last so the semi transparency looks right
            _viewport.Children.Add(_bodyVisual);

            RotateModel(mesh);

            ShowHideBlockedCells();
            ShowHideFluidBoundry();
        }
Пример #9
0
        private void RemoveCurrentBody()
        {
            _bodyMesh = null;
            _fluidHull = null;

            _fluidHullForceLines.Clear();

            if (_bodyWireframe != null)
            {
                _viewport.Children.Remove(_bodyWireframe);
                _bodyWireframe = null;
            }

            if (_bodyVisual != null)
            {
                _viewport.Children.Remove(_bodyVisual);
                _bodyVisual = null;
            }

            foreach (Visual3D visual in _debugVisuals)
            {
                _viewport.Children.Remove(visual);
            }
            _debugVisuals.Clear();

            if (_field != null)
            {
                _field.SetBlockedCells(false);
            }

            ShowHideBlockedCells();
        }