コード例 #1
0
        private Mesh buildCircleMesh()
        {
            Mesh mesh     = new Mesh();
            var  vertices = new List <Vector3>();
            var  colors   = new List <Color>();
            var  indices  = new List <int>();

            List <Vector3> partMeshTop = Circles.CreatePartMesh(0, 2 * Mathf.PI, 0.5f, _segments);

            for (int vertex = 0; vertex < partMeshTop.Count; vertex++)
            {
                partMeshTop[vertex] = new Vector3(partMeshTop[vertex].x, 1, partMeshTop[vertex].y);
            }
            vertices.AddRange(partMeshTop);
            List <Vector3> partMeshBottom = Circles.CreatePartMesh(0, 2 * Mathf.PI, 0.5f, _segments);

            for (int vertex = 0; vertex < partMeshBottom.Count; vertex++)
            {
                partMeshBottom[vertex] = new Vector3(partMeshBottom[vertex].x, 0, partMeshBottom[vertex].y);
            }
            vertices.AddRange(partMeshBottom);
            List <int> round = Circles.CreateRound(vertices.Count - partMeshBottom.Count - partMeshTop.Count, partMeshTop.Count - 1, 0);

            indices.AddRange(round);

            vertices.Add(new Vector3(0, 1, 0));
            List <Vector3> partMeshTopPlate = Circles.CreatePartMesh(0, 2 * Mathf.PI, 0.5f, _segments);

            partMeshTopPlate[0] = new Vector3(partMeshTopPlate[0].x, 1, partMeshTopPlate[0].y);
            for (int vertex = 1; vertex < partMeshTopPlate.Count; vertex++)
            {
                partMeshTopPlate[vertex] = new Vector3(partMeshTopPlate[vertex].x, 1, partMeshTopPlate[vertex].y);
                indices.Add(vertices.Count - 1);
                indices.Add(vertices.Count + vertex);
                indices.Add(vertices.Count - 1 + vertex);
            }
            vertices.AddRange(partMeshTopPlate);

            mesh.name     = "CylinderTopPlate";
            mesh.vertices = vertices.ToArray();
            mesh.SetIndices(indices.ToArray(), MeshTopology.Triangles, 0);
            mesh.RecalculateNormals();
            return(mesh);
        }
コード例 #2
0
ファイル: PieChart3D.cs プロジェクト: andyhill9/MR_Data_Surv
        protected override void RebuildVisualization()
        {
            if (_presenter == null || _presenter.NumberOfDimensions < 1)
            {
                Debug.LogError("Presenter is either null or has not enough dimensions to represent this visualization");
                return;
            }
            var vertices = new List <Vector3>();
            var colors   = new List <Color>();
            var indices  = new List <int>();

            int   offset   = (int)_presenter.SelectedMinItem;
            int   length   = (int)_presenter.SelectedMaxItem - offset;
            float maxValue = VisViewHelper.GetGlobalMaximum(_presenter);
            float radius   = 0.5f * _size.x;
            float divisor  = 0;

            //TODO find better way to determine divisor (what 100% is)
            for (int dimIndex = 0; dimIndex < _presenter.NumberOfDimensions; dimIndex++)
            {
                divisor += VisViewHelper.GetItemValueAbsolute(_presenter, dimIndex, _valueIndex + offset) / maxValue;
            }
            MultiDimDataPresenter presenter = (MultiDimDataPresenter)_presenter;

            Debug.Log(presenter.CaptionDimension.GetStringValue(ValueIndex));

            float startAngle = 0;

            for (int dimIndex = 0; dimIndex < _presenter.NumberOfDimensions; dimIndex++)
            {
                float height = -(VisViewHelper.GetItemValueAbsolute(_presenter, dimIndex, _3DIndex + offset) / maxValue) * _size.z;

                vertices.Add(new Vector3(0, 0, height));
                int   zeroTop  = vertices.Count - 1;
                float sumOfDim = VisViewHelper.GetItemValueAbsolute(_presenter, dimIndex, _valueIndex + offset) / maxValue;
                float part     = sumOfDim / divisor;
                colors.Add(_style.GetColorCategorical(dimIndex, part));
                float angle    = part * Mathf.PI * 2;
                float endAngle = startAngle + angle;

                List <Vector3> partMeshTop = Circles.CreatePartMesh(startAngle, endAngle, radius, _segments);
                for (int i = 0; i < partMeshTop.Count; i++)
                {
                    partMeshTop[i] = new Vector3(partMeshTop[i].x, partMeshTop[i].y, height);
                }
                for (int vertex = 1; vertex < partMeshTop.Count; vertex++)
                {
                    colors.Add(_style.GetColorCategorical(dimIndex, part));
                    indices.Add(vertices.Count - 1);
                    indices.Add(vertices.Count + vertex);
                    indices.Add(vertices.Count - 1 + vertex);
                }
                colors.Add(_style.GetColorCategorical(dimIndex, part));
                vertices.AddRange(partMeshTop);

                vertices.Add(Vector3.zero);
                int zeroBottom = vertices.Count - 1;
                colors.Add(_style.GetColorCategorical(dimIndex, part));
                List <Vector3> partMeshBottom = Circles.CreatePartMesh(startAngle, endAngle, radius, _segments);
                for (int vertex = 1; vertex < partMeshBottom.Count; vertex++)
                {
                    colors.Add(_style.GetColorCategorical(dimIndex, part));
                    indices.Add(vertices.Count - 1);
                    indices.Add(vertices.Count - 1 + vertex);
                    indices.Add(vertices.Count + vertex);
                }
                colors.Add(_style.GetColorCategorical(dimIndex, part));
                vertices.AddRange(partMeshBottom);

                //adding side quads
                int[] tris = new int[] { zeroTop, zeroTop + 1, zeroBottom + 1, zeroTop, zeroBottom + 1, zeroBottom, zeroTop, vertices.Count - 1, zeroBottom - 1, zeroTop, zeroBottom, vertices.Count - 1 };
                indices.AddRange(tris);

                //adding rounds
                List <int> round = Circles.CreateRound(vertices.Count - partMeshBottom.Count - partMeshTop.Count - 1, partMeshTop.Count - 1, 1);
                indices.AddRange(round);
                startAngle = endAngle;
            }
            var mesh = new Mesh();

            mesh.name     = "PieChart3DMesh";
            mesh.vertices = vertices.ToArray();
            mesh.colors   = colors.ToArray();
            mesh.SetIndices(indices.ToArray(), MeshTopology.Triangles, 0);
            mesh.RecalculateNormals();
            var meshFilter = GetComponent <MeshFilter>();

            meshFilter.sharedMesh = mesh;
        }
