コード例 #1
0
    /// <summary>
    ///     function to create control points
    /// </summary>
    public void CreateControlPoints()
    {
        //Merge the same CPs that have different tags(belong to different segments)(with hierarchy and tree node)
        //loop for the different segments
        cpDataList.Clear();

        for (var i = 0; i < readJson.treeNodeLevelx.Count; i++)
        {
            for (var j = 0; j < readJson.treeNodeLevelx[i].GetData().cageVerticesIndex.Count; j++)
            {
                var cpData = new ControlPointsData();
                cpData = cpDataList.Find(x => x.goIndex == readJson.treeNodeLevelx[i].GetData().cageVerticesIndex[j]);
                if (cpData != null)
                {
                    var getColor = readJson.treeNodeLevelx[i].GetData().color;
                    cpData.goTags.Add(readJson.treeNodeLevelx[i].GetData().tag);

                    cpData.goLevel = readJson.treeNodeLevelx[i].GetLevel();

                    cpData.goColor.Add(new Color(getColor[0], getColor[1], getColor[2], 255) / 255);
                }
                else
                {
                    cpData = new ControlPointsData();
                    //cpData.go = cube;
                    var getColor = readJson.treeNodeLevelx[i].GetData().color;
                    cpData.goIndex = readJson.treeNodeLevelx[i].GetData().cageVerticesIndex[j];
                    cpData.goTags.Add(readJson.treeNodeLevelx[i].GetData().tag);

                    cpData.goLevel = readJson.treeNodeLevelx[i].GetLevel();

                    cpData.goColor.Add(new Color(getColor[0], getColor[1], getColor[2], 255) / 255);
                    //Debug.Log("cpData.goTags vertices" + cpData.goTags.Last());
                    cpDataList.Add(cpData);
                }
            }
        }

        // compute(mix) the color for each Control Point; add level for each CP
        for (var i = 0; i < cpDataList.Count; i++)
        {
            var mycolor = new Color(0, 0, 0, 0);
            for (var j = 0; j < cpDataList[i].goColor.Count; j++)
            {
                mycolor += cpDataList[i].goColor[j];
            }
            mycolor /= cpDataList[i].goColor.Count;
            cpDataList[i].goColor.Clear();
            cpDataList[i].goColor.Add(mycolor);
        }


        CreateMaterial();

        //load the defaut materials for the segments on the cage(with hierarchy)
        materialGroup1.Clear();
        outlineMaterialGroup1.Clear();
        for (var k = 0; k < colorAmountsOfDifferentlevels; k++)
        {
            materialGroup1.Add(
                Resources.Load(string.Format("level{0}, Default Material Group {1}", cpDataList.Last().goLevel, k),
                               typeof(Material)) as Material);
            outlineMaterialGroup1.Add(
                Resources.Load(string.Format("level{0}, Outlined Material Group {1}", cpDataList.Last().goLevel, k),
                               typeof(Material)) as Material);
        }

        //create all CPs
        if (controlPointList.Count == 0)
        {
            for (var i = 0; i < meshCage.vertices.Length; i++)
            {
                var ControlPoint = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                var K            = initialControlPointPosition[i];
                ControlPoint.transform.position   = new Vector3(K[0], K[1], K[2]);
                ControlPoint.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f);
                ControlPoint.tag  = selectableTag;
                ControlPoint.name = "Control Point " + goCounter;
                interactCP.Add(ControlPoint.AddComponent <InteractionBehaviour>());
                ControlPoint.GetComponent <Rigidbody>().useGravity  = false;
                ControlPoint.GetComponent <Rigidbody>().isKinematic = true;
                ControlPoint.AddComponent <ChangeColor>();

                goCounter++;
                ControlPoint.transform.parent = _initializedControlPoints;
                controlPointList.Add(ControlPoint);
            }
        }


        //color, add tags to CPs of different
        for (var i = 0; i < cpDataList.Count; i++)
        {
            for (var j = 0; j < controlPointList.Count; j++)
            {
                if (controlPointList[j].transform.position == cageVertices[cpDataList[i].goIndex])
                {
                    cpDataList[i].go = controlPointList[j];
                    var tagSystem0 = cpDataList[i].go.GetComponent <CustomTag>();
                    if (tagSystem0 == null)
                    {
                        cpDataList[i].go.AddComponent <CustomTag>();
                    }
                    var tagSystem1 = cpDataList[i].go.GetComponent <CustomTag>();
                    tagSystem1.Clear();

                    for (var k = 0; k < cpDataList[i].goTags.Count; k++)
                    {
                        tagSystem1.Add(cpDataList[i].goTags[k]);
                    }

                    var controlPointRenderer = cpDataList[i].go.GetComponent <MeshRenderer>();
                    //Find the correct material for this CP
                    for (var k = 0; k < materialGroup1.Count; k++)
                    {
                        if (!treatSelectionManager.selectionList.Contains(cpDataList[i].go.transform))
                        {
                            if (cpDataList[i].goColor[0] == materialGroup1[k].color)
                            {
                                controlPointRenderer.material = materialGroup1[k];
                                //Debug.Log("this is a string inside add material to class 0");
                                cpDataList[i].defautMaterial = materialGroup1[k];
                                //Debug.Log("this is a string inside add material to class 1");
                                cpDataList[i].outlineMaterial = outlineMaterialGroup1[k];
                            }
                        }
                    }
                }
            }
        }

        //find out the control points that belong to no segment in the cpDatalist, assign them materials etc.
        for (var i = 0; i < controlPointList.Count; i++)
        {
            var cpData = new ControlPointsData();
            cpData.go = controlPointList[i];
            var controlPointsOfNoSegment = cpDataList.Find(x => x.go.name == controlPointList[i].name);
            if (controlPointsOfNoSegment == null && !treatSelectionManager.selectionList.Contains(cpData.go.transform)
                ) //belong to the non=annotated segment
            {
                cpData.go.GetComponent <MeshRenderer>().material = defaultMaterial;
                cpData.defautMaterial  = defaultMaterial;
                cpData.outlineMaterial = outlineMaterial;
                cpData.goColor.Add(new Color(0, 0, 0, 1));
                cpDataList.Add(cpData);
            }
        }

        //make the transforms inside the _newPosCP have the right order
        _newPosCP.Clear();
        for (var i = 0; i < cageVertices.Length; i++)
        {
            for (var j = 0; j < controlPointList.Count; j++)
            {
                if (controlPointList[j].transform.position == cageVertices[i])
                {
                    _newPosCP.Add(controlPointList[j].transform);
                    PositionControlPoints.Add(controlPointList[j].transform);
                }
            }
        }
    }
