F#WPF - 在Viewport3D中显示一个简单的对象

moe*_*ius 4 3d wpf f# functional-programming

我正试图在F#中生成3D图形(从我之前的问题中显而易见),只需很少的时间和很少的初始F#知识.我正在研究Tomas Petricek的分形例子,但我无法真正地做出正面或反面.我已经设法在XAML中定义了一个带有Viewport3D对象的窗口,从F#初始化并显示它.但是,就在F#中创建3d对象并显示它们而言,我迷失在分形生成,坐标转换和其他计算的海洋中.有人可以提供一个简单的例子,在F#中创建一个非常简单的对象(一个立方体,或者只是一个三角形)并在WPF窗口中显示它?那将是巨大的帮助.谢谢.

kvb*_*kvb 6

这是一个简单的例子,两个三角形构成一个正方形:

#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)
Run Code Online (Sandbox Code Playgroud)