This is the discussion forum for Helix Toolkit.
For bugs and new features, use the issue tracker located at GitHub.
Also try the chat room!

Color Interpolation for object surface

Ehsan M A. 7 years ago updated by Fdjjj Duuree 2 years ago 205

I have a mesh, say for example a triangle with three corners p1, p2 and p3.

i want to create a gradient that cause for example color C1 in P1 corner of triangle, C2 in P2 corner and C3 in P3 corner. Please note that C1 and C2 and C3 are different.

Any idea on how to do it?


Reference bugs in examples/source?

zangatsu 8 years ago updated by Kong Lee 2 years ago 243

Hi I just downloaded the newest source of the helix-toolkit. I wanted to get through all the examples to learn about the application, but unfortunately I get a lot of reference errors and I do not know why. I could solve most of them by reinstalling NuGetPackages and adjusting the fakes assemblies, however there are still a lot left. For example in MainViewModel:BaseViewModel class I get the reference error:

Error CS0246 The type or namespace name 'Camera' could not be found (are you missing a using directive or an assembly reference?) DemoCore _NET40 C:\..\helix-toolkit-master\Source\Examples\WPF.SharpDX\DemoCore\BaseViewModel.cs 29 Active.

This goes on with RenderTechnique, IEffectsManager and so on.

Do you have any solution? My references in DemoCore_NET40 all seem to work fine, at least I am getting no yellow symbol in the solution explorer...


Is there a way to create extruded 3d solid from planar polygon?

Anonymous 10 years ago 0
This discussion was imported from CodePlex

luanshixia wrote at 2013-03-02 03:35:

I am using HelixToolkit to create a simple city data visualization app. I need to extrude building plans from AutoCAD dwg file. ExtrudedVisual3D only result the side surface, without caps.

Rossie wrote at 2013-03-04 01:06:

