рд╣рдо рд╣реЗрдХреНрд╕рд╛рдкреЙрдб рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рднрд╛рдЧ рджреЛ

рдПрдХ рдЪрд▓рддреА рд╣реЗрдХреНрд╕рд╛рдкреЛрдб рдХрд╛ рд╡реАрдбрд┐рдпреЛ


рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ , рдЙрд╕рдХреЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЕрдзрд┐рдХ рд╢рд╛рдирджрд╛рд░ рдереЗ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлреЛрдЯреЛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рднрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рд░реЛрдмреЛрдЯ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рдкрд░реАрдХреНрд╖рдг рдбреНрд░рд╛рдЗрд╡ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВред


рдлреЛрди рд╕реЗ рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдИ-рдлрд╛рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реЛрдмреЛрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рджреЛ рд╡реАрдбрд┐рдпреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдХрд┐ рд╣реЗрдХреНрд╕рд╛рдкреЙрдб рдореЗрдВ рдмреБрджреНрдзрд┐рдорддреНрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ ...


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░реЛрдмреЛрдЯ рдХреЛ рдирд░рдо рдХрд╛рд▓реАрди рд╕реЗ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдлрд┐рд╕рд▓рди рд╡рд╛рд▓реЗ рд▓рд┐рдиреЛрд▓рд┐рдпрдо рд╕реЗ рдирд┐рд╖реНрдХрд╛рд╕рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдпрд╛ред


рд╣реЗрдХреНрд╕рд╛рдкреЙрдб рдЖрдВрджреЛрд▓рдиреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдореЛрд╢рди рдХреНрд▓рд╛рд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдореЛрд╢рдирдЬреЛрдм рдХреНрд▓рд╛рд╕ рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрдХреНрд╖рд╛рдПрдВ рд░реЛрдмреЛрдЯ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ ред рдореЛрд╢рдирдЬреЙрдм рд╡рд░реНрдЧ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рдзрд┐ рд╣реИ , рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреА рд╣реИред



int MotionJob :: рдирд┐рд╖реНрдкрд╛рджрд┐рдд (рдЧрддрд┐ * рдЧрддрд┐)
int MotionJob::execute(Motion* pMotion) {
  if(m_Status == NONE && pMotion != NULL) {
     
     m_pMotion = pMotion;
     m_MotionTime = 0;
     m_TotalTime = m_pMotion->totalTime();
     m_Status = RUNING;
  } else if(pMotion != NULL){
    
    if(m_pMotion->m_pNext != NULL) 
      delete m_pMotion->m_pNext;
      
    m_pMotion->m_pNext = pMotion;
     m_Status = STOPING;
  }
  return S_OK;
}


рдЗрд╕рдХрд╛ рддрд░реНрдХ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдВрджреЛрд▓рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рдЖрдВрджреЛрд▓рди рдирд╣реАрдВ рдерд╛, рддреЛ рд╕рдВрдХреЗрддрд┐рдд рдЖрдВрджреЛрд▓рди рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдерд┐рддрд┐ ( RUNA ) рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ ред рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЖрдВрджреЛрд▓рди рдерд╛, рд╣рдо рдЗрд╕реЗ рд╕реНрдЯреЙрдк рд╕реНрдЯреЗрдЯ ( STOPING ) рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ , рдФрд░ рдирдП рдЖрдВрджреЛрд▓рди рдХреЛ m_pNext рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЕрдЧрд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдпрд╣ рд╕рд╣рдорддрд┐ рд╣реИ рдХрд┐ рдореЛрд╢рди рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╕рднреА рд╡рд╕реНрддреБрдПрдВ рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ ( рдирдП рдорд╛рдзреНрдпрдо рд╕реЗ ) рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЧрддрд┐ рдкреВрд░реА рд╣реЛрдиреЗ рдпрд╛ рд░рджреНрдж рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореЛрд╢рдирдЬреЛрдм рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ ред

