PDA

View Full Version : understanding vizact.moveTo


fordprefect
07-16-2013, 09:47 AM
Hello,

it seems I have problems understanding this moveTo. What I'd like to achieve is to have two actions that move a node one unit (meter) along it's Y axis up or down. That way I can use them on different nodes in the object, regardless of the original position of the node. So I created
_ceilDist = 1
_ceilMode = viz.REL_LOCAL

_actYplus = vizact.moveTo( [0,_ceilDist,0], time=4, mode=_ceilMode, interpolate=vizact.easeInOut)
_actYmin = vizact.moveTo( [0,-_ceilDist,0], time=4, mode=_ceilMode, interpolate=vizact.easeInOut)

def cmdOpenCeil(parName):
car.getChild(parName).runAction(_actYplus)

def cmdCloseCeil(parName):
car.getChild(parName).runAction(_actYmin)


My problems are:
When used as shown above, the distance the part is moved is more that one (meter) by far! :(
When used as shown above, the interpolation is starting gradually, but at the end the motion is cut off, without slowing down. Same with (examples) vizact.easeInOutCircular, .easeInOutExp, .easeInOutSine, .cubic(0.1,0.6), .easeOut, .backOut
When used with different time values (e.g. 6 seconds for plus direction) then the speed is not changed, but the distance is increased :confused:


Same effect when using addAction instead.

What point am I missing here, and is there a better (working) approach?

BR Walter

Jeff
07-16-2013, 05:34 PM
Does the following work for you?
import viz
import vizact
viz.go()

viz.add('dojo.osgb')

ball = viz.addChild('beachball.osgb',pos=[0,1,4])

moveUp = vizact.move(0,1,0,1)
moveDown = vizact.move(0,-1,0,1)

vizact.onkeydown('1',ball.addAction,moveUp)
vizact.onkeydown('2',ball.addAction,moveDown)

fordprefect
07-17-2013, 02:06 AM
Hi Jeff,

that code works ok as it is. Also, when I adopt it to my script, it does the trick and moves the node by 1 meter. So thank you for the workaround. :)

But

.move is not as convenient because it is working with speed instead of distance. So I have to calculate the speed myself instead of using the conveniently designed interface of .moveTo.
.move does not allow for gradually picking up the speed
would there be rounding issues with .move when moving back and forth a part several timesusing different timings (when fractions occur)?


Therefore I'd like to repeat: what am I missing to understand how .moveTo works? :confused:

When I use your script as a basis and try out .moveTo again
import viz
import vizact
viz.go()

viz.add('dojo.osgb')

ball = viz.addChild('beachball.osgb',pos=[0,1,4])

_ceilDist = 1
_ceilMode = viz.REL_LOCAL
_actYplus = vizact.moveTo( [0,_ceilDist,0], time=1, mode=_ceilMode, interpolate=vizact.easeInOut)
_actYmin = vizact.moveTo( [0,-_ceilDist,0], time=1, mode=_ceilMode, interpolate=vizact.easeInOut)

vizact.onkeydown('3', ball.addAction, _actYplus)
vizact.onkeydown('4', ball.addAction, _actYmin)

def debugPos():
print 'posi:', ball.getPosition()
vizact.ontimer(3.3, debugPos)

then the position of the ball after moving seems to depend on the interpolation used. it is (truncated to 2 decimals)

11.54 .easeInStrong
14.44 .easeInCircular
21.53 .easeIn
31.52 .easeInOut .easeInOutStrong .easeInOutCircular .cubic .linear
41.51 .easeOut
48.59 .easeOutCircular
51.50 .easeOutStrong


Giving time=2 does not lower the speed but extends the distance, e.g. 61.55 for .easeInOut

Using parameter speed=1 instead of time=1 in the code above yields same result, BUT using speed=.1 results in y=301.75 while speed=10 yields y=4.50

even more confused the more I try,
Walter