private void Setup3DObjects() { // The event manager will be used to manage the mouse events on our boxes _eventManager3D = new Ab3d.Utilities.EventManager3D(_viewport3D); // Add a wire grid var wireGridVisual3D = new Ab3d.Visuals.WireGridVisual3D() { Size = new System.Windows.Size(1000, 1000), HeightCellsCount = 10, WidthCellsCount = 10, LineThickness = 3 }; _viewport3D.Children.Add(wireGridVisual3D); // Create 7 x 7 boxes with different height for (int y = -3; y <= 3; y++) { for (int x = -3; x <= 3; x++) { // Height is based on the distance from the center double height = (5 - Math.Sqrt(x * x + y * y)) * 60; // Create the 3D Box visual element var boxVisual3D = new Ab3d.Visuals.BoxVisual3D() { CenterPosition = new Point3D(x * 100, height / 2, y * 100), Size = new Size3D(80, height, 80), Material = _normalMaterial }; _viewport3D.Children.Add(boxVisual3D); // With EventManager we can subscribe to mouse events as we would have standard 2D controls: var visualEventSource3D = new VisualEventSource3D(boxVisual3D); visualEventSource3D.MouseEnter += BoxOnMouseEnter; visualEventSource3D.MouseLeave += BoxOnMouseLeave; visualEventSource3D.MouseClick += BoxOnMouseClick; _eventManager3D.RegisterEventSource3D(visualEventSource3D); } } ToggleCameraAnimation(); // Start camer animation }
private void CreateTestScene(Viewport3D wpfViewport3D) { var boxMaterial = new DiffuseMaterial(Brushes.Orange); var sphereMaterial = new MaterialGroup(); sphereMaterial.Children.Add(new DiffuseMaterial(Brushes.SkyBlue)); sphereMaterial.Children.Add(new SpecularMaterial(Brushes.White, 20)); var lightMaterialGroup = new MaterialGroup(); lightMaterialGroup.Children.Add(new DiffuseMaterial(Brushes.Black)); lightMaterialGroup.Children.Add(new EmissiveMaterial(Brushes.Yellow)); var objectsGroup = new Model3DGroup(); //var boxMesh = new Ab3d.Meshes.BoxMesh3D(new Point3D(0, 0, 0), new Size3D(30, 30, 30), 1, 1, 1).Geometry; //var sphereMesh = new Ab3d.Meshes.SphereMesh3D(new Point3D(0, 0, 0), 15, 20, false).Geometry; //for (int y = 0; y < 5; y++) //{ // for (int x = -200; x <= 200; x += 100) // { // for (int z = -200; z <= 200; z += 100) // { // var geometryModel3D = new GeometryModel3D(); // if ((y % 2) == 0) // { // geometryModel3D.Geometry = boxMesh; // geometryModel3D.Material = boxMaterial; // } // else // { // geometryModel3D.Geometry = sphereMesh; // geometryModel3D.Material = sphereMaterial; // } // geometryModel3D.Transform = new TranslateTransform3D(x, y * 50, z); // objectsGroup.Children.Add(geometryModel3D); // } // } //} var boxMesh = new Ab3d.Meshes.BoxMesh3D(new Point3D(0, 0, 0), new Size3D(1, 1, 1), 1, 1, 1).Geometry; var sphereMesh = new Ab3d.Meshes.SphereMesh3D(new Point3D(0, 0, 0), 10, 20, false).Geometry; double yPos = 0; double firstSize = 50; for (int y = 0; y < 5; y++) { int samples = (y * 2) + 2; int halfSamples = samples / 2; double size = 400 / (samples * 1.5); if (y == 0) { firstSize = size; } double xPos = -200; for (int x = -halfSamples; x <= halfSamples; x++) { double zPos = -200; for (int z = -halfSamples; z <= halfSamples; z++) { var geometryModel3D = new GeometryModel3D(); geometryModel3D.Geometry = boxMesh; geometryModel3D.Material = boxMaterial; var transform3DGroup = new Transform3DGroup(); transform3DGroup.Children.Add(new ScaleTransform3D(size, size, size)); transform3DGroup.Children.Add(new TranslateTransform3D(xPos, yPos, zPos)); geometryModel3D.Transform = transform3DGroup; objectsGroup.Children.Add(geometryModel3D); zPos += size * 1.5; } xPos += size * 1.5; } yPos += size + y * 7 + 10; } for (int a = 0; a < 360; a += 20) { double rad = MathUtil.DegreesToRadians(a); double x = Math.Sin(rad) * 600; double z = Math.Cos(rad) * 600; var geometryModel3D = new GeometryModel3D(); geometryModel3D.Geometry = sphereMesh; geometryModel3D.Material = sphereMaterial; var transform3DGroup = new Transform3DGroup(); transform3DGroup.Children.Add(new ScaleTransform3D(8, 8, 8)); transform3DGroup.Children.Add(new TranslateTransform3D(x, 20, z)); geometryModel3D.Transform = transform3DGroup; objectsGroup.Children.Add(geometryModel3D); } var bottomBoxModel3D = new GeometryModel3D(); bottomBoxModel3D.Geometry = new Ab3d.Meshes.BoxMesh3D(new Point3D(0, -(firstSize / 2), 0), new Size3D(2000, 10, 2000), 1, 1, 1).Geometry; //bottomBoxModel3D.Geometry = new Ab3d.Meshes.BoxMesh3D(new Point3D(0, -(firstSize / 2), 0), new Size3D(2000, 10, 2000), 50, 1, 50).Geometry; // To see at least some spot light on bottom box in WPF, create the box from 50 x 50 mesh (or more) bottomBoxModel3D.Material = new DiffuseMaterial(Brushes.Silver); objectsGroup.Children.Add(bottomBoxModel3D); var wireGrid = new Ab3d.Visuals.WireGridVisual3D(); wireGrid.CenterPosition = new Point3D(0, -(firstSize / 2) + 11, 0); wireGrid.Size = new Size(1800, 1800); wireGrid.WidthCellsCount = 9; wireGrid.HeightCellsCount = 9; wireGrid.LineColor = Colors.SkyBlue; wireGrid.LineThickness = 3; wpfViewport3D.Children.Add(wireGrid); var lightsGroup = new Model3DGroup(); _spotLightModel = new GeometryModel3D(); _spotLightModel.Geometry = sphereMesh; _spotLightModel.Material = lightMaterialGroup; _spotLightTranslate = new TranslateTransform3D(_wpfSpotLight.Position.X, _wpfSpotLight.Position.Y, _wpfSpotLight.Position.Z); _spotLightModel.Transform = _spotLightTranslate; lightsGroup.Children.Add(_spotLightModel); _pointLightModel = new GeometryModel3D(); _pointLightModel.Geometry = sphereMesh; _pointLightModel.Material = lightMaterialGroup; _pointLightTranslate = new TranslateTransform3D(_wpfPointLight1.Position.X, _wpfPointLight1.Position.Y, _wpfPointLight1.Position.Z); _pointLightModel.Transform = _pointLightTranslate; lightsGroup.Children.Add(_pointLightModel); var modelVisual3D = new ModelVisual3D(); modelVisual3D.Content = objectsGroup; wpfViewport3D.Children.Add(modelVisual3D); var lightsVisual3D = new ModelVisual3D(); lightsVisual3D.Content = lightsGroup; wpfViewport3D.Children.Add(lightsVisual3D); }