示例#1
0
        void Start()
        {
            GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

            cube.transform.position = SS_Common.GetLineIntersection(p0.position, p1.position, q0.position, q1.position);
        }
示例#2
0
        /*   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;
            }
        }