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!
+4

Tubidy Video Music Search Engine

tubidyc 3 years ago in New feature updated by anonymous 5 months ago 4

Tubidy is a website which you actually meant for mobile phones, where you can play music, watch videos and do other similar tasks for free. You can even listen to Tubidy music and Tubidy video with the help of Tubidy free website. The website is worth visiting, if you are having an efficient mobile device. Once you visit the website you can see the power of Tubidy technology for your complete entertainment. The website is actually free to use, but you can see ads, which is one of the ways to gather revenue for the website. Thus open and enjoy the website.

Tubidy is a mobile video search engine which makes it easy to search for your favorite tubidy mp3, tubidy clips, movies, cartoons and many more. Disover upcoming cartoons, play mobile videos for free wherever you are, whenever you want. Download new and trending tubidy mp3 songs, search directly for tracks, artists and albums. Find new movies now playing in theaters, get movie times, watch trailers, browse tubidy videos and the hottest TV shows online.

3GP This video file type is made specifically with 3G smartphones in mind so that playback is the best it can possibly be. It also works on most 2G and 4G phones as well. The 3GP file type is available in either HD or Regular quality. Users can also choose to divide the file anywhere from 2-4 parts by choosing the 3GP Regular Parts options, or they can download 10 second previews in 3GP format to see if the file is what they want.

MP3 MP3 stands for MPEG-1 Audio Layer recorded in a compressed audio format and this format is given to the voices.

MP4 despite the similarity in each name, is not a continuation of MP3s. MP3 and MP4 formats are quite different from each other. MP3, MPEG-1 Audio Layer 3 stands for.

VideosThis video file type is notoriously difficult to play on smartphones, so computer users will get more use out of this one. Compared to Windows Media Player video files, the mp4 takes up significantly less space and is a favorite of users with video editing software, as mp4s are compatible with most programs.

+3

Manipulator OnMouseDown event is not firing

Mike1955e 4 years ago in Defect? 0

I recently downloaded the latest code for the toolkit. I then tried out all of the demos and found that the manipulator demo does not work. All of the manipulators remain stationary. I placed a breakpoint at the OnMouseDown event and it was never reached. Can someone explain what I'm missing?

Media3D WPF
+3

FEX: An example of some capabilities of Helix!

everytimer 5 years ago in Information updated by Wim Huyghe 5 years ago 8
Hello dear Helix mates!
I always loved Helix examples library: many examples and every one with something particularly interesting.
Last few months I've been developing a small but fairly complex application that is based on Helix Toolkit (WPF). If you are developing using this library you might be interested in seeing some of its features!





I have written a small article covering some highlights for Helix Toolkit users:

  • Custom design Orientation Cube
  • More ScreenSpaceVisual3D
  • Rotation around screen perpendicular axis
  • Improving performance by hiding mesh visuals
  • Several layers to enable hover visuals, selection and more
  • Transparency and sorting
  • Hit detection even not directly over the Visual

you can read it here:

www.f-e-x.com/helix.html

PD. FEX is mainly for engineers who work with Finite Element Method models (in this case Nastran). I've attached an example for all of you in order to be able to experiment and play a little bit.

It would be awesome to hear back from you of what do you think of this!

Cheers

WPF
+2

Is there a functionality for model hit with some tolerance?

kotsabiukmv98 1 year ago in Question updated by anonymous 3 months ago 0

For example, when I try hit model 3 pixels aside model will be hit.

+2

AddExtrudedGeometry problem

MCv 2 years ago in Question 0

Hi Everyone,

I'm trying to create a simple 3d object, extruded one out of 4 pairs of 2D coordinates. But what I'm getting - is a 2d object. I can't understand: it's a my mistake or something else is wrong?


Here is my xaml code:

<Grid>
        <helix:HelixViewport3D x:Name="view1" Background="LightBlue" IsHeadLightEnabled="True" >

            <helix:MeshGeometryVisual3D  MeshGeometry="{Binding GlassGeometry}" Fill="White"/>
        </helix:HelixViewport3D>
    </Grid>