Hi I had a similar requirement - but i had caps. The way I achieved it was to find the border edges of the polygon(s) and extrude them along the Z axis. But I implemented my own FindBorderEdges() method - because Helix3D's version did not entirely suit. Mainly because I wanted a contiguous list of edges - (Helix3D will put the output edges in the same sequence as the input edges - meaning that they may/may not be a contiguous list) I also wanted them in a particular winding order. I'll post my implementation - that might help you. (and perhaps the guys developing the Helix3D devs might want to use this code as well) I'll just paste in the main methods to do the work - i made a class called MeshGeometryHelper2. Let me know if i have missed anything - you might have to fiddle the source to fit your purpose.
        public static List<int> FindBorderEdges(MeshGeometry3D mesh)
            var dict = new Dictionary<ulong, int>();

            for (int i = 0; i < mesh.TriangleIndices.Count / 3; i++)
                int i0 = i * 3;
                for (int j = 0; j < 3; j++)
                    int index0 = mesh.TriangleIndices[i0 + j];
                    int index1 = mesh.TriangleIndices[i0 + (j + 1) % 3];
                    int minIndex = Math.Min(index0, index1);
                    int maxIndex = Math.Max(index1, index0);
                    ulong key = CreateKey((UInt32)minIndex, (UInt32)maxIndex);
                    if (dict.ContainsKey(key))
                        dict[key] = dict[key] + 1;
                        dict.Add(key, 1);

            var edges = new List<int>();
            foreach (var kvp in dict)
                // find edges only used by 1 triangle
                if (kvp.Value == 1)
                    uint i0, i1;
                    ReverseKey(kvp.Key, out i0, out i1);

            var borderPoints = new List<Point>();
            mesh.Positions.ToList().ForEach(p => borderPoints.Add(new Point(p.X, p.Y)));

            var result = OrganizeEdges(edges, borderPoints);
            return result;

        private static List<int> OrganizeEdges(List<int> edges, List<Point> positions)
            var visited = new Dictionary<int, bool>();
            var edgeList = new List<int>();
            var resultList = new List<int>();
            var nextIndex = -1;
            while (resultList.Count < edges.Count)
                if (nextIndex < 0)
                    for (int i = 0; i < edges.Count; i += 2)
                        if (!visited.ContainsKey(i))
                            nextIndex = edges[i];

                for (int i = 0; i < edges.Count; i += 2)
                    if (visited.ContainsKey(i))

                    int j = i + 1;
                    int k = -1;
                    if (edges[i] == nextIndex)
                        k = j;
                    else if (edges[j] == nextIndex)
                        k = i;

                    if (k >= 0)
                        var edge = edges[k];
                        visited[i] = true;
                        nextIndex = edge;
                        i = 0;

                // calculate winding order - then add to final result.
                var borderPoints = new List<Point>();
                edgeList.ForEach(ei => borderPoints.Add(positions[ei]));
                var winding = CalculateWindingOrder(borderPoints);
                if (winding > 0)

                edgeList = new List<int>();
                nextIndex = -1;

            return resultList;

        public static MeshGeometry3D Extrude(MeshGeometry3D surface, double z)
            var borderIndexes = MeshGeometryHelper2.FindBorderEdges(surface);
            var borderPoints = new List<Point3D>();
            borderIndexes.ToList().ForEach(bi => borderPoints.Add(surface.Positions[bi]));

            var topPoints = borderPoints.ToList();
            var botPoints = borderPoints.Select(p => new Point3D(p.X, p.Y, p.Z + z)).ToList();
            var allPoints = new List<Point3D>();
            var allIndexes = new List<int>();
            var allNormals = new List<Vector3D>();

            // sides.

            for (int i = 0; i < topPoints.Count; i +=2)
                int j = (i + 1) % topPoints.Count;

                allIndexes.Add(topPoints.Count + j);
                allIndexes.Add(topPoints.Count + j);
                allIndexes.Add(topPoints.Count + i);

                var a = allPoints[i].ToVector3D();
                var b = allPoints[j].ToVector3D();
                var c = allPoints[topPoints.Count + j].ToVector3D();

                var n0 = b.Subtract(a).Cross(c.Subtract(a)).Unit();

            var surfaceNormals = new List<Vector3D>();
            if (surface.Normals == null)
                surface.TriangleIndices.ToList().ForEach(i => surfaceNormals.Add(new Vector3D(0, 0, 1)));

            // top
            var count = allPoints.Count;
            var topSurfacePoints = surface.Positions.Select(p => new Point3D(p.X, p.Y, p.Z + z)).ToList();
            var topNormals = surfaceNormals.ToList();
            var topSurfaceIndexes = surface.TriangleIndices.Select(i => count + i).ToList();
            AddTriangleIndexes(topSurfaceIndexes, allIndexes, false);

            // bottom
            count = allPoints.Count;
            var botSurfacePoints = surface.Positions.ToList();
            var botNormals = surfaceNormals.Select(n => n.Flip()).ToList();
            var botSurfaceIndexes = surface.TriangleIndices.Select(i => count + i).ToList();
            AddTriangleIndexes(botSurfaceIndexes, allIndexes, true);

            var mesh = new Mesh3D(allPoints, allIndexes);
            var meshGeom = mesh.ToMeshGeometry3D();
            meshGeom.Normals = new Vector3DCollection(allNormals);

            if (z < 0) 

            var simple = Simplify(meshGeom);
            return simple;

        private static void AddTriangleIndexes(List<int> triangleIndices, List<int> allIndexes, bool reverseWindingOrder)
            for (int i = 0; i < triangleIndices.Count; i += 3)
                var i0 = triangleIndices[i + 0];
                var i1 = triangleIndices[i + 1];
                var i2 = triangleIndices[i + 2];
                if (reverseWindingOrder)
                    allIndexes.AddRange(new[] { i2, i1, i0 });
                    allIndexes.AddRange(new[] { i0, i1, i2 });

        public static void ReverseWinding(MeshGeometry3D mesh)
            var indices = mesh.TriangleIndices.ToList();
            var flippedIndices = new List<int>();
            AddTriangleIndexes(indices, flippedIndices, true);
            mesh.TriangleIndices = new System.Windows.Media.Int32Collection(flippedIndices);

       /// <summary>
        /// returns 1 for CW, -1 for CCW, 0 for unknown.
        /// </summary>
        public static int CalculateWindingOrder(IList<Point> points)
            // the sign of the 'area' of the polygon is all we are interested in.
            var area = CalculateSignedArea(points);
            if (area < 0.0)
                return 1;
            else if (area > 0.0)
                return -1;        
            return 0; // error condition - not even verts to calculate, non-simple poly, etc.

        public static double CalculateSignedArea(IList<Point> points)
            double area = 0.0;
            for (int i = 0; i < points.Count; i++)
                int j = (i + 1) % points.Count;
                area += points[i].X * points[j].Y;
                area -= points[i].Y * points[j].X;
            area /= 2.0;

            return area;