コード例 #2
0
    // Start is called before the first frame update
    void Start()
    {
        GameObject obj0 = new GameObject();
        GameObject obj1 = new GameObject();
        GameObject obj2 = new GameObject();
        GameObject obj3 = new GameObject();
        GameObject obj4 = new GameObject();

        List <ControlPointsData> cpDataList = new List <ControlPointsData>();

        cpDataList.Add(new ControlPointsData {/*go = obj0,*/
            goTags = { "little finger", "palm" }, goColor = { Color.red }, goIndex = 0
        });
        cpDataList.Add(new ControlPointsData {/*go = obj1,*/
            goTags = { "little finger" }, goColor = { Color.red }, goIndex = 1
        });
        cpDataList.Add(new ControlPointsData {/*go = obj2,*/
            goTags = { "pinky" }, goColor = { Color.red }, goIndex = 0
        });
        cpDataList.Add(new ControlPointsData {/*go = obj3,*/
            goTags = { "ring finger" }, goColor = { Color.red }, goIndex = 0
        });
        cpDataList.Add(new ControlPointsData {/*go = obj4,*/
            goTags = { "palm" }, goColor = { Color.red }, goIndex = 1
        });

        List <ControlPointsData> result = new List <ControlPointsData>();

        while (cpDataList.Count > 0)
        {
            ControlPointsData m = cpDataList[0];
            cpDataList.RemoveAt(0);
            List <ControlPointsData> listB = new List <ControlPointsData>();
            foreach (var VARIABLE in cpDataList)
            {
                if (VARIABLE.goIndex.Equals(m.goIndex))
                {
                    m.goTags.Add(VARIABLE.goTags[0]);
                    m.goColor[0] = (VARIABLE.goColor[0] + m.goColor[0]) / 2;
                }
                else
                {
                    listB.Add(VARIABLE);
                }
            }
            cpDataList = listB;
            result.Add(m);
        }

        foreach (var VARIABLE in result)
        {
            Debug.Log("start of segment");

            Debug.Log(VARIABLE.goIndex.ToString());

            foreach (var item in VARIABLE.goTags)
            {
                Debug.Log(item.ToString());
            }
            Debug.Log("finish of segment");
        }
    }