F # WPF - отображение простого объекта в Viewport3D - PullRequest
4 голосов
/ 05 апреля 2011

Я пытаюсь приступить к созданию трехмерной графики в F # (как было видно из моего предыдущего вопроса) с очень небольшим временем и очень маленьким начальным знанием F #. Я изучаю фрактальный пример Томаса Петричека, но на самом деле я не могу сделать из этого ни головы, ни хвоста. Мне удалось определить окно с объектом Viewport3D в XAML, инициализировать и отобразить его из F #. Но что касается создания трехмерных объектов в F # и их отображения, я потерялся в море генерации фракталов, трансляции координат и других вычислений. Может ли кто-нибудь привести простой пример создания одного действительно простого объекта в F # (один куб или просто треугольник) и отобразить его в окне WPF? Это было бы огромной помощью. Спасибо.

1 Ответ

6 голосов
/ 05 апреля 2011

Вот простой пример с двумя треугольниками, составляющими один квадрат:

#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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...