WorldViz User Forum

WorldViz User Forum (https://forum.worldviz.com/index.php)
-   Vizard (https://forum.worldviz.com/forumdisplay.php?f=17)
-   -   positions on animation path (https://forum.worldviz.com/showthread.php?t=2320)

whj 10-13-2009 12:27 PM

positions on animation path
 
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!


Code:

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:
Code:

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!



Quote:

Originally Posted by farshizzo (Post 8852)
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:
Code:

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)




All times are GMT -7. The time now is 01:39 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC