PDA

View Full Version : positions on animation path


whj
10-13-2009, 12:27 PM
Hi, I would like to create an environment in which a ball is going around the original point. My simple code just create an animation path of a circle for a ball and try to figure out the actual positions when the ball pass along the animation path. My question is why the printed positions are not on a circle like what we can see? And so why the distance between the ball and the original point are not the constant value 10? Thanks!



import viz
viz.go()

import math

viz.add('tut_ground.wrl')
ball = viz.add('ball.wrl')

viz.MainView.move([0,3,-20])

path = viz.addAnimationPath()
positions = [ [0,1,10], [10,1,0], [0,1,-10], [-10,1,0], [0,1,10] ]
for x in range(len(positions)):
cp = viz.add(viz.CONTROL_POINT)
cp.setPosition(positions[x])
path.add(cp,x+1)

path.loop(viz.CIRCULAR)
viz.CUBIC_BEZIER
path.translatemode(viz.BEZIER)
path.computetangents()
path.setAutoRotate(viz.ON)

mylink = viz.link(path,ball)
path.play()

def mytimer(num):
pc = ball.getPosition()
print 'position: ', pc

dist = math.sqrt( (pc[0]-0.0)*(pc[0]-0.0) + (pc[2]-0.0)*(pc[2]-0.0) )
print 'distance: ', dist


viz.callback(viz.TIMER_EVENT, mytimer)
viz.starttimer(0,1/60.0,viz.FOREVER)

farshizzo
10-16-2009, 12:19 PM
You won't be able to create a perfect circle using bezier paths. You are better off manually animating the object. Either way, the following modified version of your script will generate a path that is closer to a circle. It uses cubic bezier and you removes the duplicate control point at the end of the path:import viz
import vizmat
import vizact
viz.go()

viz.add('tut_ground.wrl')
ball = viz.add('ball.wrl')

viz.MainView.move([0,3,-20])

path = viz.addAnimationPath()
positions = [ [0,1,10], [10,1,0], [0,1,-10], [-10,1,0] ]
for x,pos in enumerate(positions):
cp = viz.addControlPoint()
cp.setPosition(pos)
path.add(cp,x+1)

path.loop(viz.CIRCULAR)
path.translatemode(viz.CUBIC_BEZIER)
path.computetangents()
path.setAutoRotate(viz.ON)

mylink = viz.link(path,ball)
path.play()

def PrintInfo():
pc = ball.getPosition()
print 'position: ', pc

dist = vizmat.Distance(pc,[0,1,0])
print 'distance: ', dist

vizact.ontimer(0,PrintInfo)

whj
10-19-2009, 03:13 PM
I'll try that. Thank you.

whj
10-27-2009, 01:21 PM
Hi,

If I happen to create another non-circle path using bezier paths, would the distance we can see/feel in VR is close to the actual distance that calculated by vizmat.Distance().

Thanks!



You won't be able to create a perfect circle using bezier paths. You are better off manually animating the object. Either way, the following modified version of your script will generate a path that is closer to a circle. It uses cubic bezier and you removes the duplicate control point at the end of the path:import viz
import vizmat
import vizact
viz.go()

viz.add('tut_ground.wrl')
ball = viz.add('ball.wrl')

viz.MainView.move([0,3,-20])

path = viz.addAnimationPath()
positions = [ [0,1,10], [10,1,0], [0,1,-10], [-10,1,0] ]
for x,pos in enumerate(positions):
cp = viz.addControlPoint()
cp.setPosition(pos)
path.add(cp,x+1)

path.loop(viz.CIRCULAR)
path.translatemode(viz.CUBIC_BEZIER)
path.computetangents()
path.setAutoRotate(viz.ON)

mylink = viz.link(path,ball)
path.play()

def PrintInfo():
pc = ball.getPosition()
print 'position: ', pc

dist = vizmat.Distance(pc,[0,1,0])
print 'distance: ', dist

vizact.ontimer(0,PrintInfo)