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

4
我想学习在F#中生成3D图形(正如我之前的问题所示),但是时间很少,而且对F#的初始知识也很少。我正在学习Tomas Petricek的分形示例,但我无法真正理解它。我已经成功定义了一个带有Viewport3D对象的XAML窗口,并从F#初始化和显示它。但是,就创建3D对象和显示它们而言,我迷失在分形生成、坐标转换和其他计算的海洋中。 能否提供一个简单的例子,在F#中创建一个非常简单的对象(一个立方体或只是一个三角形),并在WPF窗口中显示它?那将是巨大的帮助。 谢谢。
1个回答

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)

谢谢,你非常有帮助。也许你已经从我的略带恐慌的语气中注意到了,我处于一个相当困难的境地。我有一个个人请求,如果你不介意的话,我想向你提出。如果你同意听我的问题,请在 green.airplane [at] gmail [dot] com 发送一封快速邮件,这样我就可以给你发送详细信息。如果你不同意,请在这里说一声,这样我就不会等待一个不会到来的电子邮件。提前致谢。 - moebius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接