And code behind method:

  public MeshGeometry3D GlassGeometry
        {
            get
            {
                var builder = new MeshBuilder(true, true);                 List<Point> pints2D = new List<Point>()
                {
                    new Point(-1, -1),
                    new Point(0, -1),
                    new Point(1, 1),
                    new Point(-1, 1)
                };
                Point3D sp = new Point3D(0, 0, 0);
                Point3D ep = new Point3D(0, 0, 1);

               builder.AddExtrudedGeometry(pints2D, new Vector3D(1,0, 0), sp, ep);

                return builder.ToMesh(true);
            }

What I'm expecting to see is just a cube(in this case). But in the future I would like to get something like this:



But now my result looks like:

Or is it a possibility to create a 3d Object in code using 8 pairs of 3D coordinates?

Thank you in advance.

WPF
+2

Selidbe - saveti, preselite se što lakše

Marko Nikolic 3 years ago in Information updated by anonymous 5 months ago 7

Put do preseljenja u novi dom prati dosta obaveza, organizacije, rada pa cesto kod vecine ljudi I dosta stresa I napora. Ako se svi potrebni radovi u novom stanu ili kuci zavrse na vreme od useljenja mozete napraviti cak I zabavnu akciju u kojoj ce naravno ucestvovati cela porodica.

Vratimo se na prvobitno stanje. Jos uvek ste u svom trenutnom zivotnom prostoru I predstoji Vam selidba. Najvise bi Vam odgovarao carobni stapic kojim biste se jednim potezom prebacili na novu destinaciju ali… Naoruzajte se voljom za rad I krenite I to prvo od onih stvari I predmeta koji Vam u ovom trenutku nisu potrebni. Kutija po kutija I Vi se polako oprastate od Vase dnevne, spavace sobe I ostalih starih prostorija za koje Vas veze gomila uspomena. Ako svaki spakovani paket, kutiju ili kesu obelezite odnosno napisete sta ste unutra spakovali to ce Vam znatno olaksati raspakivanje.

Nakon toga morate napraviti precizan plan o transportu svih pripremljenih paketa kao i namestaja, tehnike I sl. U eri kompjutera I interneta to je veoma jednostavno, jednim klikom po Vasoj tastaturi pronadjite ekipu koja ce selidbu obaviti u najkracem roku.

Ako ste sve pripremili, radnici firme selidbe beograd koja se na profesionalan nacin bavi svim vrstama selidbi moze biti ispred Vasih vrata. Nakon iznosenja I utovara, kamion sa Vasim stvarima moze da krene. Vama nista drugo ne preostaje vec da svoj dosadasnji dom zakljucate I krenete, I naravno sa sobom ponesete lepe uspomene iz njega.

Niste ni trepnuli a Vi ste vec u svom novom domu I vreme je za raspakovanje. Kako ne bi doslo do nereda I zbrke sada kada ste medju gomilom kutija I paketa najbolje je drzati se sistema koji ste pratili kao I kada ste se pakovali. Ponovo kutija po kutija, bez zurbe I napetosti I nove prostorije ce polako bivati opremljene. Posto niste u mogucnosti odmah da spremate obroke I kuhinju za tako kratko vreme osposobite za koriscenje, porucite nesto od hrane, spakujte decu u krevet I u miru provedite ostatak veceri.

+2

Does Helix Toolkit work on UWP?

Garry Taylor 3 years ago 0

Hi everyone,

Just a quick question, does Helix Toolkit work on UWP? I've tried to build it, but lots of errors, so before I start looking into it further, is it even supposed to work?


Helix Toolkit has been amazing on WPF, just want to know if I can use on a UWP app?


Thanks


Garry

+2

Reference bugs in examples/source?

zangatsu 4 years ago in Question updated 4 years ago 0

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...


SharpDX WPF
+2

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

Anonymous 6 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;
                    }
                    else
                    {
                        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);
                    edges.Add((int)i0);
                    edges.Add((int)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];
                            break;
                        }
                    }
                }

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

                    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;
                        edgeList.Add(nextIndex);
                        edgeList.Add(edge);
                        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.Reverse();

                resultList.AddRange(edgeList);
                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.
            allPoints.AddRange(topPoints);
            allPoints.AddRange(botPoints);

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

                allIndexes.Add(i);
                allIndexes.Add(j);
                allIndexes.Add(topPoints.Count + j);
                allIndexes.Add(topPoints.Count + j);
                allIndexes.Add(topPoints.Count + i);
                allIndexes.Add(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();
                allNormals.Add(n0);
                allNormals.Add(n0);
                allNormals.Add(n0);
                allNormals.Add(n0);
            }

            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();
            allPoints.AddRange(topSurfacePoints);
            allNormals.AddRange(topNormals);
            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();
            allPoints.AddRange(botSurfacePoints);
            allNormals.AddRange(botNormals);
            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) 
                ReverseWinding(meshGeom);

            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 });
                else
                    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;
        }