In the world of game development, character rigs are used to create character animation. This is the default solution for humanoid type characters. The character that I want to use (in mobile game development) has odd proportions and using a character rig didn’t seem to be the right.
So I wanted to achieve the following:
Baking Point Level Animation (PLA)
The animation needed to become a “vertex animation” also referred to as “Point Level Animation”, a 3D sequence animated on the vertex or point level.
Baking (tracking) the animation frame by frame is a pretty straight forward action if you are using a polygonal object. I’m using Cinema4D and in Cinema4D it is not possible to bake deformers like Sub Division (C4D R18 also supports OpenSubDiv, Pixar has a lot of in-depth info on OpenSubDiv).
This is where the Xpresso node-based editor comes into the picture.
Basically, I used the correction deformer to get the index of the vertex information and then passed this on to a polygonal object with the same amount of points. This is a polygonal object, so from here the point level animation could be tracked and baked.
Another challenge is export to an OBJ sequence, you can export to OBJ in C4D but there is no build-in option for exporting a sequence of OBJ files. After some Google searches I found bits and pieces of Python scripts and after a bit of tweaking the following Python script worked for me on OS-X:
import c4d import os import subprocess from c4d import gui #Welcome to the world of Python def main(): # get active document doc = c4d.documents.GetActiveDocument() # retrieve an instance of render data renderSettings = doc.GetActiveRenderData() # retrieve fps docFps = 30 # Get Animation Length fromTime = 0 toTime = 82 animLength = toTime - fromTime + 1 # prompt user for directory filePath = c4d.storage.SaveDialog() filePath, objName = os.path.split(filePath) objName = objName + "_" filePath = filePath + "/" # Check for confirmation questionDialogText = "Obj Sequence will be saved as:n"\ "" + filePath + objName + "####.obj"\ "From frame " + str(fromTime) + " to " + str(toTime) + " for " + str(animLength) + " frames.\n" proceedBool = c4d.gui.QuestionDialog(questionDialogText) if proceedBool == True: # Loop through animation and export frames for x in range(0,animLength): # change frame, redraw view moveTime = c4d.BaseTime(fromTime,docFps) + c4d.BaseTime(x,docFps) doc.SetTime(moveTime) c4d.EventAdd(c4d.EVENT_FORCEREDRAW) c4d.DrawViews(c4d.DRAWFLAGS_FORCEFULLREDRAW) # progress bar c4d.StatusSetText("Exporting " + str(x) + " of " + str(animLength)) c4d.StatusSetBar(100.0*x/animLength) # add buffer 0001 bufferedNumber = str(doc.GetTime().GetFrame(docFps)) if len(bufferedNumber)<4: for x in range(len(bufferedNumber),4): bufferedNumber = "0" + bufferedNumber # save file fileName = filePath+objName+bufferedNumber+".obj" print fileName c4d.documents.SaveDocument(doc,fileName,c4d.SAVEDOCUMENTFLAGS_DONTADDTORECENTLIST,1030178) else: print "User directed cancel" c4d.StatusClear() if __name__=='__main__': main()