private void LoadDemoSceneMenuItem_Click(object sender, RoutedEventArgs e) { ViewModel.AddedSceneElements = new ObservableCollection <Visual3DViewModel>(); ViewPort.Children.Clear(); ///Test the HalfEdge Manipulations /*var triMesh = HalfEdgeMeshGenerator.GenerateHalfEdgeTests(); * triMesh.RemoveTriangle(triMesh.Triangles[0]); * triMesh.RemoveTriangle(triMesh.Triangles[4]); * triMesh.RemoveTriangle(triMesh.Triangles[3]); * triMesh.RemoveTriangle(triMesh.Triangles[1]); * triMesh.RemoveTriangle(triMesh.Triangles[2]); * triMesh.RemoveTriangle(triMesh.Triangles[7]); * ViewModel.AddedSceneElements.Add(new Visual3DViewModel(triMesh.CreateVisual3D(default(Material), default(Material)), "TestVisual")); * ViewModel.AddedSceneElements.Add(new Visual3DViewModel(triMesh.CreateBoundaryVisual3D(default(Color)), "TestVisual Boundary")); * ViewPort.DebugInfo = string.Join(" -> ", triMesh.BoundaryVertices.Where((v, i) => i == 0 || i % 2 == 1).Select(v => v.ToString()));*/ ///Demo Scene var triMesh = HalfEdgeMeshGenerator.GenerateCube(HalfEdgeDataStructure.Vector.Zero, 2, CubeSides.All); var bigCube = triMesh.CreateVisual3D(default(Material), default(Material)); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(triMesh, triMesh.CreateVisual3D(default(Material), default(Material)), "Big Cube")); triMesh = HalfEdgeMeshGenerator.GenerateCube(new HalfEdgeDataStructure.Vector(1, 1, 2.0005f), .499f, CubeSides.Z | CubeSides.X); var cubeVisual3D = triMesh.CreateVisual3D(default(Material), default(Material)); var cubeBoundaryVisual3D = triMesh.CreateBoundaryVisual3D(default(Color)); cubeVisual3D.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), 15)); cubeBoundaryVisual3D.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), 15)); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(triMesh, cubeVisual3D, "Small Open Cube")); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(triMesh, cubeBoundaryVisual3D, "Small Open Cube Border")); triMesh = HalfEdgeMeshGenerator.GenerateCube(new HalfEdgeDataStructure.Vector(0.5f, 0.5f, 2.5f), 1, CubeSides.All & ~CubeSides.PositiveZ, true); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(triMesh, triMesh.CreateVisual3D(new DiffuseMaterial(new SolidColorBrush(Colors.OrangeRed)), default(Material)), "Orange Open Cube")); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(triMesh, triMesh.CreateBoundaryVisual3D(Colors.LightGreen), "Orange Open Cube Border")); MeshBuilder mb = new MeshBuilder(); mb.AddSphere(new Point3D(3, -1, 0.5), 0.5); var mg = mb.ToMesh(); triMesh = HalfEdgeMeshGenerator.GenerateFromMeshGeometry3D(mg, true); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(triMesh, triMesh.CreateVisual3D(default(Material), default(Material)), "HelixToolkit Sphere")); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(triMesh, triMesh.CreateBoundaryVisual3D(default(Color)), "HelixToolkit Sphere Border")); var sphere = HalfEdgeMeshGenerator.GenerateSphere(new HalfEdgeDataStructure.Vector(-2, 1, 1), 1, 4, CubeSides.All & ~CubeSides.PositiveX & ~CubeSides.NegativeY & ~CubeSides.PositiveZ); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(sphere, sphere.CreateVisual3D(default(Material), default(Material)), "Coarse Sphere Part")); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(sphere, sphere.CreateBoundaryVisual3D(default(Color)), "Coarse Sphere Part Border")); var material = MaterialHelper.CreateMaterial(new SolidColorBrush(Colors.LightSkyBlue), 1, 128, 255, false); MaterialHelper.ChangeOpacity(material, 0.5); var sphere2 = HalfEdgeMeshGenerator.GenerateSphere(new HalfEdgeDataStructure.Vector(-1.975f, 0.975f, 1.025f), 1, 32, CubeSides.All & ~CubeSides.NegativeX & ~CubeSides.PositiveY & ~CubeSides.NegativeZ); var numSphere2Triangles = sphere2.Triangles.Count; var numSphere2Vertices = sphere2.Vertices.Count; var rand = new Random(); var numRemove = (int)(numSphere2Vertices * 0.2f); var removalList = new int[numRemove]; for (int i = 0; i < numRemove; i++) { removalList[i] = rand.Next(numSphere2Triangles); } sphere2.RemoveVertices(removalList); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(sphere2, sphere2.CreateVisual3D(material, material), "Fine Transparent Sphere Part")); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(sphere2, sphere2.CreateBoundaryVisual3D(default(Color)), "Fine Transparent Sphere Part Border")); material = MaterialHelper.CreateMaterial(new SolidColorBrush(Colors.LightGoldenrodYellow), 1, 128, 255, false); MaterialHelper.ChangeOpacity(material, 0.5); var sphere3 = HalfEdgeMeshGenerator.GenerateSphere(new HalfEdgeDataStructure.Vector(2, -0.5f, 0.5f), 0.5f, 16); ViewModel.AddedSceneElements.Add(new Visual3DViewModel(sphere3, sphere3.CreateVisual3D(material, material), "Transparent Sphere")); AddSceneElements(); ///AddSilhoutetteForVisual3D(); }
/// <summary> /// Handle Mouse Move when the Mouse is in the 3D View. /// </summary> /// <param name="sender">The Sender.</param> /// <param name="e">The MouseEventArgs.</param> private void ViewPort_MouseMove(object sender, MouseEventArgs e) { if (!ViewModel.ShowHoveredElement) { return; } var maxValue = Math.Tan((ViewPort.Camera as PerspectiveCamera).FieldOfView * 0.5 * ExtensionMethods.DegreeToRadians); var width = ViewPort.ActualWidth; var height = ViewPort.ActualHeight; var aspectRatio = height / width; var mousePosition = e.GetPosition(ViewPort); var xValue = mousePosition.X / width * 2 * maxValue - maxValue; var yValue = (height - mousePosition.Y) / height * maxValue - 0.5; var ray = Camera.GetRay3D(xValue, yValue); var material = MaterialHelper.CreateMaterial(new SolidColorBrush(Colors.Orange), 1, 128, 255, false); MaterialHelper.ChangeOpacity(material, 0.5); var hitElements = Viewport3DHelper.FindHits(ViewPort.Viewport, mousePosition) .Where(el => ViewModel.AddedSceneElements.Select(ae => ae.Visual3D).Contains(el.Visual)); if (hitElements.Count() > 0) { var hitElement = hitElements.First().Visual; if (hitElement == ViewPort.Children.Last()) { return; } else if (ViewModel.HoveredElement != null) { RemoveHoveredElement(); } if (hitElement is MeshVisual3D) { ViewModel.HoveredElement = new MeshVisual3D() { Mesh = (hitElement as MeshVisual3D).Mesh, FaceMaterial = material, FaceBackMaterial = material, Transform = hitElement.Transform, EdgeDiameter = 0, VertexRadius = 0 } } ; else if (hitElement is MeshGeometryVisual3D) { ViewModel.HoveredElement = new MeshGeometryVisual3D() { MeshGeometry = (hitElement as MeshGeometryVisual3D).MeshGeometry, Material = material, BackMaterial = material, Transform = hitElement.Transform, }; } if (ViewModel.HoveredElement != null) { ViewPort.Children.Add(ViewModel.HoveredElement); } } else { RemoveHoveredElement(); } ViewPort.DebugInfo = $"Origin: {ray.Origin.ToString(3)}, Direction: {ray.Direction.ToString(3)}"; }