LDCad help combining animation movements


RE: LDCad help combining animation movements
#4
(2020-01-02, 23:37)Walt White Wrote: Appreciate the help.  I'll try to figure out the 8860 code by looking at the "actors" and hopefully my example will have only three actors and each will have a simple motion to describe.

The trick for me will be to recognize the main "story" components out of the 1100 lines of code in 8860.

Both 8860(and your model have only one actor. Actors are used to describe the bone structure of the things moving. This way you won't have to worry about recursion of stuff attached to other stuff.

As it has been a couple of years for me using this stuff myself I went and made the mechanical part of the animation (as far I understand it).

It needs a better story (not just infinite rotation at the starting gear)

But it should get you going a whole lot faster as there is next to nothing documentation wise Big Grin

Code:
genTools=require('genTools') aniTools=require('aniTools') function mainActor()   local mainSf=ldc.subfile()   local result=aniTools.actor()   --Joints and aniElms   result.inputGearsAngle=result:addAniElm(aniTools.aniElm(0))   result:addJoint(aniTools.angleJoint(mainSf:getRef('InputGears.ldr'), result.inputGearsAngle, ldc.vector(0,1,0)))   result.knobPairAngle=result:addAniElm(aniTools.aniElm(0))   result:addJoint(aniTools.angleJoint(mainSf:getRef('KnobPair.ldr'), result.knobPairAngle, ldc.vector(0,0,1)))   result.endGearsAngle=result:addAniElm(aniTools.aniElm(0))   result:addJoint(aniTools.angleJoint(mainSf:getRef('EndGears.ldr'), result.endGearsAngle, ldc.vector(0,1,0)))   result.pivotDriverAngle=result:addAniElm(aniTools.aniElm(0))   result:addJoint(aniTools.angleJoint(mainSf:getRef('PivotDriver.ldr'), result.pivotDriverAngle, ldc.vector(0,1,0)))   result.pivotArmAngle=result:addAniElm(aniTools.aniElm(0))   local arm=result:addJoint(aniTools.angleJoint(mainSf:getRef('PivotArm.ldr'), result.pivotArmAngle, ldc.vector(0,1,0)))   --Attach the hor arm axle to the arm joint instead of the actor itself.   result.pivotHorizontalsAngle=result:addAniElm(aniTools.aniElm(0))   arm:addJoint(aniTools.angleJoint(mainSf:getRef('PivotHorizontals.ldr'), result.pivotHorizontalsAngle, ldc.vector(0,0,1)))   --Create a state tracking table for the pivot angle as everyhing behind it depends on the current mode.   result.modeStateInfo=result:addStateInfo(aniTools.numberDepStateInfo(result.pivotDriverAngle, {mode=0}))   return result end function modeDepAction(actor)   --Custom state dependend action, to handle all possible dependency chains based on a current mode variable.   local result=aniTools.stateInfoDepAction(actor.modeStateInfo, 0, nil)   result.actor=actor     result.initTotals=function(self)     self.totPivotArmAngle=0     self.totPivotHorizontalsAngle=0   end     result.processState=function(self, state)       local mode=state.value.mode     local mainAngle=state.elmValueDiff --don't access pivotDriverAngle directly as that gives it's current ABS angle. We want the one relative to the start of this state segment.     local armAngle=0     local horAngle=0        if mode==0 then       --only arm moves       armAngle=mainAngle     elseif mode==1 then       --block arm       horAngle=-mainAngle     else       --block hor       armAngle=mainAngle       horAngle=-armAngle     end         self.totPivotArmAngle=self.totPivotArmAngle+armAngle     self.totPivotHorizontalsAngle=self.totPivotHorizontalsAngle+horAngle   end     result.applyTotals=function(self)     self.actor.pivotArmAngle:setValue(self.totPivotArmAngle)     self.actor.pivotHorizontalsAngle:setValue(self.totPivotHorizontalsAngle)   end     return result end function onStart()   story=aniTools.story()   local actor=story:addActor(mainActor())   local seq=story:addSequence(aniTools.sequence())     --==actions==--     --base gears run forever   seq:addAction(aniTools.speedAction(actor.inputGearsAngle, 0, nil, 45))   seq:addAction(aniTools.ratioDepAction(actor.knobPairAngle, 0, nil, actor.inputGearsAngle, -1))   seq:addAction(aniTools.ratioDepAction(actor.endGearsAngle, 0, nil, actor.knobPairAngle, -1))   seq:addAction(aniTools.ratioDepAction(actor.pivotDriverAngle, 0, nil, actor.endGearsAngle, -1))     --Setup state dep actions   seq:addAction(modeDepAction(actor))  --custom action   seq:addAction(aniTools.stateChangeAction(actor.modeStateInfo, 2, {mode=1}))   seq:addAction(aniTools.stateChangeAction(actor.modeStateInfo, 4, {mode=2}))   --==All done==--   story:prep() end function onFrame()   story:apply(ldc.animation():getFrameTime()) end function register()   local ani=ldc.animation('My animation')   ani:setLength(10)   ani:setEvent('start', 'onStart')   ani:setEvent('frame', 'onFrame') end register()

Let me know if you need more comments.
Reply
« Next Oldest | Next Newest »



Messages In This Thread
RE: LDCad help combining animation movements - by Roland Melkert - 2020-01-03, 21:43

Forum Jump:


Users browsing this thread: 1 Guest(s)