Tform tformfromvec2(const Vec2 v) { Tform res; real len = VEC2LEN(v); real c = v.x / len; real s = v.y / len; res.col1.x = c; res.col2.x = -s; res.pos.x = len; res.col1.y = s; res.col2.y = c; res.pos.y = 0; return res; }
FexMovement* FexTracker::GetMovement() { FILE *log = fopen( "movementlog.txt", "wt" ); int i; for( i=0;i<nFeatures;i++ ) { if( lFeatures[i].Influence>0.01 ) fprintf( log, "Feature(%.2f): %d - %d\n", lFeatures[i].Influence, lFeatures[i].StartTime, lFeatures[i].StartTime+lFeatures[i].Pos.size() ); } FexMovement *m = new FexMovement(); FexMovementFrame f; float FirstInfluenceSum = 0; vec2 FirstPos; FirstPos.x = FirstPos.y = 0; for( i=0;i<nFeatures;i++ ) { if( 0 < lFeatures[i].StartTime ) continue; if( lFeatures[i].Pos.size() <= 0 ) continue; vec2 p = lFeatures[i].Pos[ 0 ]; FirstPos.x += p.x * lFeatures[i].Influence; FirstPos.y += p.y * lFeatures[i].Influence; FirstInfluenceSum += lFeatures[i].Influence; } FirstPos.x /= FirstInfluenceSum; FirstPos.y /= FirstInfluenceSum; float FirstLen = 1; vec2* MidOffset = (vec2*) new vec2[nFeatures]; float* MidOffsetLen = (float*) new float[nFeatures]; for( int Frame = 0; Frame < CurFrame; Frame ++ ) { //set feature offset for( i=0;i<nFeatures;i++ ) { if( Frame == lFeatures[i].StartTime ) { MidOffset[i].x = FirstPos.x - lFeatures[i].Pos[0].x; MidOffset[i].y = FirstPos.y - lFeatures[i].Pos[0].y; //realOffLen / MidOffLen = FirstLen // => MidOffLen /= FirstLen; MidOffset[i].x /= FirstLen; MidOffset[i].y /= FirstLen; MidOffsetLen[i] = VEC2LEN( MidOffset[i] ); } } //accumulate position float NextLen = 0; float NextInfluenceSum = 0; vec2 NextPos; NextPos.x = NextPos.y = 0; for( i=0;i<nFeatures;i++ ) { if( Frame < lFeatures[i].StartTime ) continue; int FeatureFrame = Frame - lFeatures[i].StartTime; if( lFeatures[i].Pos.size() <= FeatureFrame ) continue; //feature was lost vec2 p = lFeatures[i].Pos[ FeatureFrame ]; NextPos.x += (p.x+MidOffset[i].x*FirstLen) * lFeatures[i].Influence; NextPos.y += (p.y+MidOffset[i].y*FirstLen) * lFeatures[i].Influence; NextInfluenceSum += lFeatures[i].Influence; } if( NextInfluenceSum > 0.01 ) { NextPos.x /= NextInfluenceSum; NextPos.y /= NextInfluenceSum; } else NextPos = FirstPos; //take over last one for( i=0;i<nFeatures;i++ ) { if( Frame < lFeatures[i].StartTime ) continue; int FeatureFrame = Frame - lFeatures[i].StartTime; if( lFeatures[i].Pos.size() <= FeatureFrame ) continue; //feature was lost vec2 p = lFeatures[i].Pos[ FeatureFrame ]; vec2 realMidOff; realMidOff.x = NextPos.x-p.x; realMidOff.y = NextPos.y-p.y; float realMidOffLen = VEC2LEN( realMidOff ); NextLen += realMidOffLen/MidOffsetLen[i] *lFeatures[i].Influence; } if( NextInfluenceSum > 0.01 ) { NextLen /= NextInfluenceSum; } else NextLen = FirstLen; //take over last one f.Pos = NextPos; f.Rot.x = 0; f.Rot.y = 0; f.Rot.z = 0; f.Scale.x = NextLen; f.Scale.y = NextLen; m->Frames.Add( f ); FirstPos = NextPos; FirstLen = NextLen; } delete []MidOffset; delete []MidOffsetLen; fclose( log ); return m; }