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