MotionJob рд╡рд░реНрдЧ , рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдЬрд╛ рд░рд╣рд╛ ajob , рдФрдЬрд╛рд░ рдУрд╡рд░рд▓реИрдк рдореЗрдВ рдЖрдВрджреЛрд▓рди рдХреЗ рд╕рднреА рдЬрд╛рджреВ onRun рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рд░реЛрдмреЛрдЯ рдХреЗ рдЖрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдПрдХ рджрд┐рдпрд╛ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╢реВрдиреНрдп MotionJob :: onRun ()
void MotionJob::onRun() {

  Vector3D points[FOOTS_COUNT];
  int pose[FOOTS_COUNT][3];
  //    ,  
  if(m_pMotion == NULL)
    return;
  //           ,
  //            .
  //      .
  int res;
  if(m_pMotion->getPose(min(m_MotionTime, m_pMotion->maxTime()), pose) == S_OK) {
     res = m_pGeksapod->_setPose(pose);
  } else if(m_pMotion->getPose(min(m_MotionTime, m_pMotion->maxTime()), points) == S_OK) {
     res = m_pGeksapod->_setPose(points);
  }
  //     
  m_MotionTime += MOTION_JOB_PERIOD;
  //     ,    ,
  //      :
  //   m_TotalTime -     
  if(m_TotalTime > 0) { 
    m_TotalTime -= MOTION_JOB_PERIOD;
    m_TotalTime = max(0,m_TotalTime); 
  }
  //      , 
  //      
  if(m_TotalTime == 0 && m_pMotion->isLooped()) {
     m_Status = STOPING;
  }
  //         
  //          .
  if( (m_MotionTime - m_pMotion->maxTime() >= MOTION_JOB_PERIOD && (!m_pMotion->isLooped() || m_Status == STOPING)) ) { //  
    //      
    Motion* pNextMotion = m_pMotion->m_pNext;
    m_pMotion->m_pNext = NULL;
    delete m_pMotion;
    m_pMotion = NULL;
    //   
    m_Status = NONE;
    execute(pNextMotion);
  } else if(m_MotionTime - m_pMotion->maxTime() >= MOTION_JOB_PERIOD) {
    //      
    //         
    m_MotionTime = 0; 
  }
}


рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ:
  • Motion (Vector3D points[FOOTS_COUNT]), (int pose[FOOTS_COUNT][3]). , . getPose , getPose. _setPose, .
  • рдЖрдВрджреЛрд▓рди рдирд┐рдпрдорд┐рдд рдпрд╛ рдЪрдХреНрд░реАрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЖрдВрджреЛрд▓рди рдЪрдХреНрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕рдордп рдЕрд╡рдзрд┐ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдЧрддрд┐ ( рдореЛрд╢рди :: рдореИрдХреНрд╕рд┐рдореЗрдЯ () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛ ) рддреБрд░рдВрдд рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
    рдЪрдХреНрд░реАрдп рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдПрдХ рдордЬрдмреВрд░ рд░реЛрдХ рдХреЗ рдмрд╛рдж рд╣реА рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рд╢реВрдиреНрдп рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдпрд╛ рдЬрдм рд╕рдордп рдХреЗ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ рдХреЛ рдЖрдВрджреЛрд▓рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( рдореЛрд╢рди :: рдЯреЛрдЯрд▓ рдЯрд╛рдЗрдо () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ )ред

рд╡рд┐рднрд┐рдиреНрди рдЧрддрд┐ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рд╡рд░реНрдЧ рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрдореЛрд╢рди
class TransPoseMotion: public Motion {
  Vector3D m_Pose0[FOOTS_COUNT];  //  
  Vector3D m_Offset[FOOTS_COUNT];  //  
public:  
  TransPoseMotion(Vector3D begPose[FOOTS_COUNT], Vector3D endPose[FOOTS_COUNT],
        long maxTime, Motion* pNext = NULL);
  int getPose(long time, Vector3D points[FOOTS_COUNT]);
};

рд╡рд░реНрдЧ TransAnglesMotion
class TransAnglesMotion: public Motion {
  char m_Pose0[FOOTS_COUNT][3];
  char m_Offset[FOOTS_COUNT][3];
public:  
  TransAnglesMotion(int begPose[FOOTS_COUNT][3], int endPose[FOOTS_COUNT][3],
        long maxTime, Motion* pNext = NULL);
  int getPose(long actionTime, int pose[FOOTS_COUNT][3]);
};

рд╡рд░реНрдЧ рд░реЗрдЦреАрдп рднрд╛рд╡рдирд╛
class LinearMotion: public Motion {
  //     ( ) 
  Vector3D m_Pose0[FOOTS_COUNT];
  Vector3D m_Offset; //     
  int m_Heigth;          //   
public:  
  LinearMotion(int heigth, Vector3D pose0[FOOTS_COUNT], Vector3D speed, 
        long maxTime, long totalTime = -1, Motion* pNext = NULL);
  int getPose(long time, Vector3D points[FOOTS_COUNT]);
};

