开发者

F# WPF - displaying a simple object in Viewport3D

I'm trying to get into generating 3D graphics in F# (as was apparent from my previous question) with very little time and very little initial knowledge of F#. I'm studying Tomas Petricek's fractal example, but I can't really make heads or tails of it. I've managed to define a window with a Viewport3D object in XAML, initialize an开发者_如何学JAVAd display it from F#. But as far as creating 3d objects in F# and displaying them goes, I'm lost in a sea of fractal generation, coordinate translation, and other calculations. Could somebody provide a simple example, of creating one really simple object in F# (a single cube, or just a triangle) and display it in the WPF window? That would be huge help. Thank you.


Here's a simple example with two triangles making a single 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)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