void Start() { GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position = SS_Common.GetLineIntersection(p0.position, p1.position, q0.position, q1.position); }
/* RECALCULATE SMOOTH * Algorithm based on : http://www.efg2.com/Lab/Graphics/Jean-YvesQueinecBezierCurves.htm */ void RecalculateSmoothKnot(ShapeElement element, int knotIndex) { //Debug.Log("recalculating index " + knotIndex.ToString()); //Local Variables bool isLast = (knotIndex == element.knots.Length - 1); bool isFirst = (knotIndex == 0); if (!isLast && !isFirst) { //GET THE POINTS TO BE USED Vector3 k0Pos = element.knots[knotIndex - 1].KWorldPos(transform); Vector3 k1Pos = element.knots[knotIndex].KWorldPos(transform); Vector3 k2Pos = element.knots[knotIndex + 1].KWorldPos(transform); //GET THE OFFSETED LINE //Get base Vector Vector3 BaseVec = k0Pos - k2Pos; float baseVecHalfLenght = Vector3.Magnitude(BaseVec) / 2; Vector3 q0 = k1Pos + Vector3.Normalize(BaseVec) * baseVecHalfLenght; Vector3 q1 = k1Pos + Vector3.Normalize(-BaseVec) * baseVecHalfLenght; //GET THE IN TANGENT //GET k2-k1 Vector3 Vector3 k2k1Vec = k2Pos - k1Pos; //Get the smoothed point dist float smoothPoint = k2k1Vec.magnitude / 4; Vector3 pIn0 = k1Pos + Vector3.Normalize(k2k1Vec) * smoothPoint; Vector3 pIn1 = Vector3.Lerp(k0Pos, k1Pos, 0.5f); Vector3 inTangent = SS_Common.GetLineIntersection(q0, q1, pIn0, pIn1); //ASSIGN THE TANGENT element.knots[knotIndex].kHandleIn = inTangent - k1Pos; //GET THE OUT TANGENT Vector3 k0k1Vec = k0Pos - k1Pos; //Get the smoothed point dist smoothPoint = k0k1Vec.magnitude / 4; Vector3 pOut0 = k1Pos + Vector3.Normalize(k0k1Vec) * smoothPoint; Vector3 pOut1 = Vector3.Lerp(k1Pos, k2Pos, 0.5f); Vector3 outTangent = SS_Common.GetLineIntersection(q0, q1, pOut0, pOut1); //ASSIGN THE TANGENT element.knots[knotIndex].kHandleOut = k1Pos - outTangent; } if (isFirst) //We only calculate the OutTangent { Vector3 k0Pos = element.knots[0].KWorldPos(transform); Vector3 k1Pos = element.knots[1].KWorldPos(transform); Vector3 k2Pos = element.knots[2].KWorldPos(transform); //FIRST LINE P //Midpoint of knot[0] , knot[1] = "P0" Vector3 p0 = Vector3.Lerp(k0Pos, k1Pos, 0.5f); //Dir of knot[2] - knot[1] = k2k1Dir Vector3 k2k1Dir = k2Pos - k1Pos; //Half distance between knot[2] - knot[1] = k2k1halfDist float k2k1HalfDist = k2k1Dir.magnitude / 2; //Get Point starting at "P0" traveling "k2k1halfDist" in "k2k1Dir" direction = "P1" Vector3 p1 = p0 + Vector3.Normalize(k2k1Dir) * k2k1HalfDist; //SECOND LINE K //K0 = knot[0] Vector3 q0 = k0Pos; //Get vector from knot[0] to knot[2] = "k0k2Vector" Vector3 k0k2Vector = k2Pos - k0Pos; //Get a quarter of the length of "k0k1Vector" = "smoothLength" float smoothLength = Vector3.Magnitude(k0k2Vector) / 4; //K1 = Starting at P1 travel "smoothLength" along "k0k2Vector" direction Vector3 q1 = p1 + Vector3.Normalize(k0k2Vector) * smoothLength; //GET INTERSECTION Vector3 intersection = SS_Common.GetLineIntersection(p0, p1, q0, q1); element.knots[0].kHandleOut = intersection - k0Pos; } if (isLast) //We only calculate the inTangent { Vector3 k0Pos = element.knots[knotIndex].KWorldPos(transform); Vector3 k1Pos = element.knots[knotIndex - 1].KWorldPos(transform); Vector3 k2Pos = element.knots[knotIndex - 2].KWorldPos(transform); //FIRST LINE P //Midpoint of knot[0] , knot[1] = "P0" Vector3 p0 = Vector3.Lerp(k0Pos, k1Pos, 0.5f); //Dir of knot[2] - knot[1] = k2k1Dir Vector3 k2k1Dir = k2Pos - k1Pos; //Half distance between knot[2] - knot[1] = k2k1halfDist float k2k1HalfDist = k2k1Dir.magnitude / 2; //Get Point starting at "P0" traveling "k2k1halfDist" in "k2k1Dir" direction = "P1" Vector3 p1 = p0 + Vector3.Normalize(k2k1Dir) * k2k1HalfDist; //SECOND LINE K //K0 = knot[0] Vector3 q0 = k0Pos; //Get vector from knot[0] to knot[2] = "k0k2Vector" Vector3 k0k2Vector = k2Pos - k0Pos; //Get a quarter of the length of "k0k1Vector" = "smoothLength" float smoothLength = Vector3.Magnitude(k0k2Vector) / 4; //K1 = Starting at P1 travel "smoothLength" along "k0k2Vector" direction Vector3 q1 = p1 + Vector3.Normalize(k0k2Vector) * smoothLength; //GET INTERSECTION Vector3 intersection = SS_Common.GetLineIntersection(p0, p1, q0, q1); element.knots[knotIndex].kHandleIn = intersection - k0Pos; } }