예제 #1
0
        public static RadType FinnRadType(string typeTegn)
        {
            RadType radType = Udefinert;

            switch (typeTegn)
            {
            case "G":
                radType = VaktStart;
                break;

            case "f":
                radType = PauseStart;
                break;

            case "w":
                radType = PauseSlutt;
                break;
            }

            return(radType);
        }
    public static void IK(GameObject aObj, GameObject bObj, GameObject cObj, GameObject tObj, float RotPsc, RadType RT = RadType.Not, GameObject pObj = null)
    {
        if (cCube == null)
        {
            cCube = new GameObject("calCube");
        }

        aObj.transform.localEulerAngles = new Vector3(0f, 0f, 0f);
        bObj.transform.localEulerAngles = new Vector3(0f, 0f, 0f);

        float atLen = Vector3.Distance(aObj.transform.position, tObj.transform.position);
        float abLen = Vector3.Distance(aObj.transform.position, bObj.transform.position);
        float bcLen = Vector3.Distance(bObj.transform.position, cObj.transform.position);


        float calic = (((abLen * abLen) + (bcLen * bcLen)) - (atLen * atLen)) / (2 * abLen * bcLen);



        float lenRad = Mathf.Acos(calic);

        if (lenRad > 0f)
        {
            float bRadian = (Mathf.PI - lenRad) * Mathf.Rad2Deg;

            Vector3 atOfs = aObj.transform.position - tObj.transform.position;

            atOfs = Quaternion.Inverse(aObj.transform.parent.rotation) * atOfs;

            float atLenx = atOfs.x;
            float atLenz = atOfs.z;
            float mmLen  = Mathf.Abs(atLenx) + Mathf.Abs(atLenz);

            switch (RT)
            {
            case RadType.Not:
            {
                atLenx /= mmLen;
                atLenz /= mmLen;
            }
            break;

            case RadType.Abs:
            {
                atLenx /= mmLen;
                atLenz /= mmLen;
                atLenx  = Mathf.Abs(atLenx);
                atLenz  = Mathf.Abs(atLenz);
            }
            break;

            case RadType.Abs_X_Rev:
            {
                atLenx /= mmLen;
                atLenz /= mmLen;
                atLenx  = Mathf.Abs(atLenx);
                atLenz  = -Mathf.Abs(atLenz);
            }
            break;

            case RadType.Abs_Y_Rev:
            {
                atLenx /= mmLen;
                atLenz /= mmLen;
                atLenx  = -Mathf.Abs(atLenx);
                atLenz  = Mathf.Abs(atLenz);
            }
            break;

            case RadType.X_Onry:
            {
                atLenz = 1f;
                atLenx = 0f;
            }
            break;

            case RadType.X_OnryRev:
            {
                atLenz = -1f;
                atLenx = 0f;
            }
            break;

            case RadType.Y_Onry:
            {
                atLenz = 0f;
                atLenx = 1f;
            }
            break;

            case RadType.Y_OnryRev:
            {
                atLenz = 0f;
                atLenx = -1f;
            }
            break;
            }

            bObj.transform.localEulerAngles = new Vector3(bRadian * atLenz * RotPsc, bRadian * atLenx * RotPsc, 0f);
        }

        Transform parObj = aObj.transform.parent;

        Transform calpObj = parObj;

        if (pObj != null)
        {
            calpObj = pObj.transform;
        }

        cCube.transform.position    = aObj.transform.position;
        cCube.transform.eulerAngles = aObj.transform.eulerAngles;
        cCube.transform.LookAt(cObj.transform.position, calpObj.up);

        aObj.transform.parent = cCube.transform;
        cCube.transform.LookAt(tObj.transform.position, calpObj.forward);

        aObj.transform.parent = parObj;
    }