рдХреНрд▓рд╛рд╕ рд░реЛрдЯреЗрдЯрдореЛрд╢рди
class RotateMotion: public Motion {
  //     ( ) 
  Vector3D m_Pose0[FOOTS_COUNT]; 
  Vector3D m_Angles; //     
  int m_Heigth;           //   
public:  
  RotateMotion(int heigth, Vector3D pose0[FOOTS_COUNT], Vector3D rotor, 
        long maxTime, long totalTime = -1, Motion* pNext = NULL);
  int getPose(long time, Vector3D points[FOOTS_COUNT]);
};

рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрдореЛрд╢рди рдХреНрд▓рд╛рд╕


TransPoseMotion рд╡рд░реНрдЧ рдЖрдкрдХреЛ рдЕрдВрдЧреЛрдВ рдХреЛ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рд╕рдордп рдХреА рдЕрд╡рдзрд┐, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЖрдВрджреЛрд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд░реНрдЧ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

TransPoseMotion :: TransPoseMotion (...)
TransPoseMotion::TransPoseMotion(Vector3D begPose[FOOTS_COUNT],
  Vector3D endPose[FOOTS_COUNT], long maxTime, Motion* pNext) : Motion(maxTime, -1, pNext) {
  for(int i = 0; i < FOOTS_COUNT; i++) {
    m_Pose0[i] = begPose[i];
    m_Offset[i] = endPose[i] - begPose[i];
  }
}


рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рд╡рд┐рд╕реНрдерд╛рдкрди рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЬрд╛рдирдХрд░, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд░рд▓ рд░реЗрдЦреАрдп рдЧрдгрдирд╛ рдХрд░рдХреЗ 0 рд╕реЗ рдЕрдзрд┐рдХрддрдо рд╕рдордп рддрдХ рдЧреЗрдЯрдкреЙрдЬ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрдВрдЬреЗ рдХреА рдирдИ рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

int TransPoseMotion :: getPose (...)
int TransPoseMotion::getPose(long time, Vector3D points[FOOTS_COUNT]) {
  for(int i = 0; i < FOOTS_COUNT; i++)
    linearFunc(1.0, m_Offset[i], m_Pose0[i], 1.0*time/m_MaxTime, points[i]);
}


рд░реИрдЦрд┐рдХ рд╕рдВрдЧрдгрдирд╛рдПрдБ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рд░реИрдЦрд┐рдХрдлреБрдирдХ рдХреЛ рд╕реМрдВрдкреА рдЬрд╛рддреА рд╣реИрдВ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реИрдЦрд┐рдХ рд╕рдореАрдХрд░рдг рд╣реИред

рд╢реВрдиреНрдп рд░реЗрдЦрд╛рдЪрд┐рддреНрд░ (...)
void linearFunc(float a, Vector3D offset, Vector3D p0, float k,  Vector3D& res) {
  res = a*offset*k + p0;
}


TransAnglesMotion рдХреНрд▓рд╛рд╕


рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рддрд░реНрдХ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдВрд╕рдПрдВрдЧреНрд▓реЗрд╕рдореЛрд╢рди рдХреНрд▓рд╛рд╕ рдореЗрдВ , рд╣реЗрдХреНрд╕рд╛рдкреЙрдб рдЕрдВрдЧреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛрдгреЛрдВ рдХреЗ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЙрд╕рдХреЗ рдЬреЛрдбрд╝реЛрдВ рдХреЛ рдЭреБрдХрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд░реЛрдмреЛрдЯ рдкрдВрдЬреЗ рдХреЗ рд╕рд┐рд░реЛрдВ рдХреЗ рд╕реНрдерд╛рдирд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ред

TransAnglesMotion :: TransAnglesMotion (...)
TransAnglesMotion::TransAnglesMotion(int begPose[FOOTS_COUNT][3],
  int endPose[FOOTS_COUNT][3], long maxTime, Motion* pNext) : Motion(maxTime, -1, pNext) {
  for(int i = 0; i < FOOTS_COUNT; i++) {
    for(int j = 0; j < 3; j++) {
      m_Pose0[i][j] = begPose[i][j];
      m_Offset[i][j] = endPose[i][j] - begPose[i][j];
    }
  }
}



