Создание (или выдавливание) 3D-полигона из 2D-полигона - C # WPF Helix Toolkit - PullRequest
0 голосов
/ 16 сентября 2018

Я работаю над проектом WPF, который отображает двухмерную городскую зону. У меня есть 2D полигоны, которые представляют здания.

Чтобы получить 3D-вид, мне нужно преобразовать эти здания в 3D-полигоны, «вытеснив» их из базовой области. Я выбрал Helix Toolkit, который показался мне подходящим.

Благодаря обширной документации по Helix Toolkit и ее полезным примерам (это ирония) я попытался «выдавливать» или триангулировать свои базовые полигоны, чтобы сделать их трехмерными.

Но единственные результаты, которые я получаю - это кусочки треугольника или неполный трехмерный многоугольник. Есть так много способов сделать то же самое в Helix Toolkit, что я не могу определить, что мне действительно нужно.

Вот что я получаю | Вот что я хочу

Я сейчас работаю таким образом, и знаю, что это плохо:

// Create a model group
var modelGroup = new Model3DGroup();

// Create an example polygon 
HelixToolkit.Wpf.Polygon test = new HelixToolkit.Wpf.Polygon();
test.Points.Add(new Point(0, 0));
test.Points.Add(new Point(3, 0));
test.Points.Add(new Point(2, 1));
test.Points.Add(new Point(1, 4));
test.Points.Add(new Point(-2, 1));
test.Points.Add(new Point(0, 0));

// Create a meshbuilder and add the Polygon to it
var meshBuilder = new MeshBuilder(false, false);
meshBuilder.AddPolygon(test.Points);

// Create a mesh from the builder (and freeze it)
var mesh = meshBuilder.ToMesh(true);

// Then I add it to my model group and set the binding property
modelGroup.Children.Add(new GeometryModel3D { Geometry = mesh, Transform = new TranslateTransform3D(2, 0, 0), Material = redMaterial, BackMaterial = insideMaterial });

this.Model = modelGroup;

Я также создал метод для создания 3D-точек из моих 2D-данных:

public void createEdges(HelixToolkit.Wpf.Polygon leP)
    {

        for (int i=0; i<= leP.Points.Count-2; i++)
        {
            Point3D p1Sol = new Point3D(leP.Points[i].X, leP.Points[i].Y, 0);
            Point3D p2Sol = new Point3D(leP.Points[i+1].X, leP.Points[i].Y, 0);
            Point3D p1Ciel = new Point3D(leP.Points[i].X, leP.Points[i].Y, 5);
            Point3D p2Ciel = new Point3D(leP.Points[i + 1].X, leP.Points[i].Y, 5);

            Faace laFace = new Faace();

            laFace.LesPoints.Add(p1Sol);
            laFace.LesPoints.Add(p1Ciel);
            laFace.LesPoints.Add(p2Ciel);
            laFace.LesPoints.Add(p2Sol);
            laFace.LesPoints.Add(p1Sol);


            lesFaces.Add(laFace);
        }


    }

Этот метод дает первый скриншот, который я связал.

Я потратил так много времени, пытаясь понять инструментарий, но я сильно застрял и был бы признателен за некоторую помощь. Есть ли способ сделать это правильно?

Надеюсь, я достаточно ясно.

Заранее спасибо,

Martin

...