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