int TransAnglesMotion :: getPose (...)
int TransAnglesMotion::getPose(long time, int pose[FOOTS_COUNT][3]) {
  for(int i = 0; i < FOOTS_COUNT; i++) {
    for(int j = 0; j < 3; j++) 
      pose[i][j] = m_Pose0[i][j] + (int)(1.0*m_Offset[i][j]*time/m_MaxTime);
  }
  return S_OK;
}


рд▓реАрдирд┐рдпрд░рдореЛрд╢рди рдХреНрд▓рд╛рд╕


рд╕реАрдзреЗ рдЧрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХреЛрдб рдФрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣реЗрдХреНрд╕рд╛рдкреЙрдб рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдЕрдВрдЧреЛрдВ рдХреА рдПрдХ рдЗрд╖реНрдЯрддрдо рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬреЛ рдЪрд▓рддреЗ рд╕рдордп рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рддреАрди рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рддрд╛рдХрд┐ рд░реЛрдмреЛрдЯ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдХреЗрдВрджреНрд░ рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╣рдореЗрд╢рд╛ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЧрдард┐рдд рддреНрд░рд┐рдХреЛрдг рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╣реЛред рдпрд╣ рдЪрд▓рддреЗ рд╕рдордп рд░реЛрдмреЛрдЯ рдХреА рдПрдХ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рддрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд░реЛрдмреЛрдЯ рдХреЗ рдЖрдпрддрд╛рдХрд╛рд░ рдЖрдВрджреЛрд▓рди рдХреЛ рд╕рдорд╛рди рдЪрд░рдгреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ, рджреЛ рдЪрд░рдгреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдкреИрд░реЛрдВ рдХреА рдПрдХ рддреНрд░рдп рд╕рддрд╣ рдХреЛ рдЫреВрддреА рд╣реИ рдФрд░ рдЙрдирдХреЗ рдЫреЛрд░ рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рд╕рддрд╣ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрдВрдЬреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддреНрд░реИрдорд╛рд╕рд┐рдХ рд╕рддрд╣ рдХреЛ рдЫреВрдиреЗ рдХреЗ рдмрд┐рдирд╛, рд░реЛрдмреЛрдЯ рдХреА рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдШреБрдорд╛рд╡рджрд╛рд░ рдкрде рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИредрдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░, рд╡реЗ рдЕрдкрдиреЗ рдЪрд░рдо рд╕реНрдерд╛рди рдкрд░ рдкрд╣реБрдБрдЪ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рддреНрд░рд┐рдХ рд╕рддрд╣ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ, рдЧрддрд┐ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рд░ рджреВрд╕рд░рд╛ рддреНрд░реИрдорд╛рд╕рд┐рдХ рд░реЛрдмреЛрдЯ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдкрд░ рдкрд╣рд▓рд╛ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред



рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдПрдХ рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдПрдиреАрдореЗрд╢рди рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ , рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдореВрд▓ рд╕реНрд░реЛрдд рд╣рдмреНрд░ рдерд╛ , рдФрд░ рдкреНрд░рдХрд╛рд╢рди рдХрд╛ рд▓реЗрдЦрдХ рд╕рдореНрдорд╛рдирд┐рдд рдХреЛрдВрдХреЙрд░реНрдб рдерд╛ ред

рдЖрдВрджреЛрд▓рди рдХреЛ рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рдореЗрдВ рд╕рд╛рдХрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рд╕рддрд╣ ( рдПрдбрд╝реА ) рд╕реЗ рдкреИрд░реЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЖрдВрджреЛрд▓рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ (рдФрд░ рдЕрдВрдд рдореЗрдВ) рд░реЛрдмреЛрдЯ рдЕрдВрдЧреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ ( pose0 ), рд╡реЗрдЧ рд╡реЗрдХреНрдЯрд░ ( рдЧрддрд┐ ), рдПрдХ рдХрджрдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп ( рдЕрдзрд┐рдХрддрдо рд╕рдордп ), рдФрд░ рд░реЛрдмреЛрдЯ рдХреЛ рдХрд┐рддрдиреА рджреЗрд░ рддрдХ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдЖрдВрджреЛрд▓рди (рдкреНрд░рджрд░реНрд╢рди totalTime )ред рдЖрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ totalTimeрдЬрдм рддрдХ рд░реЛрдмреЛрдЯ рдХрд╛ рдЪрд╛рд░реНрдЬ рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рдпрд╛ рдЖрдВрджреЛрд▓рди рдЬрдмрд░рди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рддрдм рддрдХ рдпрд╣ рдЖрдВрджреЛрд▓рди рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ред

