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); } }
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); } } } } } }
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(); }
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(); }