Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
On 27/11/2014 at 03:45, xxxxxxxx wrote:
Hi guys,
I just moved from 3ds max to c4d and so I m moving from maxscript to python at the same time.
I am trying to write a script to automate baking on selected object, to be more specific creating a null and matching his position/rotation/scale to the object and keying the null on every frame.
In maxscript I would have done a for loop looking like that (baking the object named 'objectToBake' for a 250 frames long scene) : ------------------------------------ target=$objectToBake obj=point() //create null
for i=0 to 250 do ( sliderTime = i obj.transform=target.transform obj.addkey (this won t be that line but it s just the concept) ) ------------------------------------
Then in c4d I did the same thing in python. So within the object to bake selected I run this: ------------------------------------ import c4d from c4d import gui #Welcome to the world of Python
scene_fps=doc[c4d.DOCUMENT_FPS] sceneStart=doc[c4d.DOCUMENT_MINTIME] sceneEnd=doc[c4d.DOCUMENT_MAXTIME]
obj=c4d.BaseObject(5140) doc.InsertObject(obj)
target=doc.GetActiveObject()
posTrack=obj.FindCTrack(c4d.ID_BASEOBJECT_REL_POSITION) if not posTrack: posTrack=c4d.CTrack(obj,c4d.ID_BASEOBJECT_REL_POSITION) obj.InsertTrackSorted(posTrack)
curve=posTrack.GetCurve()
for i in range(0,91) : doc[c4d.DOCUMENT_TIME]=c4d.BaseTime(i,scene_fps) newPos=target[c4d.ID_BASEOBJECT_REL_POSITION] obj[c4d.ID_BASEOBJECT_REL_POSITION]=newPos keySet=curve.AddKey(c4d.BaseTime(i,scene_fps)) posTrack.FillKey(doc,obj,keySet["key"]) c4d.EventAdd() // here is my issue, can t update during a loop
----------------------------------------
And basically it works only on the first frame. From what I read it s all because script in c4d are singlethread and so the positions don t update during the loop even though I update the time slider position during the loop.
So now I m trying to do it through a plugin hoping now my positions will be updated during the loop. Is a plugin the good way to do it ?
I also want to create an user inteface to select the objects I want to bake and all that stuff. And then I was wondering if this go with the plugin as well and if a plugin is the only way to do it.
Hope all this is not to confusing but I m a bit lost with what script are doing and what plugins are for in c4d.
Would be great if you can let me know if I m in the good direction or not. To make it very simple, I just want to know what is the way to run commands in a loop and having everything updated at each loop iteration.
Thank you !
On 27/11/2014 at 04:03, xxxxxxxx wrote:
Hello,
you might have a look at this thread, there is a basic bake script,
https://plugincafe.maxon.net/topic/8163/10637_bake-object&KW=bake
There is a sync message that will update your scene like:
c4d.GeSyncMessage(c4d.EVMSG_TIMECHANGED)
You can use a script even if you want to use a dialog. A async dialog plugin might be a good choice, too.
Best wishes Martin
On 28/11/2014 at 00:38, xxxxxxxx wrote:
Hello and welcome,
setting the current frame of a document is not as simple as:
doc[c4d.DOCUMENT_TIME]=c4d.BaseTime(i,scene_fps)
You can use SetTime() to set the current frame of a document. However this will not animate the scene. To get the state of an object in a certain frame you have to animate the scene since the state of an object may depend on other objects like deformers, effectors etc. To animate the scene use ExecutePasses():
for i in range(0,90) : time = c4d.BaseTime(i,fps) doc.SetTime(time) doc.ExecutePasses(None,True,True,True,c4d.BUILDFLAGS_0)
best wishes, Sebastian
On 28/11/2014 at 02:49, xxxxxxxx wrote:
Thanks Sebastian for the detailed explanation! Always great to see how you straighten things out!
That´s what the
def SetCurrentFr(FR, doc) :
function in my script does.
Just a small additional note. After some experiments with baking mograph, dynamics, etc. I recommend to use the
key = curve.AddKey(CurrTime)['key'] tr.FillKey(doc,m,key)
instead of
key = curve.AddKey(CurrTime)['key'] key.SetValue(curve, val)
for translation keys.
On 05/12/2014 at 08:22, xxxxxxxx wrote:
Hello had,
was your question answered?