рд▓реАрдирд┐рдпрд░рдореЛрд╢рди :: рд▓реАрдирд┐рдпрд░рдореЛрд╢рди (...)
LinearMotion::LinearMotion(int heigth, Vector3D pose0[FOOTS_COUNT], Vector3D speed,
  long maxTime, long totalTime, Motion* pNext = NULL) 
    : Motion(maxTime, true, totalTime, pNext) {
  copyPose(m_Pose0, pose0);
  m_Offset = 1.0*speed*maxTime/1000;
  m_Heigth = heigth;
}

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЧреЗрдЯрдкреЙрдЬ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рд╣реИ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред

рдЗрдВрдЯ рд▓реАрдирд┐рдпрд░рдореЛрд╢рди :: getPose (...)
int LinearMotion::getPose(long time, Vector3D points[FOOTS_COUNT]) {
  double k = 1.0*time/m_MaxTime;

  if(k < 0.25) {  //   
    linearFunc(2.0, -m_Offset, m_Pose0[LEFT_FRONT_FOOT_IDX], k,
      points[LEFT_FRONT_FOOT_IDX]);
    linearFunc(2.0, -m_Offset, m_Pose0[LEFT_BACK_FOOT_IDX], k,
      points[LEFT_BACK_FOOT_IDX]);
    linearFunc(2.0, -m_Offset, m_Pose0[RIGTH_MIDLE_FOOT_IDX], k,
      points[RIGTH_MIDLE_FOOT_IDX]);

    linearFunc(2.0, m_Offset, m_Pose0[LEFT_MIDLE_FOOT_IDX], k,
      points[LEFT_MIDLE_FOOT_IDX]);
    linearFunc(2.0, m_Offset, m_Pose0[RIGTH_FRONT_FOOT_IDX], k,
      points[RIGTH_FRONT_FOOT_IDX]);
    linearFunc(2.0, m_Offset, m_Pose0[RIGTH_BACK_FOOT_IDX], k,
      points[RIGTH_BACK_FOOT_IDX]);
  
    int h = (int)m_Heigth*cos(M_PI*k*2);
    points[LEFT_MIDLE_FOOT_IDX].z += h;
    points[RIGTH_FRONT_FOOT_IDX].z += h;
    points[RIGTH_BACK_FOOT_IDX].z += h;

  } else if(k < 0.5) { //   
    
    linearFunc(2.0, m_Offset, m_Pose0[LEFT_FRONT_FOOT_IDX], k - 0.5,
      points[LEFT_FRONT_FOOT_IDX]);
    linearFunc(2.0, m_Offset, m_Pose0[LEFT_BACK_FOOT_IDX], k - 0.5,
      points[LEFT_BACK_FOOT_IDX]);
    linearFunc(2.0, m_Offset, m_Pose0[RIGTH_MIDLE_FOOT_IDX], k - 0.5,
      points[RIGTH_MIDLE_FOOT_IDX]);

    linearFunc(2.0, -m_Offset, m_Pose0[LEFT_MIDLE_FOOT_IDX], k - 0.5,
      points[LEFT_MIDLE_FOOT_IDX]);
    linearFunc(2.0, -m_Offset, m_Pose0[RIGTH_FRONT_FOOT_IDX], k - 0.5,
      points[RIGTH_FRONT_FOOT_IDX]);
    linearFunc(2.0, -m_Offset, m_Pose0[RIGTH_BACK_FOOT_IDX], k - 0.5,
      points[RIGTH_BACK_FOOT_IDX]);

    int h = (int)m_Heigth*sin(M_PI*(k - 0.25)*2);
    points[LEFT_FRONT_FOOT_IDX].z += h;
    points[LEFT_BACK_FOOT_IDX].z += h;
    points[RIGTH_MIDLE_FOOT_IDX].z += h;

  } else if(k < 0.75) { //   
    
    linearFunc(2.0, m_Offset, m_Pose0[LEFT_FRONT_FOOT_IDX], k - 0.5,
      points[LEFT_FRONT_FOOT_IDX]);
    linearFunc(2.0, m_Offset, m_Pose0[LEFT_BACK_FOOT_IDX], k - 0.5,
      points[LEFT_BACK_FOOT_IDX]);
    linearFunc(2.0, m_Offset, m_Pose0[RIGTH_MIDLE_FOOT_IDX], k - 0.5,
      points[RIGTH_MIDLE_FOOT_IDX]);

    linearFunc(2.0, -m_Offset, m_Pose0[LEFT_MIDLE_FOOT_IDX], k - 0.5,
      points[LEFT_MIDLE_FOOT_IDX]);
    linearFunc(2.0, -m_Offset, m_Pose0[RIGTH_FRONT_FOOT_IDX], k - 0.5,
      points[RIGTH_FRONT_FOOT_IDX]);
    linearFunc(2.0, -m_Offset, m_Pose0[RIGTH_BACK_FOOT_IDX], k - 0.5,
      points[RIGTH_BACK_FOOT_IDX]);
    
    int h = (int)m_Heigth*cos(M_PI*(k - 0.5)*2);
    points[LEFT_FRONT_FOOT_IDX].z += h;
    points[LEFT_BACK_FOOT_IDX].z += h;
    points[RIGTH_MIDLE_FOOT_IDX].z += h;
    
  } else {  //   
    
    linearFunc(2.0, m_Offset, m_Pose0[LEFT_FRONT_FOOT_IDX], 1 - k,
      points[LEFT_FRONT_FOOT_IDX]);
    linearFunc(2.0, m_Offset, m_Pose0[LEFT_BACK_FOOT_IDX], 1 - k,
      points[LEFT_BACK_FOOT_IDX]);
    linearFunc(2.0, m_Offset, m_Pose0[RIGTH_MIDLE_FOOT_IDX], 1 - k,
      points[RIGTH_MIDLE_FOOT_IDX]);

    linearFunc(2.0, -m_Offset, m_Pose0[LEFT_MIDLE_FOOT_IDX], 1 - k,
      points[LEFT_MIDLE_FOOT_IDX]);
    linearFunc(2.0, -m_Offset, m_Pose0[RIGTH_FRONT_FOOT_IDX], 1 - k,
      points[RIGTH_FRONT_FOOT_IDX]);
    linearFunc(2.0, -m_Offset, m_Pose0[RIGTH_BACK_FOOT_IDX], 1 - k,
      points[RIGTH_BACK_FOOT_IDX]);
    
    int h = (int)m_Heigth*sin(M_PI*(k - 0.75)*2);
    points[LEFT_MIDLE_FOOT_IDX].z += h;
    points[RIGTH_FRONT_FOOT_IDX].z += h;
    points[RIGTH_BACK_FOOT_IDX].z += h;
  }

  return S_OK;
}


