F # WPF - displaying a simple object in Viewport3D

I am trying to get 3D graphics in F # (as was seen from my previous question) with very little time and very little initial knowledge of F #. I am studying the fractal example of Thomas Petrichek, but I cannot make heads or tails. I managed to define a window with a Viewport3D object in XAML, initialize and display it from F #. But as for creating 3D objects in F # and displaying them, I get lost in a sea of ​​fractal generation, coordinate translation and other calculations. Can someone provide a simple example of creating one really simple object in F # (one cube or just a triangle) and display it in a WPF window? This will be a huge help. Thanks.

+4
source share
1 answer

Here is a simple example with two triangles making one square:

#if INTERACTIVE #r "PresentationCore" #r "PresentationFramework" #r "WindowsBase" #r "System.Xaml" #endif open System.Windows open System.Windows.Controls open System.Windows.Media open System.Windows.Media.Media3D let grp = Model3DGroup() let geo = MeshGeometry3D() // Point collection for x,y,z in [0.5, 0.0, 0.0; 1.0, 0.0, 0.0; 0.5, 0.5, 0.0; 1.0, 0.5, 0.0] do geo.Positions.Add(Point3D(x,y,z)) // First triangle for i in [0;1;2] do geo.TriangleIndices.Add(i) // Second triangle - order matters for deciding front vs. back for i in [2;1;3] do geo.TriangleIndices.Add(i) // Create a model with the mesh and a front and back material let model = GeometryModel3D( Geometry = geo, Material = DiffuseMaterial(Brushes.Black), BackMaterial = DiffuseMaterial(Brushes.Red)) grp.Children.Add(model) // add light so back color is visible grp.Children.Add(AmbientLight()) // set up a continuous rotation around the y-axis let rotation = AxisAngleRotation3D(Axis = Vector3D(0.,1.,0.)) let anim = Animation.DoubleAnimation(0.0, 360., Duration(System.TimeSpan.FromSeconds 2.), RepeatBehavior = Animation.RepeatBehavior.Forever) rotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, anim) // apply the rotation to the geometry grp.Transform <- RotateTransform3D(rotation) // create a camera pointing at the triangle let cam = PerspectiveCamera(Point3D(0.,0.,2.), Vector3D(0., 0., -1.), Vector3D(0., 1., 0.), 60.) // set the viewport up with the camera and geometry let vprt = Viewport3D(Camera = cam) vprt.Children.Add(ModelVisual3D(Content = grp)) // add the viewport to a window let wnd = Window(Content = vprt, Title = "3D", Visibility = Visibility.Visible) 
+6
source

Source: https://habr.com/ru/post/1346743/


All Articles