Beginner:How can i set a key-frame and value to a cube by python?
-
Hi~As a crazy beginner.
what puzzled me recently is how I can set a Key-frame and value to a cube
my question is so simple while the existed codes are not so friendly to a beginner due to the no explanation
(BTW, the systematic python-C4D video tutorial is so rare )Python question:
**I want to set cube Y position in 0cm in 1st key-frame and 100cm in 10th key-frame, BTW, let them ease in and out **import c4d input = c4d.BaseObject(5159) #???????????????? #how to set key-frame? doc.InsertObject(input) c4d.EventAdd()
How to do it ?
Thanks if you can help me ,i know my question is simple,but i am in the way to be professional. -
Hello,
I've marked your thread as a question, feel free to mark it as solved when you think it is, see this thread for information : Q&A New Functionality.
I have to make things clear here. Your screenshot show you are using a generator while you code add object to the document. You can't modify the scene in a generator. It's forbidden. For this kind of scenario, (add object to a scene and tracks and keys) it's better to use a script.
a few links to have information, even if they are about c++ there are lot of information there.
You have to create a track for each vector (position, rotation, scale) and for each vector's component (X,Y,Z)
I've create a script example for only the position X parameter. Feel free to create a function for that and add other track (Y, Z and rotation, scale etc)import c4d # Welcome to the world of Python # Main function def main(): # Creates the object in memory obj = c4d.BaseObject(c4d.Ocube) # Creates the track in memory. Defined by it's DESCID trY = c4d.CTrack(obj, c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0), c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0))) # Gets Curves for the track curveY = trY.GetCurve() # Retrieves the current time keyTime = c4d.BaseTime(0) # Adds the keys added = curveY.AddKey(keyTime) # Checks for error if added is None: raise TypeError("cannont create a key") # Retrieves the inserted key firstKey = added["key"] kIndex = added["nidx"] # Sets the value of the key firstKey.SetValue(curveY, 0) # Changes it's interpolation firstKey.SetInterpolation(curveY,c4d.CINTERPOLATION_SPLINE) # Sets the key to default status AutoTangent etc... curveY.SetKeyDefault(doc,kIndex) # Adds another key keyTime = c4d.BaseTime(10, doc.GetFps()) added = curveY.AddKey(keyTime) if added is None: raise TypeError("cannont create a key") secondKey = added["key"] kIndex = added["nidx"] secondKey.SetValue(curveY, 100) secondKey.SetInterpolation(curveY, c4d.CINTERPOLATION_SPLINE) curveY.SetKeyDefault(doc, kIndex) # Inserts track to the object obj.InsertTrackSorted(trY) # Inserts the object in document doc.InsertObject(obj) # Pushes an update event to Cinema 4D c4d.EventAdd() # Execute main() if __name__=='__main__': main()
Cheers
Manuel -
@m_magalhaes
Thanks !!!! You certainly help me a lot!!!
I spend around half an hour to deeply understand code with the reference of the official document!
so excited that I figure out this problem!Btw, what if I want to add the key to 'Size Y'to this cube,? I should replace
.......... c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0) .........
with
.......... c4d.DescLevel(c4d.PRIM_CUBE_LEN, c4d.DTYPE_VECTOR_Y, 0) ...........
right?
-
@m_magalhaes Thanks ! You certainly help me a lot!
-
hello,
thanks @tummosoft, it's nice to see it's helpful@ilad
By the way instead ofID_BASEOBJECT_POSITION
you could have useID_BASEOBJECT_REL_POSITION
. Both Ids are the same.If you want to know how to get those ids you can use the python console and drag and drop parameters, more information on this page
In this case the DescID is composed of two DescLevel. The first define the Vector type, the second de Float type for X, Y and Z.
(DescID can have less or more levels)
To change the Size.Y of the cube, the descID will be :
c4d.DescID(c4d.DescLevel(c4d.PRIM_CUBE_LEN, c4d.DTYPE_VECTOR, 0), c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)))
To change the scale of the object the descID will be :
c4d.DescID(c4d.DescLevel(c4d.ID_BASEOBJECT_REL_SCALE, c4d.DTYPE_VECTOR, 0), c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)))
Cheers
Manuel