LDCad help combining animation movements


RE: LDCad help combining animation movements
#2
(2020-01-02, 20:39)Walt White Wrote: But I'm having a problem combining three movements into a single movement.
Having all three movements in the same animation presents a major problem (or shortcoming) of the animation scripting engine.

This because it calculates the state of ANY frame based on the current frame time.

This is usually done by a single control angle from which all others derive their state, but with this setup you have 3 different paths. To solve it you need to 'cache' the starting situation of every point in the animation where you switch from one to the other mechanical mode.

I had the same problem in the 8860 model concerning its gear box stuff.

As a result I wrote some helper 'classes' to make it a lot easier to handle.

To use those tools you need to switch the whole animation to the 'story telling' way of doing things though.

Below is a basic setup incorporating the continuous part of your animation.

Combined with the comments in the 8860 animation you might be able to add the rest yourself.

But if needed I could write something more complete this weekend.


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)))


  return result
end

function onStart()

  story=aniTools.story()
  local actor=story:addActor(mainActor())
  local seq=story:addSequence(aniTools.sequence())

  --actions
  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))


  --This helps the story table optimize some things it would otherwise do in the first onFrame apply call.
  -- Keep it at the bottom of the onStart function.
  story:prep()
end

function onFrame()
  story:apply(ldc.animation():getFrameTime())
end

function register()

  local ani=ldc.animation('My animation')
  ani:setEvent('start', 'onStart')
  ani:setEvent('frame', 'onFrame')
end

register()
Reply
« Next Oldest | Next Newest »



Messages In This Thread
RE: LDCad help combining animation movements - by Roland Melkert - 2020-01-02, 22:31

Forum Jump:


Users browsing this thread: 1 Guest(s)