рд╣рдо рдкреВрд░реЗ рдЪрд░рдг рдХреЛ рдЪрд╛рд░ рддрд┐рдорд╛рд╣рд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  1. рдкрд╣рд▓реЗ рддреНрд░реИрдорд╛рд╕рд┐рдХ рдореЗрдВ, рдЕрдВрдЧреЛрдВ рдХреА рдкрд╣рд▓реА рддреНрд░рдп (рдмрд╛рдПрдВ рд╕рд╛рдордиреЗ, рдмрд╛рдПрдВ рдкреАрдЫреЗ рдФрд░ рджрд╛рдПрдВ рдордзреНрдп) рдПрдХ рдзрдХреНрдХрд╛ рдЖрдВрджреЛрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд╡реЗ рд╕рддрд╣ рдХреЗ рд╕рд╛рде рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЖрдВрджреЛрд▓рди рдХрд░рддреЗ рд╣реИрдВред рдкрдВрдЬреЗ рдХреА рджреВрд╕рд░реА рддрд┐рдХрдбрд╝реА (рджрд╛рдПрдВ рд╕рд╛рдордиреЗ, рджрд╛рдПрдВ рдкреАрда рдФрд░ рдмрд╛рдПрдВ рдордзреНрдп) рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЪрд▓рддреА рд╣реИ, рдЬрдмрдХрд┐ рдЙрдирдХреЗ рдЙрджрдп рдХреА рдКрдВрдЪрд╛рдИ рдкреИрд░реЛрдВ рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдКрдВрдЪрд╛рдИ (рддрд┐рдорд╛рд╣реА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ) рд╕реЗ рдЕрдзрд┐рдХрддрдо (рддрд┐рдорд╛рд╣реА рдХреЗ рдЕрдВрдд рдореЗрдВ) рд╕рд╛рдЗрди рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИред
  2. рджреВрд╕рд░реА рддрд┐рдорд╛рд╣реА рдореЗрдВ, рддреАрдиреЛрдВ рдХреА рджрд┐рд╢рд╛рдПрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИрдВред рдЕрдм рдкрдВрдЬреЗ рдХреА рджреВрд╕рд░реА рддрд┐рдХрдбрд╝реА рд░реЛрдмреЛрдЯ рдХреЛ рд▓реЗ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкрд╣рд▓реА рдЪрд╛рд▓ рд░реЛрдмреЛрдЯ рдХреА рддрд░рд╣ рдЪрд▓рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓реЗ рддреНрд░рдп рдХреЗ рдкрдВрдЬреЗ рдХреА рдКрдВрдЪрд╛рдИ рдПрдХ рд╕рд╛рдЗрдирд╕реЙрдЗрдб рдореЗрдВ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рддрдХ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред
  3. рддреАрд╕рд░реА рддрд┐рдорд╛рд╣реА рдореЗрдВ, рдкрдВрдЬреЗ рдХреА рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдмрдирд╛рдП рд░рдЦреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рддреНрд░реИрдорд╛рд╕рд┐рдХ рдХреЗ рдЫреЛрд░ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреАрд╕рд░реА рддрд┐рдорд╛рд╣реА рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рддрд╣ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВред
  4. рдЕрдВрддрд┐рдо рддрд┐рдорд╛рд╣реА рдореЗрдВ, рдкрд╣рд▓рд╛ рддреНрд░рдп рд╕рдорд░реНрдерди рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕рд╛рдЗрдирд╕реЙрдЗрдб рдХреЗ рд╕рд╛рде рдКрдкрд░ рдХреА рдУрд░ рдмрдврд╝рддреА рд╣реИ, рдЬреЛ рддрд┐рдорд╛рд╣реА рдХреЗ рдЕрдВрдд рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдКрдВрдЪрд╛рдИ рддрдХ рдкрд╣реБрдВрдЪрддреА рд╣реИред

