Пример #1
0
    public AnimationBase(CreatureSpecies species, string animName, float animTime)
    {
        this.species = species;
        float legSeparation = species.legSeparation;
        float shoulderWidth = species.spineData.torsoData.radiusB;
        float hipWidth      = species.spineData.pelvisData.radiusA;

        root_defOffset   = new Vector3(-legSeparation / 2, species.backLegData.legLength, 0.0f);
        root_defRotation = Quaternion.Euler(0.0f, 0.0f, species.spineElevation - 90.0f);
        FL_defOffset     = new Vector3(legSeparation / 2, 0.0f, shoulderWidth);
        FR_defOffset     = new Vector3(legSeparation / 2, 0.0f, -shoulderWidth);
        BL_defOffset     = new Vector3(-legSeparation / 2, 0.0f, hipWidth);
        BR_defOffset     = new Vector3(-legSeparation / 2, 0.0f, -hipWidth);
        GameObject sphere0 = GameObject.CreatePrimitive(PrimitiveType.Sphere);

        sphere0.transform.position = FL_defOffset;
        animGroup = CreateClips(animTime, animName);
        UpdateDictionaries(animName);
    }
Пример #2
0
    // Below is an abstract list for all animation functions to override
    protected ClipContainer.AnimationGroup CreateClips(float animTime, string animName)
    {
        int i           = 0;
        int arrayLength = (int)(animTime / Time.deltaTime) + 1;

        float[] times = new float[arrayLength];

        Vector3[]    rootPos      = new Vector3[arrayLength];
        Quaternion[] rootPivotRot = new Quaternion[arrayLength];
        Quaternion[] pelvisRot    = new Quaternion[arrayLength];
        Quaternion[] waistRot     = new Quaternion[arrayLength];
        Quaternion[] torsoRot     = new Quaternion[arrayLength];
        Vector3[]    FL_hipPos    = new Vector3[arrayLength];
        Quaternion[] FL_hipRot    = new Quaternion[arrayLength];
        Quaternion[] FL_thighRot  = new Quaternion[arrayLength];
        Quaternion[] FL_calfRot   = new Quaternion[arrayLength];
        Quaternion[] FL_footRot   = new Quaternion[arrayLength];
        Quaternion[] FL_toeRot    = new Quaternion[arrayLength];
        Vector3[]    FR_hipPos    = new Vector3[arrayLength];
        Quaternion[] FR_hipRot    = new Quaternion[arrayLength];
        Quaternion[] FR_thighRot  = new Quaternion[arrayLength];
        Quaternion[] FR_calfRot   = new Quaternion[arrayLength];
        Quaternion[] FR_footRot   = new Quaternion[arrayLength];
        Quaternion[] FR_toeRot    = new Quaternion[arrayLength];
        Vector3[]    BL_hipPos    = new Vector3[arrayLength];
        Quaternion[] BL_hipRot    = new Quaternion[arrayLength];
        Quaternion[] BL_thighRot  = new Quaternion[arrayLength];
        Quaternion[] BL_calfRot   = new Quaternion[arrayLength];
        Quaternion[] BL_footRot   = new Quaternion[arrayLength];
        Quaternion[] BL_toeRot    = new Quaternion[arrayLength];
        Vector3[]    BR_hipPos    = new Vector3[arrayLength];
        Quaternion[] BR_hipRot    = new Quaternion[arrayLength];
        Quaternion[] BR_thighRot  = new Quaternion[arrayLength];
        Quaternion[] BR_calfRot   = new Quaternion[arrayLength];
        Quaternion[] BR_footRot   = new Quaternion[arrayLength];
        Quaternion[] BR_toeRot    = new Quaternion[arrayLength];
        JointSolver.SpineSolverOutput spine_out = new JointSolver.SpineSolverOutput();
        JointSolver.LegSolverOutput   FL_out    = new JointSolver.LegSolverOutput();
        JointSolver.LegSolverOutput   FR_out    = new JointSolver.LegSolverOutput();
        JointSolver.LegSolverOutput   BL_out    = new JointSolver.LegSolverOutput();
        JointSolver.LegSolverOutput   BR_out    = new JointSolver.LegSolverOutput();


        GameObject  solverObject = new GameObject("solverObject");
        JointSolver solver       = solverObject.AddComponent <JointSolver>();

        for (float t = 0.0f; t < animTime; t += Time.deltaTime)
        {
            // Call all animation functions and store values in appropriate variables
            rootPos[i]      = AF_rootPosition(t);
            rootPivotRot[i] = AF_rootPivotRotation(t);
            Vector3 FL_target = AF_FL_LegTarget(t);
            Vector3 FR_target = AF_FR_LegTarget(t);
            Vector3 BL_target = AF_BL_LegTarget(t);
            Vector3 BR_target = AF_BR_LegTarget(t);

            float hipWidth      = species.spineData.pelvisData.radiusA;
            float shoulderWidth = species.spineData.torsoData.radiusB;

            float spine_CX = AF_spine_CX(t);
            float spine_CY = AF_spine_CY(t);
            float spine_SX = AF_spine_SX(t);
            float spine_SY = AF_spine_SY(t);

            // Convert all function values to raw rotations and positions for each joint
            spine_out = solver.SpineRotationSolver(spine_CX, spine_CY, spine_SX, spine_SY, 90.0f, 90.0f,
                                                   species.spineData.pelvisData.length,
                                                   species.spineData.waistData.length,
                                                   species.spineData.torsoData.length);

            pelvisRot[i] = spine_out.pelvisRotation;
            waistRot[i]  = spine_out.waistRotation;
            torsoRot[i]  = spine_out.torsoRotation;

            //Vector3 sideHipPoint = rootPos[i] + rootPivotRot[i]*(new Vector3(0.0f,0.0f,hipWidth));
            BL_hipPos[i] = rootPos[i] + rootPivotRot[i] * (new Vector3(0.0f, 0.0f, hipWidth));
            BL_out       = solver.LegRotationSolver(BL_hipPos[i], BL_target,
                                                    species.backLegData.thighData.length,
                                                    species.backLegData.calfData.length,
                                                    species.backLegData.footData.length,
                                                    30.0f, 0.0f, false);
            BL_hipRot[i]   = BL_out.legPivotRotation;
            BL_thighRot[i] = BL_out.thighRotation;
            BL_calfRot[i]  = BL_out.calfRotation;
            BL_footRot[i]  = BL_out.footRotation;
            BL_toeRot[i]   = Quaternion.identity;

            BR_hipPos[i] = rootPos[i] + rootPivotRot[i] * (new Vector3(0.0f, 0.0f, -hipWidth));
            BR_out       = solver.LegRotationSolver(BR_hipPos[i], BR_target,
                                                    species.backLegData.thighData.length,
                                                    species.backLegData.calfData.length,
                                                    species.backLegData.footData.length,
                                                    30.0f, 0.0f, false);
            BR_hipRot[i]   = BR_out.legPivotRotation;
            BR_thighRot[i] = BR_out.thighRotation;
            BR_calfRot[i]  = BR_out.calfRotation;
            BR_footRot[i]  = BR_out.footRotation;
            BR_toeRot[i]   = Quaternion.identity;


            Vector3 neckPivot = rootPos[i] + rootPivotRot[i] * (new Vector3(0.0f, spine_out.neckDistance, 0.0f));

            FL_hipPos[i] = neckPivot + rootPivotRot[i] * pelvisRot[i] * waistRot[i] * torsoRot[i] * (new Vector3(0.0f, 0.0f, shoulderWidth));
            Debug.Log("FL_hipPos = " + FL_hipPos[i] + ", FL_target = " + FL_target);
            FL_out = solver.LegRotationSolver(FL_hipPos[i], FL_target,
                                              species.frontLegData.thighData.length,
                                              species.frontLegData.calfData.length,
                                              species.frontLegData.footData.length,
                                              30.0f, 0.0f, true);
            FL_hipRot[i]   = FL_out.legPivotRotation;
            FL_thighRot[i] = FL_out.thighRotation;
            FL_calfRot[i]  = FL_out.calfRotation;
            FL_footRot[i]  = FL_out.footRotation;
            FL_toeRot[i]   = Quaternion.identity;

            FR_hipPos[i] = neckPivot + rootPivotRot[i] * pelvisRot[i] * waistRot[i] * torsoRot[i] * (new Vector3(0.0f, 0.0f, -shoulderWidth));
            FR_out       = solver.LegRotationSolver(FR_hipPos[i], FR_target,
                                                    species.frontLegData.thighData.length,
                                                    species.frontLegData.calfData.length,
                                                    species.frontLegData.footData.length,
                                                    30.0f, 0.0f, true);
            FR_hipRot[i]   = FR_out.legPivotRotation;
            FR_thighRot[i] = FR_out.thighRotation;
            FR_calfRot[i]  = FR_out.calfRotation;
            FR_footRot[i]  = FR_out.footRotation;
            FR_toeRot[i]   = Quaternion.identity;

            times[i] = t;
            i++;
        }

        // Assign values to animation clips in new AnimationGroup and store in ClipContainer
        ClipContainer.AnimationGroup animGroup = new ClipContainer.AnimationGroup();
        animGroup.rootClip      = CreatePositionClip(rootPos, times, animName);
        animGroup.rootPivotClip = CreateRotationClip(rootPivotRot, times, animName);
        animGroup.pelvisClip    = CreateRotationClip(pelvisRot, times, animName);
        animGroup.waistClip     = CreateRotationClip(waistRot, times, animName);
        animGroup.torsoClip     = CreateRotationClip(torsoRot, times, animName);

        animGroup.FL_HipClip   = CreatePositionClip(FL_hipPos, times, animName);
        animGroup.FL_HipClip   = CreateRotationClip(animGroup.FL_HipClip, FL_hipRot, times);
        animGroup.FL_ThighClip = CreateRotationClip(FL_thighRot, times, animName);
        animGroup.FL_KneeClip  = CreateRotationClip(FL_calfRot, times, animName);
        animGroup.FL_AnkleClip = CreateRotationClip(FL_footRot, times, animName);
        animGroup.FL_ToeClip   = CreateRotationClip(FL_toeRot, times, animName);

        animGroup.FR_HipClip   = CreatePositionClip(FR_hipPos, times, animName);
        animGroup.FR_HipClip   = CreateRotationClip(animGroup.FR_HipClip, FR_hipRot, times);
        animGroup.FR_ThighClip = CreateRotationClip(FR_thighRot, times, animName);
        animGroup.FR_KneeClip  = CreateRotationClip(FR_calfRot, times, animName);
        animGroup.FR_AnkleClip = CreateRotationClip(FR_footRot, times, animName);
        animGroup.FR_ToeClip   = CreateRotationClip(FR_toeRot, times, animName);

        animGroup.BL_HipClip   = CreatePositionClip(BL_hipPos, times, animName);
        animGroup.BL_HipClip   = CreateRotationClip(animGroup.BL_HipClip, BL_hipRot, times);
        animGroup.BL_ThighClip = CreateRotationClip(BL_thighRot, times, animName);
        animGroup.BL_KneeClip  = CreateRotationClip(BL_calfRot, times, animName);
        animGroup.BL_AnkleClip = CreateRotationClip(BL_footRot, times, animName);
        animGroup.BL_ToeClip   = CreateRotationClip(BL_toeRot, times, animName);

        animGroup.BR_HipClip   = CreatePositionClip(BR_hipPos, times, animName);
        animGroup.BR_HipClip   = CreateRotationClip(animGroup.BR_HipClip, BR_hipRot, times);
        animGroup.BR_ThighClip = CreateRotationClip(BR_thighRot, times, animName);
        animGroup.BR_KneeClip  = CreateRotationClip(BR_calfRot, times, animName);
        animGroup.BR_AnkleClip = CreateRotationClip(BR_footRot, times, animName);
        animGroup.BR_ToeClip   = CreateRotationClip(BR_toeRot, times, animName);

        // etc...

        //SetAnimGroupName(ref animGroup, animName);
        GameObject.Destroy(solverObject);
        return(animGroup);
    }