コード例 #3
0
ファイル: PieChart2D.cs プロジェクト: andyhill9/MR_Data_Surv
        protected override void RebuildVisualization()
        {
            if (_presenter == null || _presenter.NumberOfDimensions < 1)
            {
                Debug.LogError("Presenter is either null or has not enough dimensions to represent this visualization");
                return;
            }
            var vertices = new List <Vector3>();
            var normals  = new List <Vector3>();
            var colors   = new List <Color>();
            var indices  = new List <int>();

            int   offset   = (int)_presenter.SelectedMinItem;
            int   length   = (int)_presenter.SelectedMaxItem - offset;
            float maxValue = VisViewHelper.GetGlobalMaximum(_presenter);
            float radius   = 0.5f * _size.x;
            float divisor  = 0;

            //TODO find better way to determine divisor (what 100% is)
            for (int dimIndex = 0; dimIndex < _presenter.NumberOfDimensions; dimIndex++)
            {
                divisor += VisViewHelper.GetItemValueAbsolute(_presenter, dimIndex, _valueIndex + offset) / maxValue;
            }
            MultiDimDataPresenter presenter = (MultiDimDataPresenter)_presenter;

            float startAngle = 0;

            for (int dimIndex = 0; dimIndex < _presenter.NumberOfDimensions; dimIndex++)
            {
                vertices.Add(Vector3.zero);
                normals.Add(-Vector3.forward);
                float sumOfDim = VisViewHelper.GetItemValueAbsolute(_presenter, dimIndex, _valueIndex + offset) / maxValue;
                float part     = sumOfDim / divisor;
                colors.Add(_style.GetColorCategorical(dimIndex, part));
                float          angle    = part * Mathf.PI * 2;
                float          endAngle = startAngle + angle;
                List <Vector3> partMesh = Circles.CreatePartMesh(startAngle, endAngle, radius, _segments);
                for (int vertex = 1; vertex < partMesh.Count; vertex++)
                {
                    colors.Add(_style.GetColorCategorical(dimIndex, part));
                    normals.Add(-Vector3.forward);
                    indices.Add(vertices.Count - 1);
                    indices.Add(vertices.Count + vertex);
                    indices.Add(vertices.Count - 1 + vertex);
                }
                colors.Add(_style.GetColorCategorical(dimIndex, part));
                normals.Add(-Vector3.forward);
                startAngle = endAngle;
                vertices.AddRange(partMesh);
            }
            var mesh = new Mesh();

            mesh.name     = "PieChart2DMesh";
            mesh.vertices = vertices.ToArray();
            mesh.normals  = normals.ToArray();
            mesh.colors   = colors.ToArray();
            mesh.SetIndices(indices.ToArray(), MeshTopology.Triangles, 0);

            var meshFilter = GetComponent <MeshFilter>();

            meshFilter.sharedMesh = mesh;
        }