рд░реЛрдЯреЗрдЯрдореЛрд╢рди рдХреНрд▓рд╛рд╕


рд▓рд┐рдирд┐рдпрд░рдореЛрд╢рди рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рдж , рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд░реЛрдЯреЗрдЯрдореЛрд╢рди рдХреНрд▓рд╛рд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

RotateMotion :: RotateMotion (...)
RotateMotion::RotateMotion(int heigth, Vector3D pose0[FOOTS_COUNT], Vector3D speed,
  long maxTime, long totalTime = -1, Motion* pNext = NULL) 
    : Motion(maxTime, true, totalTime, pNext) {
  copyPose(m_Pose0, pose0);
  m_Angles = 0.001*maxTime*speed*M_PI/180;
  m_Heigth = heigth;
}


рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рджреЛрдиреЛрдВ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВред рдХреЗрд╡рд▓ рдЧрддрд┐ рдХреЗ рдЙрд▓рдЯ рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдгреАрдп рд╡реЗрдЧ рд╡реЗрдХреНрдЯрд░ рд╣реИ рдЬреЛ рд░реЛрдмреЛрдЯ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреА рдзреБрд░реА рдФрд░ рдЧрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рд░реЛрдЯреЗрдЯрдореЛрд╢рди рдХреНрд▓рд╛рд╕

рдХреА рдЧреЗрдЯрдкреЙрдЬ рд╡рд┐рдзрд┐ рдореЗрдВ , рдХрд╛рд░реНрдп рдХрд╛ рддрд░реНрдХ рднреА рдЪрд╛рд░ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрдВрдЬреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реИрдЦрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд░реИрдЦрд┐рдХрдлрдВрдХ рдХреЗ рдмрдЬрд╛рдп , рд░реЗрдбрд┐рдпрд▓ рдлрд╝рдВрдХреНрд╢рди рд░реЛрдЯрдлреБрдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

