コード例 #1
0
    public void Position(GameObject gobj, float alpha, float crossalpha, float yrot, float scl)
    {
        if (surfaceLoft && surfaceLayer >= 0)
        {
            MegaLoftLayerSimple layer = (MegaLoftLayerSimple)surfaceLoft.Layers[surfaceLayer];

            Vector3 at    = Vector3.zero;
            Vector3 up    = Vector3.zero;
            Vector3 right = Vector3.zero;
            Vector3 fwd   = Vector3.zero;
            Vector3 p     = layer.GetPosAndFrame(surfaceLoft, crossalpha, alpha, tangent, out at, out up, out right, out fwd);

            p += up * offset;

            Quaternion rot  = Quaternion.LookRotation(fwd, up);
            Quaternion rot1 = Quaternion.Euler(uprot);
            rot = Quaternion.Lerp(rot, rot1, upright);

            Vector3 lrot = rotate;
            lrot.y += yrot;

            gobj.transform.rotation   = rot * Quaternion.Euler(lrot);
            gobj.transform.position   = layer.transform.TransformPoint(p);
            gobj.transform.localScale = new Vector3(scl, scl, scl);
        }
    }
コード例 #2
0
    public Vector3 GetPoint(float dist, float crossa)
    {
        Vector3 retval = Vector3.zero;

        if (surfaceLoft && surfaceLayer >= 0)
        {
            MegaLoftLayerSimple layer = (MegaLoftLayerSimple)surfaceLoft.Layers[surfaceLayer];

            Vector3 at    = Vector3.zero;
            Vector3 up    = Vector3.zero;
            Vector3 right = Vector3.zero;
            Vector3 fwd   = Vector3.zero;

            float a = dist / layer.layerPath.splines[layer.curve].length;

            Vector3 p = layer.GetPosAndFrame(surfaceLoft, crossa, a, tangent, out at, out up, out right, out fwd);

            p += up * offset;

            p      = layer.transform.TransformPoint(p);
            retval = transform.worldToLocalMatrix.MultiplyPoint3x4(p);
        }

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

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

        if (useCrossCrv)
        {
            ca += CrossCrv.Evaluate(alpha);
        }

        Vector3 ps1;
        Vector3 ps;

        if (CalcUp)
        {
            Vector3 upv   = Vector3.zero;
            Vector3 right = Vector3.zero;
            Vector3 fwd   = Vector3.zero;

            ps = layer.GetPosAndFrame(loft, ca, alpha, (tangent * 0.001f), out ps1, out upv, out right, out fwd);

            tw = Quaternion.LookRotation(fwd, upv);

            Quaternion rot = tw * meshrot;
            if (useTwist)
            {
                rot *= Quaternion.AngleAxis(180.0f + (twist * twistCrv.Evaluate(alpha)), Vector3.forward);
            }
            else
            {
                rot *= Quaternion.AngleAxis(180.0f, Vector3.forward);
            }

            //wtm.SetTRS(ps, rot, Vector3.one);
            MegaMatrix.SetTR(ref wtm, ps, rot);
            wtm = mat * wtm;

            p.z = 0.0f;
            return(wtm.MultiplyPoint3x4(p));
        }
        else
        {
            ps = layer.GetPosAndLook(loft, ca, alpha, (tangent * 0.001f), out ps1);

            if (useTwist)
            {
                tw = meshrot * Quaternion.AngleAxis((twist * twistCrv.Evaluate(alpha)), Vector3.forward);                       // * meshrot;
            }
            else
            {
                tw = meshrot * Quaternion.AngleAxis(0.0f, Vector3.forward);                     // * meshrot;
            }
        }

        Vector3 relativePos = ps1 - ps;

        relativePos.y *= removeDof;

        if (relativePos == Vector3.zero)
        {
            relativePos = lastrel;              //Vector3.forward;
        }
        lastrel = relativePos;
        Quaternion rotation = Quaternion.LookRotation(relativePos) * tw;                // * meshrot;

        MegaMatrix.SetTR(ref wtm, ps, rotation);

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

        wtm = mat * wtm;

        p.z = 0.0f;
        return(wtm.MultiplyPoint3x4(p));
    }
