failing to access CTracks



  • On 29/03/2013 at 06:16, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   14.034 
    Platform:   Windows  ;   
    Language(s) :     C++  ;

    ---------
    Hello,

    I am writing an exporter in C++ and cannot get any CTracks from my animated objects.
    Here is the simple code:

    BaseObject* op = doc->GetFirstObject();
    CTrack* track = op->GetFirstCTrack();

    while (track)
    {
      GePrint( "found track: " + track->GetName() );
      track = track->GetNext();
    }

    GetFirstCTrack() never returns a CTrack object.

    I am new to the C++ SDK but I have managed to export static transformations, polygons, uvs etc.

    Is there a plugin or function inside of Cinema 4D to get detailed SDK data structure information for debugging purposes?

    Thanks for any help.



  • On 29/03/2013 at 07:58, xxxxxxxx wrote:

    It looks like you might not be going deep enough.
    Keys reside on curves, which reside in tracks.
    So to get at a key value you need to go through the track->curve->key tree branching system.

    Example:

    //This code Get's the key values on all the tracks of an object   
      
      BaseObject* obj = doc->GetActiveObject();      //Get the active object  
      if(!obj) return False;  
      
      BaseTime time = doc->GetTime();               //Assigns the basetime class to a variable  
      Real fps = doc->GetFps();                     //Gets the frames per second value  
      Real currentFrame = time.GetFrame(fps);       //The current frame the slider is on  
      CTrack *trk = obj->GetFirstCTrack();          //Get the first track  
       
      while(trk)  
      {  
          CCurve *curve = trk->GetCurve(CCURVE_CURVE, FALSE); //Get the curve on the first track  
          Real i;  
          for(i=0; i<curve->GetKeyCount(); i++)   
          {         
              CKey *keys = curve->GetKey(i);                   //Get all of the keys  
          Real keyframe = keys->GetTime().GetFrame(fps);   //Assing the frame the keys are on to this variable  
          float keyvalues = keys->GetValue();              // Get the values of each key   
      
          GePrint("Frame= "+ RealToString(keyframe) + "  " + "   " + "Values= " + RealToString(keyvalues));     
          }  
      
          trk = trk->GetNext();  
       }
    

    -ScottA



  • On 29/03/2013 at 08:50, xxxxxxxx wrote:

    Thanks for the code ScottA,

    I didn't even get to CCurve and CKey yet because my problem is getting anything but NULL from:

    CTrack \*trk = obj->GetFirstCTrack();
    


  • On 30/03/2013 at 17:35, xxxxxxxx wrote:

    Trying the same in python gives me the expected CTrack names and subsequent data, so I know I actually have animated data...

    import c4d  
      
    def main() :  
      obj = doc.GetFirstObject()  
      
      while obj != None:  
        
          print "tracks found for '" + obj.GetName() + ":"  
        
          track = obj.GetFirstCTrack()  
          while track != None:  
              print track.GetName()  
              curve = track.GetCurve()  
              idx=0  
              while idx < curve.GetKeyCount() :  
                  key = curve.GetKey(idx)  
                  time = key.GetTime()  
                  print str( time.GetFrame(doc.GetFps()) ) + ": " + str(key.GetValue())  
                  idx+=1  
              track = track.GetNext()  
                
          obj = obj.GetNext()  
    


  • On 01/04/2013 at 04:35, xxxxxxxx wrote:

    Found the error on my part:

    I created a clone of my document:

    doc->Polygonize();

    which defaults to not cloning any animations.

    doc->Polygonize( true );

    Does the trick.


Log in to reply