int RotateMotion :: getPose (...)
int RotateMotion::getPose(long time, Vector3D points[FOOTS_COUNT]) {
  double k = 1.0*time/m_MaxTime;
  if(k < 0.25) {  //   

    rotFunc(2.0, m_Angles, m_Pose0[LEFT_FRONT_FOOT_IDX], k,
      points[LEFT_FRONT_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_BACK_FOOT_IDX], k,
      points[LEFT_BACK_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_MIDLE_FOOT_IDX], k,
      points[RIGTH_MIDLE_FOOT_IDX]);
      
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_MIDLE_FOOT_IDX], -k,
      points[LEFT_MIDLE_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_FRONT_FOOT_IDX], -k,
      points[RIGTH_FRONT_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_BACK_FOOT_IDX], -k,
      points[RIGTH_BACK_FOOT_IDX]);

    int h = (int)m_Heigth*cos(M_PI*k*2);
    points[LEFT_MIDLE_FOOT_IDX].z += h;
    points[RIGTH_FRONT_FOOT_IDX].z += h;
    points[RIGTH_BACK_FOOT_IDX].z += h;

  } else if(k < 0.5) {  //   
    
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_FRONT_FOOT_IDX], 0.5 - k,
      points[LEFT_FRONT_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_BACK_FOOT_IDX], 0.5 - k,
      points[LEFT_BACK_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_MIDLE_FOOT_IDX], 0.5 - k,
      points[RIGTH_MIDLE_FOOT_IDX]);
      
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_MIDLE_FOOT_IDX], k - 0.5,
      points[LEFT_MIDLE_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_FRONT_FOOT_IDX], k - 0.5,
      points[RIGTH_FRONT_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_BACK_FOOT_IDX], k - 0.5,
      points[RIGTH_BACK_FOOT_IDX]);
  
    int h = (int)m_Heigth*sin(M_PI*(k - 0.25)*2);
    points[LEFT_FRONT_FOOT_IDX].z += h;
    points[LEFT_BACK_FOOT_IDX].z += h;
    points[RIGTH_MIDLE_FOOT_IDX].z += h;

  } else if(k < 0.75) {  //   
  
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_FRONT_FOOT_IDX], 0.5 - k,
      points[LEFT_FRONT_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_BACK_FOOT_IDX], 0.5 - k,
      points[LEFT_BACK_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_MIDLE_FOOT_IDX], 0.5 - k,
      points[RIGTH_MIDLE_FOOT_IDX]);
      
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_MIDLE_FOOT_IDX], k - 0.5,
      points[LEFT_MIDLE_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_FRONT_FOOT_IDX], k - 0.5,
      points[RIGTH_FRONT_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_BACK_FOOT_IDX], k - 0.5,
      points[RIGTH_BACK_FOOT_IDX]);
  
    int h = (int)m_Heigth*cos(M_PI*(k - 0.5)*2);
    points[LEFT_FRONT_FOOT_IDX].z += h;
    points[LEFT_BACK_FOOT_IDX].z += h;
    points[RIGTH_MIDLE_FOOT_IDX].z += h;
  } else { //   
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_FRONT_FOOT_IDX], k - 1,
      points[LEFT_FRONT_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_BACK_FOOT_IDX], k - 1,
      points[LEFT_BACK_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_MIDLE_FOOT_IDX], k - 1,
      points[RIGTH_MIDLE_FOOT_IDX]);
      
    rotFunc(2.0, m_Angles, m_Pose0[LEFT_MIDLE_FOOT_IDX], 1 - k,
      points[LEFT_MIDLE_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_FRONT_FOOT_IDX], 1 - k,
      points[RIGTH_FRONT_FOOT_IDX]);
    rotFunc(2.0, m_Angles, m_Pose0[RIGTH_BACK_FOOT_IDX], 1 - k,
      points[RIGTH_BACK_FOOT_IDX]);

    int h = (int)m_Heigth*sin(M_PI*(k - 0.75)*2);
    points[LEFT_MIDLE_FOOT_IDX].z += h;
    points[RIGTH_FRONT_FOOT_IDX].z += h;
    points[RIGTH_BACK_FOOT_IDX].z += h;
  }
  return S_OK;
}


рд░реЗрдбрд┐рдпрд▓ рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рд░реЛрдмреЛрдЯ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордиреЗ рдХреЗ рдмрд╛рдж рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рд╢реВрдиреНрдп рд╕рдбрд╝рдирд╛ (...)
void rotFunc(float a, Vector3D angles, Vector3D p0, float k, Vector3D& res) {
  Matrix3D m = rotMatrix2(a*angles*k);
  res = m*p0;
}


рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░, рдПрдХ рдЧрдгрд┐рддреАрдп рдЙрдкрдХрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╣рдордиреЗ рд░реЛрдмреЛрдЯ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХреЗ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рдпрд╛ рдЯрд┐рдкреНрдкрдгреА рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрдирдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдХреЛ рд╢реЗрд╖ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред
рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж!

рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИтАж

All Articles