Пример #1
0
        public void doFrame(float t)
        {
            if (skeletonRoot == null)
            {
                Debug.LogError("no skeleton root");
                return;
            }
            if (nifanimation == null || activeAnimation == -1)
            {
                setActiveAnimation(getIdleAnimIndex());
                if (nifanimation == null)
                {
                    return;
                }
            }
            //Debug.Log("using anim :" + this.nifanimation.)

            /** For each sequence, evaluate it with the current time and apply the result to the related bone */
            foreach (NiSequenceData data in nifanimation.nifSequences)
            {
                for (int i = 0; i < data.seqEvalIDList.Count; i++)
                {
                    int       evalID   = (int)data.seqEvalIDList[i];
                    NIFObject evalObjA = nifanimation.getObject(evalID);
                    if (nifanimation.getObject(evalID) is NiBSplineCompTransformEvaluator)
                    {
                        NiBSplineCompTransformEvaluator evalObj = (NiBSplineCompTransformEvaluator)evalObjA;
                        string     boneName = nifanimation.getStringFromTable(evalObj.m_kAVObjectName);
                        GameObject go;
                        // cache game objects for bones
                        boneMap.TryGetValue(boneName, out go);
                        if (go == null)
                        {
                            Transform bone = skeletonRoot.transform.FindDeepChild(boneName);
                            if (bone == null)
                            {
//                                Debug.LogWarning("unable to find bone in skeleton for " + boneName);
                                continue;
                            }
                            go = boneMap[boneName] = bone.gameObject;
                            //GameObject.Find(boneName);
                        }
                        if (go == null)
                        {
                            //                          Debug.Log("unable to get gameobject for bone " + boneName);
                            continue;
                        }
                        int splineDataIndex = evalObj.splineDataIndex;
                        int basisDataIndex  = evalObj.basisDataIndex;



                        if (splineDataIndex != -1 && basisDataIndex != -1)
                        {
                            NiBSplineData      splineObj = (NiBSplineData)nifanimation.getObject(splineDataIndex);
                            NiBSplineBasisData basisObj  = (NiBSplineBasisData)nifanimation.getObject(basisDataIndex);
                            if (evalObj.m_kRotCPHandle != 65535)
                            {
                                float[] afValues = new float[4];
                                // get the rotation values for the given time 't'
                                splineObj.getCompactValueDegree3(t, afValues, 4, basisObj, evalObj.m_kRotCPHandle,
                                                                 evalObj.m_afCompScalars[(int)NiBSplineCompTransformEvaluator.COMP_.ROTATION_OFFSET],
                                                                 evalObj.m_afCompScalars[(int)NiBSplineCompTransformEvaluator.COMP_.ROTATION_RANGE]);
                                // apply the rotation to the bone
                                go.transform.localRotation = new Quaternion(afValues[1], afValues[2], afValues[3], afValues[0]);
                            }
                            if (evalObj.m_kTransCPHandle != 65535)
                            {
                                // get the position values for the given time 't'
                                float[] afValues = new float[3];
                                float   offset   = evalObj.m_afCompScalars[(int)NiBSplineCompTransformEvaluator.COMP_.POSITION_OFFSET];
                                float   range    = evalObj.m_afCompScalars[(int)NiBSplineCompTransformEvaluator.COMP_.POSITION_RANGE];
                                splineObj.getCompactValueDegree3(t, afValues, 3, basisObj, evalObj.m_kTransCPHandle,
                                                                 offset,
                                                                 range);
                                go.transform.localPosition = new Vector3(afValues[0], afValues[1], afValues[2]);
                            }
                        }
                        //Debug.Log("drawLine", go);
                        Debug.DrawLine(go.transform.position, go.transform.parent.position);
                    }
                    else
                    {
                        Debug.LogWarning("Unknown animation type:" + evalObjA.GetType());
                    }
                }
            }
        }