Drive smooth rotation
-
Hey, I've been trying to create a python node in xpresso to emulate this bit of code from the amazing Mr Ebberts...
http://motionscript.com/articles/speed-control.html
Here's the After Effects expression I'm trying to translate...
spd = effect("Slider Control")("Slider"); n = spd.numKeys; if (n > 0 && spd.key(1).time < time){ accum = spd.key(1).value*(spd.key(1).time - inPoint); for (i = 2; i <= n; i++){ if (spd.key(i).time > time) break; k1 = spd.key(i-1); k2 = spd.key(i); accum += (k1.value + k2.value)*(k2.time - k1.time)/2; } accum += (spd.value + spd.key(i-1).value)*(time - spd.key(i-1).time)/2; }else{ accum = spd.value*(time - inPoint); } value + accum
Here's where I'm at with my Python translation...
from typing import Optional import c4d op: c4d.modules.graphview.GvNode # The Xpresso node doc: c4d.documents.BaseDocument # The document evaluating this node tp: Optional[c4d.modules.thinkingparticles.TP_MasterSystem] # Particle system def main(): global Output1 #Grab the host-object to the xpresso Tag Rect = op.GetNodeMaster().GetOwner().GetObject() #Get the UserData spd = Rect[c4d.ID_USERDATA,1] # Get the first animation track of the object track = Rect.GetFirstCTrack() # Get the animation curve of the track curve = track.GetCurve() # Get the number of keyframes on the curve n = curve.GetKeyCount() fps = doc.GetFps() sFrame= doc.GetMinTime().GetFrame(fps) eFrame= doc.GetMaxTime().GetFrame(fps) name = op.GetName() key = curve.GetKey(1) keyValue = key.GetValue() keyFrame = key.GetTime().GetFrame(fps) currentFrame = doc.GetTime().GetFrame(doc.GetFps()) value = spd if n > 0 and curve.GetKey(1).GetTime().GetFrame(fps) < currentFrame: accum = curve.GetKey(1).GetValue() * (curve.GetKey(1).GetTime().Get() - sFrame) for i in range(2, n): if curve.GetKey(i).GetTime().Get() > currentFrame: break k1 = curve.GetKey(i-1) k2 = curve.GetKey(i) accum += (k1.GetValue() + k2.GetValue()) * (k2.GetTime().Get() - k1.GetTime().Get()) / 2 accum += (curve.GetValue(curve.GetKey(i-1).GetTime()) + curve.GetKey(i-1).GetValue()) * (currentFrame - curve.GetKey(i-1).GetTime().Get()) / 2 else: accum = Input1 * (currentFrame - sFrame) print(Input1 + accum) Output1 = value + accum
- There are loads of unnecessary variables in there btw - that was me just trying to figure this stuff out!
Basically trying to drive rotation without using time as my driver. Now, I'm no programmer (as you'll soon find out!), but the attached project does work, but doesn't do what I want it to! When the UsrData 'speed' gets to 0 it should stop. And the rotation is meant to be smooth ramp up and then smooth ramp down.
Any python geniuses out there got time to take a look and tell me where I'm going wrong?
-
Hi @PMenich first of all welcome to the plugincafe forum.
If you want to embed code in your topic you should use the code markup which consist of 3 `. So you need to do ``` Your Code ``` this way your topic will be more readable, Ferdinand did cleanup your topic.
Regarding your initial question, I would like to let you know this is out of scope of Maxon support according to our Forum and Support Guidelines and we cannot debug your code for you, so it will be up to the community to provide an answers.
Cheers,
Maxime. -
Hello @PMenich ,
without further questions or postings, we will consider this topic as solved by Friday, the 11th of august 2023 and flag it accordingly.
Thank you for your understanding,
Maxon SDK Group