How come the animation controller always flips my character?

Started by
-1 comments, last by lucky6969b 7 years, 3 months ago

Why the animation controllers would want to flip my animation on bip001.....

See the figures below, I dumped at time 0 is different than the dump I get

from GetSRT on time zero...


//TRACE("anim ctrl bvh: " << pAnimCtrl);
        const float            ntick = 500.0f;        
        const UINT            nKeyMax = 700;            
        // all times for bone i
        const UINT nKeys = motionFrames;                

        CComPtr<ID3DXKeyframedAnimationSet> pAnimSet;                 
        MeshXAnimResult result;        
        int total_frames = motionFrames;
        float total_frame_time = frameTime * (float)(total_frames+1);        
        float one_frame_time = frameTime;

        D3DXCreateKeyframedAnimationSet("Loiter", ntick, D3DXPLAY_ONCE, BONE_MAX, 0, NULL, &pAnimSet);                               

        Transform* l_transform = this->m_simObject->FindComponentByType<Transform>();
 
        
        std::vector<std::vector<D3DXKEY_VECTOR3>> pScal;
        std::vector<std::vector<D3DXKEY_VECTOR3>> pTrans;
        std::vector<std::vector<D3DXKEY_QUATERNION>> pRot;

        pScal.resize(BONE_MAX);
        pTrans.resize(BONE_MAX);
        pRot.resize(BONE_MAX);

        for (int i = 0; i < pScal.size(); i++)
        {
            pScal[i].resize(nKeyMax);
        }

        for (int i = 0; i < pTrans.size(); i++)
        {
            pTrans[i].resize(nKeyMax);
        }

        for (int i = 0; i < pRot.size(); i++)
        {
            pRot[i].resize(nKeyMax);
        }
        
        UINT k = 0;

        for (float t = 0; t < total_frame_time; t += one_frame_time)                         
        {                 

            TRACE("t at :" << t);
            TRACE("......");        
            
            Vec3 sca[BONE_MAX], pos[BONE_MAX];
            Quat rot[BONE_MAX];

            // bvh data with offset to parent bone
            CopyOffsetMatrix(animationNumber, t);
            
            // bvh data with animation and orientation fixed (in combined matrices with no world)
            meshX->CalcAnimationFromBvhNoCombine(this, bind[1], t, sca, rot, pos, radius);            

            for (FrameIterator it(meshX->m_frames); it.GetCurrent() >= 0; ++it)
            {

                BONE_ID id = it.GetCurrent();
                const Frame& f = meshX->m_frames[id];            

                //TRACE("id of " << id << " is " << f.name);            
                 
                
                Quat r = rot[id];
                Vec3 p = pos[id];
                Vec3 s = sca[id];

                //TRACE(f.name);
                //TRACE(s.x << " " << s.y << " " << s.z);
                //TRACE(p.x << " " << p.y << " " << p.z);
                //TRACE(r.x << " " << r.y << " " << r.z << " " << r.w);
                //TRACE("=======\n");

                //D3DXMATRIX testM;
                //D3DXMatrixTransformation(&testM, NULL, NULL, &s, NULL, &r, &p);
                //TRACE("Wicked for " << f.name);
                //DumpMatrix(testM);
                //TRACE("=====\n\n");
                
                // world
                //D3DXVECTOR3 boneSca, bonePos;
                //D3DXQUATERNION boneRot;
                //D3DXMatrixDecompose(&boneSca, &boneRot, &bonePos, &searchMat);                                                                             
                  
                
                //pTrans[id][k].Time = pAnimSet->GetSourceTicksPerSecond() * t;
                pTrans[id][k].Time = t;
                pTrans[id][k].Value = p;

                //pRot[id][k].Time = pAnimSet->GetSourceTicksPerSecond() * t;
                pRot[id][k].Time = t;
                pRot[id][k].Value = r;

                //pScal[id][k].Time = pAnimSet->GetSourceTicksPerSecond() * t;                
                pScal[id][k].Time = t;                
                pScal[id][k].Value = s;
    
                
                        
            }    

            k++;
        
        }

            
        

        for (FrameIterator it(meshX->m_frames); it.GetCurrent() >= 0; ++it)
        {
            
            BONE_ID id = it.GetCurrent();
            const Frame& f = meshX->m_frames[id];            

            D3DXKEY_VECTOR3 posKeys[nKeyMax];
            D3DXKEY_VECTOR3 scaKeys[nKeyMax];
            D3DXKEY_QUATERNION rotKeys[nKeyMax];

            for (int i = 0; i < nKeyMax; i++)
            {
                scaKeys[i] = pScal[id][i];
                posKeys[i] = pTrans[id][i];
                rotKeys[i] = pRot[id][i];
            }

            //TRACE("id of " << id << " is " << f.name);
            
            // just give a name to the animation
            DWORD aInd;         
            pAnimSet->RegisterAnimationSRTKeys(f.name,
              nKeys + 1, nKeys + 1, nKeys + 1, scaKeys, rotKeys, posKeys, &aInd);        
            
        }

        UINT n = 0;
        pAnimSet->GetAnimationIndexByName("Bip001", &n);
        for (int i = 0; i < pAnimSet->GetNumAnimations(); i++)
        {            
            if (i == n)
            {
                D3DXVECTOR3 pos, sca;
                D3DXQUATERNION rot;            
                pAnimSet->GetSRT(0, i, &sca, &rot, &pos);
                D3DXMATRIX wicked;
                D3DXMatrixTransformation(&wicked, NULL, NULL, &sca, NULL, &rot, &pos);
                TRACE("Checking wicked...");
                DumpMatrix(wicked);
            }
        }

 
 
[code]
t at :0
......
Wicked for SceneRoot
1    0    0    0    
0    1    0    0    
0    0    1    0    
0    0    0    1    
=====


Wicked for Operator
1    0    0    0    
0    1    0    0    
0    0    1    0    
0    0    0    1    
=====


Wicked for Bip001
1.19209e-006    0    -1    0    
0    1    0    0    
1    0    1.19209e-006    0    
-0.000633966    1.9252    -0.033745    1    
=====
 
Checking wicked...
1.19209e-006    0    1    0    
0    1    0    0    
-1    0    1.19209e-006    0    
-0.000633966    1.9252    -0.033745    1    
 

This topic is closed to new replies.

Advertisement