Animation position/rotation using Python



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/01/2011 at 14:27, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   12 
    Platform:   Windows  ;   
    Language(s) :       PYTHON  ;

    ---------
    New to C4D but very experienced elsewhere. I'm trying to animate objects' position and rotation through the python API. I'll have to animate some other things eventually too. I tried using the typical approach of document.SetTime and SetAbsPos, but that didn't seem to have any effect. Is there a recording flag that needs to be turned on? Or are CTrack and CKey supposed to be used---but how? I see some forum posts relating to this involving DescIDs, where is the (meaningful) documentation for this? (in any programming language) Can switch to COFFEE if really necessary, but C++ is unacceptable for this application. Thanks.



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 15/01/2011 at 20:28, xxxxxxxx wrote:

    Well,  I can show you the code I use to rotate my planet objects in PXG.   It is using C++ but it might help you with Python.

      
    //ROTATE PLANET  
    //====================================================//  
    Bool PlanetXObject::RotatePlanet(BaseObject *op, GeListNode* node){  
        
      if (!op) return FALSE;  
      BaseContainer *bc = ((BaseList2D* )node)->GetDataInstance();   
      if (!bc) return FALSE;  
      BaseDocument *doc = op->GetDocument();  
      if(!doc) return FALSE;  
      BaseTime time = doc->GetTime();  
      Real fps = doc->GetFps();  
      
      //Rotation Track Vector  
      DescID idRotX = DescID(DescLevel(ID_BASEOBJECT_REL_ROTATION,DTYPE_VECTOR,0),DescLevel(VECTOR_X,DTYPE_REAL,0));  
      
      //Planet COUNTER CLOCKWISE Rotation  
      //==========================================//  
      if (bc->GetBool(PLANETX_GENERAL_ENABLE_ROTATION)  &&   
          bc->GetBool(PLANETX_GENERAL_ROTATION_DIRECTION) == PLANETX_GENERAL_ROTATION_COUNTER_CLOCKWISE){  
            
          //Remove Existing Track  
          //==========================================//  
          if (op->FindCTrack(idRotX)){  
              op->FindCTrack(idRotX)->Remove();  
          }  
          //Insert the New Track  
          //==========================================//  
          CTrack *track = op->FindCTrack(idRotX);  
          if (!track){  
                
              track = CTrack::Alloc(op,idRotX);  
              if (!track) return FALSE;  
      
              op->InsertTrackSorted(track);  
          }  
      
          //Get the Base Time  
          //==========================================//  
          BaseTime bstime = time;  
      
          //Set the Frame Rate (FPS)  
          //==========================================//  
          bstime.SetDenominator(fps);  
      
          Real deNomin;  
          deNomin = (60 *fps) / bc->GetReal(PLANETX_GENERAL_ROTATION_SPEED);  
      
          //First Key will be set at 0  
          //==========================================//  
          bstime.SetNumerator(0);  
          CKey *keyH = track->GetCurve()->AddKey(bstime,0);  
          if (!keyH) return false;  
          keyH->SetValue(track->GetCurve(),0); //Set Position to 0  
      
          //Second Key will be placed at deNomin  
          //==========================================//  
          bstime.SetNumerator(deNomin);  
          CKey *keyH2 = track->GetCurve()->AddKey(bstime,0);  
          if (!keyH2) return false;  
          keyH2->SetValue(track->GetCurve(),6.283185307); //Set Position to 360  
      
          track->SetAfter(CLOOP_REPEAT);  
      }  
      
      //Planet CLOCKWISE Rotation  
      //==========================================//  
      
      else if (bc->GetBool(PLANETX_GENERAL_ENABLE_ROTATION)  &&    
               bc->GetBool(PLANETX_GENERAL_ROTATION_DIRECTION) == PLANETX_GENERAL_ROTATION_CLOCKWISE)  
      {  
          //Remove Existing Track  
          //==========================================//  
          if (op->FindCTrack(idRotX))  
          {  
              op->FindCTrack(idRotX)->Remove();  
          }  
            
          //Insert the New Track  
          //==========================================//  
          CTrack *track = op->FindCTrack(idRotX);  
          if (!track)  
          {  
              track = CTrack::Alloc(op,idRotX);  
              if (!track) return FALSE;  
              op->InsertTrackSorted(track);  
          }  
      
          //Get the Base Time  
          //==========================================//  
          BaseTime bstime = time;  
            
          //Set the Frame Rate (FPS)  
          //==========================================================================  
          bstime.SetDenominator(fps);  
                
          Real deNomin;  
          deNomin = (60 *fps) / bc->GetReal(PLANETX_GENERAL_ROTATION_SPEED);  
      
          //First Key will be set at 0  
          //==========================================================================  
          bstime.SetNumerator(0);  
          CKey *keyH = track->GetCurve()->AddKey(bstime,0);  
          if (!keyH) return false;  
            
          keyH->SetValue(track->GetCurve(),6.283185307); //Set Position to 360  
            
          //Second Key will be placed at 3 times the location of the frame rate   
          //(i.e. if FPS is set to 30, then the key will be placed at frame 45.  
          //==========================================================================  
          bstime.SetNumerator(deNomin);  
          CKey *keyH2 = track->GetCurve()->AddKey(bstime,0);  
          if (!keyH2) return false;  
          keyH2->SetValue(track->GetCurve(),0); //Set Position to 0  
      
          track->SetAfter(CLOOP_REPEAT);  
      }  
      
      else  
      {  
          //If the track exists remove it!  
          if (op->FindCTrack(idRotX))  
          {  
      
              op->FindCTrack(idRotX)->Remove();  
          }  
      }  
      return TRUE;  
    }  
      
    

    Hope that helps you.  :)



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 20/01/2011 at 23:26, xxxxxxxx wrote:

    This will show you the very basics:

    import c4d
      
    obj = op.GetObject()
      
    def main() :
        t = doc.GetTime().Get()
      
        pos = c4d.Vector(0,t*100, 0)
        rot = c4d.Vector(0,t,0)
      
        obj.SetAbsPos(pos)
        obj.SetAbsRot(rot)
    

Log in to reply