Migrate to HelixToolKit WPF to HelixToolKit SharpDX

Anonymous 10 years ago updated by anonymous 7 years ago 5
This discussion was imported from CodePlex

cedrelo wrote at 2014-02-07 08:50:


First really thanks for your work!!!!

I use HelixToolKit WPF to develop an WPF application of robot trajectory, i use import of .stl, camera, viewport3D, LineVisual3Ds.

It's works really great, but when we load large data and a lots of stl, the perfomance fall on
some computer.

Do you think it's possible to migrate the projet to the fork HelixToolKit SharpDX to improve perfomance ?
Does the fork has all the functionnality of the orginal project ?
It is possible to use HelixToolKit SharpDX inside a WPF application ?



Viewcube image

Denwood 9 years ago updated by anonymous 5 years ago 4
I want to add an image to my Helix viewcube( all 6 directions). How to do it?

Show wireframe as quads with Helix and SharpDX

Raul Burgos 9 years ago updated by alaba 3 months ago 711
Is it possible to get this effect ( Connected Mesh to QuadFaces ) in the viewportDX when a .OBJ model is readed on it?.
I'm using HelixToolkit.Wpf.SharpDX.
Somebody can post a example?
Thanks in advance.


Bug \ display artifact 3d model

ilya 2 years ago updated 2 years ago 1


The display of elements is incorrect, as if it is multiplying (no overlays).

What can be wrong?

Image 188


ATS selidbe

ATS 3 years ago updated by ไอยดา สุรีวงค์ 3 years ago 2

ATS agencija za selidbe Beograd posluje više od 24 godine.Tokom vremena stekli smo znanje,mudrost i iskustvo u našoj branši.Kao najstarija transportna i selidbena agencija u regionu, svesni smo koliko je za naše klijente važno da se presele kvalitetno, efikasno i sigurno uz poštovanje vremenskih rokova i dogovorenih usluga.Stoga poslujemo u tom smeru,kako bismo uslugu selidbe održali na visokom nivou i na zadovoljstvo naših klijenata.ATS agencija za transport i selidbe pruža niz objedinjenih usluga u domenu selidbe i skladištenja.


Touch operation issues

greentea175 5 years ago updated by Fdjjj Duuree 2 years ago 210


The sample ModelViewer is operated by touch.

Open \Models\obj\wall12.obj.

After expanding wall12.obj,

Even if you move your finger over this model, you cannot rotate or zoom in smoothly.

With mouse operation, you can rotate and zoom smoothly.

It seems that OnManipulationDelta() of CameraController.cs is hard to occur. . .

\Models\obj\leone.3DBuilder.obj can be rotated and enlarged smoothly by touch operation.

I want to rotate and zoom in smoothly even with touch operation.

Please tell me how.

Thank you.