コード例 #1
0
    Vector3 DeformOld(Vector3 p, MegaShapeLoft loft, MegaLoftLayerSimple layer, float percent, float ca, float off, Vector3 scale, float removeDof, Vector3 locoff)
    {
        p    = tm.MultiplyPoint3x4(p);
        p.z += off;
        p.x *= scale.x;
        p.y *= scale.y;
        p.z *= scale.z;

        p += locoff;
        float alpha = (p.z * LayerLength) + percent;

        if (useCrossCrv)
        {
            ca += CrossCrv.Evaluate(alpha);
            if (ca < 0.0f)
            {
                ca = 0.0f;
            }
            if (ca > 0.999f)
            {
                ca = 0.999f;
            }
        }
        Vector3 ps1;
        Vector3 ps;

        if (CalcUp)
        {
            Vector3 newup;
            ps = layer.GetPosAndUp(loft, ca, alpha, 0.1f, out ps1, out newup);

            //newup = surfacetolofttm.MultiplyVector(newup);

            // May need this back in
            //if ( path.splines[0].closed )
            alpha = Mathf.Repeat(alpha, 1.0f);

            if (calcUpAmount < 0.999f)
            {
                newup = Vector3.Lerp(Vector3.up, newup, calcUpAmount);
            }

            Quaternion uprot = Quaternion.FromToRotation(Vector3.up, newup);
            if (useTwistCrv)
            {
                tw = uprot * Quaternion.AngleAxis(twist * twistCrv.Evaluate(alpha), Vector3.forward);
            }
            else
            {
                tw = uprot;
            }
        }
        else
        {
            ps = layer.GetPosAndLook(loft, ca, alpha, 0.1f, out ps1);

            alpha = Mathf.Repeat(alpha, 1.0f);

            if (useTwistCrv)
            {
                tw = Quaternion.AngleAxis(twist * twistCrv.Evaluate(alpha), Vector3.forward);
            }
        }

        Vector3 relativePos = ps1 - ps;

        relativePos.y *= removeDof;

        Quaternion rotation = tw * Quaternion.LookRotation(relativePos);

        //wtm.SetTRS(ps, rotation, Vector3.one);
        MegaMatrix.SetTR(ref wtm, ps, rotation);

        wtm = mat * wtm;

        p.z = 0.0f;
        return(wtm.MultiplyPoint3x4(p));
    }
コード例 #2
0
    Vector3 DeformOld(Vector3 p, MegaShapeLoft loft, MegaLoftLayerSimple layer, float percent, float ca, float off, Vector3 scale, float removeDof, Vector3 locoff)
    {
        p = tm.MultiplyPoint3x4(p);
        p.z += off;
        p.x *= scale.x;
        p.y *= scale.y;
        p.z *= scale.z;

        p += locoff;
        float alpha = (p.z * LayerLength) + percent;

        if ( useCrossCrv )
        {
            ca += CrossCrv.Evaluate(alpha);
            if ( ca < 0.0f )
                ca = 0.0f;
            if ( ca > 0.999f )
                ca = 0.999f;
        }
        Vector3 ps1;
        Vector3 ps;

        if ( CalcUp )
        {
            Vector3 newup;
            ps = layer.GetPosAndUp(loft, ca, alpha, 0.1f, out ps1, out newup);

            //newup = surfacetolofttm.MultiplyVector(newup);

            // May need this back in
            //if ( path.splines[0].closed )
            alpha = Mathf.Repeat(alpha, 1.0f);

            if ( calcUpAmount < 0.999f )
                newup = Vector3.Lerp(Vector3.up, newup, calcUpAmount);

            Quaternion uprot = Quaternion.FromToRotation(Vector3.up, newup);
            if ( useTwistCrv )
                tw = uprot * Quaternion.AngleAxis(twist * twistCrv.Evaluate(alpha), Vector3.forward);
            else
                tw = uprot;
        }
        else
        {
            ps = layer.GetPosAndLook(loft, ca, alpha, 0.1f, out ps1);

            alpha = Mathf.Repeat(alpha, 1.0f);

            if ( useTwistCrv )
                tw = Quaternion.AngleAxis(twist * twistCrv.Evaluate(alpha), Vector3.forward);
        }

        Vector3 relativePos = ps1 - ps;
        relativePos.y *= removeDof;

        Quaternion rotation = tw * Quaternion.LookRotation(relativePos);
        //wtm.SetTRS(ps, rotation, Vector3.one);
        MegaMatrix.SetTR(ref wtm, ps, rotation);

        wtm = mat * wtm;

        p.z = 0.0f;
        return wtm.MultiplyPoint3x4(p);
    }