Esempio n. 1
0
    public bool GetSphereSplineIntersection(Vector3 sphCenter, float sphRadius, int startIndex, int searchDir,
                                            out Vector3 pos, out Vector3 normal, out Vector3 tangent, out int segmentIndex)
    {                                           // searchDir est égal à 1 ou -1
        searchDir = (int)Mathf.Sign(searchDir); // au cas où searchDir serait autre chose que 1 ou -1

        pos          = Vector3.zero;
        normal       = Vector3.zero;
        tangent      = Vector3.zero;
        segmentIndex = -1;

        int n = 0;

        while (n < NPts)
        {
            int tmpIndex1 = startIndex + n * searchDir;
            while (tmpIndex1 < 0)
            {
                tmpIndex1 += NPts;
            }
            int tmpIndex2 = startIndex + (n + 1) * searchDir;
            while (tmpIndex2 < 0)
            {
                tmpIndex2 += NPts;
            }

            Vector3 pt1 = m_Pts[tmpIndex1];
            Vector3 pt2 = m_Pts[tmpIndex2];

            Vector3 normal1 = Vector3.zero, normal2 = Vector3.zero;
            if (m_HasNormals)
            {
                normal1 = m_Normals[tmpIndex1];
                normal2 = m_Normals[tmpIndex2];
            }

            Vector3 tangent1 = Vector3.zero, tangent2 = Vector3.zero;
            tangent1 = m_Tangents[tmpIndex1];
            tangent2 = m_Tangents[tmpIndex2];

            Vector3 intersectionPt = Vector3.zero;
            if (Intersections.OrientedSegmentSphereIntersection_3D(pt1, pt2, sphCenter, sphRadius, out intersectionPt))
            {
                pos = intersectionPt;
                float k = Vector3.Distance(intersectionPt, pt1) / Vector3.Distance(pt1, pt2);
                if (m_HasNormals)
                {
                    normal = Vector3.Slerp(normal1, normal2, k);
                }
                tangent = Vector3.Slerp(tangent1, tangent2, k).normalized;

                segmentIndex = searchDir > 0 ? tmpIndex1 : tmpIndex2;
                return(true);
            }
            n++;
        }
        return(false);
    }