コード例 #4
0
ファイル: MegaLoftLayerClone.cs プロジェクト: Morac/Orca6
    Vector3 Deform(Vector3 p, MegaShapeLoft loft, MegaLoftLayerSimple layer, float percent, float ca, float off, Vector3 scale, float removeDof, Vector3 locoff)
    {
        p = tm.MultiplyPoint3x4(p);
        p.x *= scale.x;
        p.y *= scale.y;
        p.z *= scale.z;
        p.z += off;

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

        if ( useCrossCrv )
            ca += CrossCrv.Evaluate(alpha);

        Vector3 ps1;
        Vector3 ps;

        if ( CalcUp )
        {
            Vector3 upv = Vector3.zero;
            Vector3 right = Vector3.zero;
            Vector3 fwd = Vector3.zero;

            ps = layer.GetPosAndFrame(loft, ca, alpha, (tangent * 0.001f), out ps1, out upv, out right, out fwd);

            tw = Quaternion.LookRotation(fwd, upv);

            Quaternion rot = tw * meshrot;
            if ( useTwist )
                rot *= Quaternion.AngleAxis(180.0f + (twist * twistCrv.Evaluate(alpha)), Vector3.forward);
            else
                rot *= Quaternion.AngleAxis(180.0f, Vector3.forward);

            //wtm.SetTRS(ps, rot, Vector3.one);
            MegaMatrix.SetTR(ref wtm, ps, rot);
            wtm = mat * wtm;

            p.z = 0.0f;
            return wtm.MultiplyPoint3x4(p);
        }
        else
        {
            ps = layer.GetPosAndLook(loft, ca, alpha, (tangent * 0.001f), out ps1);

            if ( useTwist )
                tw = meshrot * Quaternion.AngleAxis((twist * twistCrv.Evaluate(alpha)), Vector3.forward);	// * meshrot;
            else
                tw = meshrot * Quaternion.AngleAxis(0.0f, Vector3.forward);	// * meshrot;
        }

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

        if ( relativePos == Vector3.zero )
        {
            relativePos = lastrel;	//Vector3.forward;
        }
        lastrel = relativePos;
        Quaternion rotation = Quaternion.LookRotation(relativePos) * tw;	// * meshrot;
        MegaMatrix.SetTR(ref wtm, ps, rotation);

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

        wtm = mat * wtm;

        p.z = 0.0f;
        return wtm.MultiplyPoint3x4(p);
    }
コード例 #5
0
    void DoUpdate()
    {
        if (surfaceLoft && surfaceLayer >= 0)
        {
            MegaLoftLayerSimple layer = (MegaLoftLayerSimple)surfaceLoft.Layers[surfaceLayer];

            if (animate)
            {
                distance += speed * Time.deltaTime;
                distance  = Mathf.Repeat(distance, layer.layerPath.splines[layer.curve].length);
                alpha     = distance / layer.layerPath.splines[layer.curve].length;
            }

            Vector3 at    = Vector3.zero;
            Vector3 up    = Vector3.zero;
            Vector3 right = Vector3.zero;
            Vector3 fwd   = Vector3.zero;

            if (mode == MegaWalkMode.Distance)
            {
                alpha = distance / layer.layerPath.splines[layer.curve].length;
            }
            else
            {
                distance = alpha * layer.layerPath.splines[layer.curve].length;
            }

            Vector3 p = layer.GetPosAndFrame(surfaceLoft, crossalpha, alpha, tangent, out at, out up, out right, out fwd);

            p += up * offset;

            //up = -Vector3.up;
            Quaternion rot = Quaternion.LookRotation(fwd, up);

            Quaternion rot1 = Quaternion.Euler(uprot);
            rot = Quaternion.Lerp(rot, rot1, upright);

            Quaternion locrot = Quaternion.Euler(rotate);

            if (!initrot && delay != 0.0f)
            {
                rot = Quaternion.Slerp(transform.rotation, rot * locrot, Time.deltaTime * delay);
            }
            else
            {
                initrot = false;
                rot     = rot * locrot;
            }

            transform.rotation = rot;                   // * locrot;
            transform.position = layer.transform.TransformPoint(p);

#if false
            //float a = 0.0f;

            if (mode == MegaWalkMode.Distance)
            {
                alpha = distance / surfaceLoft.Layers[surfaceLayer].layerPath.splines[0].length;
            }
            else
            {
                distance = alpha * surfaceLoft.Layers[surfaceLayer].layerPath.splines[0].length;
            }

            Vector3 p = layer.GetPosAndFrame(surfaceLoft, crossalpha, alpha, tangent, out at, out up, out right, out fwd);

            p += up * offset;

            Quaternion rot = Quaternion.LookRotation(fwd, up);

            Quaternion locrot = Quaternion.Euler(rotate);

            if (delay != 0.0f)
            {
                rot = Quaternion.Slerp(transform.rotation, rot * locrot, delay);
            }
            else
            {
                rot = rot * locrot;
            }


            transform.rotation = rot;                   // * locrot;
            transform.position = layer.transform.TransformPoint(p);
#endif
        }
    }