Ejemplo n.º 1
0
    List <int> getAllNeighborTriangelIndex(ref Vector3 movablePos, int overlapCount, out Collider nearestC)
    {
        // 只有1個的話
        if (overlapCount == 1)
        {
            var c = colliderList[0];
            nearestC = c;
            return(c.GetComponent <GravitySensor>().neighborTriangleIndex);
        }

        // 找出最近的GS(1個以上)
        // 有甜甜圈的交界處的GravitySensor,會漏掉一些相鄰資訊
        var vertexInfoList = new List <VertexInfo>();

        for (int i = 0; i < overlapCount; i++)
        {
            Collider c       = colliderList[i];
            var      vPos    = c.transform.position;
            var      vNormal = c.transform.forward;
            vertexInfoList.Add(new VertexInfo()
            {
                position = vPos, normal = vNormal, distance = (vPos - movablePos).sqrMagnitude, collider = c
            });
        }

        vertexInfoList.Sort(
            (VertexInfo a, VertexInfo b) =>
        {
            if (a.distance < b.distance)
            {
                return(-1);
            }
            else
            {
                return(1);
            }
        }
            );

        nearestC = vertexInfoList[0].collider;

        // 最近的2個
        var gs0          = vertexInfoList[0].collider.GetComponent <GravitySensor>();
        var gs1          = vertexInfoList[1].collider.GetComponent <GravitySensor>();
        var distance_0_1 = (gs0.transform.position - gs1.transform.position).magnitude;

        if (GeometryTool.floatEqual(distance_0_1, 0))
        {
            // Debug.Log("GravitySensor合體");
            List <int> list = new List <int>();
            list.AddRange(gs0.neighborTriangleIndex);
            list.AddRange(gs1.neighborTriangleIndex);
            return(list);
        }
        else
        {
            return(gs0.neighborTriangleIndex);
        }
    }