Вот простой пример с двумя треугольниками, составляющими один квадрат:
#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)