View Single Post
  #1  
Old 02-24-2010, 10:13 AM
envisC envisC is offline
Member
 
Join Date: Apr 2009
Posts: 9
Four bar linkage

I'm trying to create a four bar linkage using the physics engine joints. I have created some code for how I think this can be done.

Code:
import viz

viz.go()

viz.phys.enable()
viz.phys.setGravity(0,0,0)

viz.MainView.setPosition(1,2,-3)

#Arm 1
base1pos = (1,1,5)
end1pos = (1,3,5)

base1 = viz.add('ball.wrl',pos=(base1pos))
base1.setAxisAngle(0,1,0,180)
base1.collideSphere()

base1ctrl = viz.add('ball.wrl',pos=(base1pos))
base1ctrllink = viz.link(base1ctrl,base1)

end1 = viz.add('white_ball.wrl',pos=(end1pos))
end1.collideSphere()
end1.visible(0)

arm1 = viz.add('box.wrl',scale=(.2,2,.2))
arm1link = viz.link(end1,arm1)
arm1link.preTrans([0,-1,0])

#Arm 2

base2pos = (1,3,5)
end2pos = (3,3,5)

base2 = viz.add('ball.wrl',pos=(base2pos))
base2.color(viz.RED)
base2.collideSphere()
base2.visible(0)

base2cover = viz.add('ball.wrl')
base2coverpos = viz.link(base2,base2cover)

base2ctrl = viz.add('white_ball.wrl',pos=(base2pos))
base2ctrl.collideSphere()
base2ctrllink = viz.link(base2ctrl,base2)
base2ctrlmove = viz.link(end1,base2ctrl)
base2ctrlmove.setMask(viz.LINK_POS)

end2 = viz.add('white_ball.wrl',scale=(1,1,1),pos=(end2pos))
end2.color(viz.BLUE)
end2.collideSphere()
end2.visible(0)

rearpos = viz.add('white_ball.wrl',pos=(end2pos[0]-3,end2pos[1],end2pos[2]))
rearpos.collideSphere()

rearctrl = viz.add('ball.wrl',pos=(rearpos.getPosition()))
rearctrllink = viz.link(rearpos,rearctrl)

arm2 = viz.add('box.wrl',scale=(3,.2,.2))
arm2link = viz.link(end2,arm2)
arm2link.preTrans([-1.5,0,0])

#Arm 3

base3pos = (1,2,5)
end3pos = (3,2,5)

base3 = viz.add('ball.wrl',pos=(base3pos))
base3.color(viz.RED)
base3.collideSphere()
base3.visible(0)

base3cover = viz.add('ball.wrl')
base3coverpos = viz.link(base3,base3cover)

base3ctrl = viz.add('white_ball.wrl',pos=(base3pos))
base3ctrl.collideSphere()
base3ctrllink = viz.link(base3ctrl,base3)

mid1 = viz.add('ball.wrl')
mid1link = viz.link(base1,mid1)
mid1link.preTrans([0,1,0])
base3ctrlmove = viz.link(mid1link,base3ctrl)
base3ctrlmove.setMask(viz.LINK_POS)

end3 = viz.add('white_ball.wrl',scale=(1,1,1),pos=(end3pos))
end3.color(viz.BLUE)
end3.collideSphere()
end3.visible(0)

arm3 = viz.add('box.wrl',scale=(2,.2,.2))
arm3link = viz.link(end3,arm3)
arm3link.preTrans([-1,0,0])

#Arm 4

base4pos = (3,3,5)
end4pos = (3,2,5)

base4 = viz.add('ball.wrl',pos=(base4pos))
base4.color(viz.RED)
base4.collideSphere()
base4.visible(0)

base4cover = viz.add('ball.wrl')
base4coverpos = viz.link(base4,base4cover)

base4ctrl = viz.add('white_ball.wrl',pos=(base4pos))
base4ctrl.collideSphere()
base4ctrllink = viz.link(base4ctrl,base4)
base4ctrlmove = viz.link(end2,base4ctrl)
base4ctrlmove.setMask(viz.LINK_POS)

end4 = viz.add('white_ball.wrl',scale=(1,1,1),pos=(end4pos))
end4.color(viz.BLUE)
end4.collideSphere()
end4.visible(0)

end4link = viz.link(end3,end4)

end4cover = viz.add('ball.wrl')
end4coverpos = viz.link(end4,end4cover)

arm4 = viz.add('box.wrl',scale=(.2,1,.2))
arm4link = viz.link(base4,arm4)
arm4link.preTrans([0,-.5,0])

arm4distance = viz.link(base4ctrl,end3)
arm4distance.preTrans([0,-1,0])
arm4distance.setMask(viz.LINK_POS)

#Joint control

joint1 = viz.phys.addWheelJoint(end1,base1,pos=(base1pos),axis0=(0,1,0))

joint2 = viz.phys.addWheelJoint(end2,base2,pos=(base2pos),axis0=[0,1,0])

joint3 = viz.phys.addWheelJoint(rearpos,base2ctrl,pos=(base2pos),axis0=[0,1,0])

joint3 = viz.phys.addWheelJoint(end3,base3ctrl,pos=(base3pos),axis0=[0,1,0])

joint4 = viz.phys.addWheelJoint(end4,base4ctrl,pos=(base4pos),axis0=[0,1,0])

vizact.whilekeydown(viz.KEY_LEFT,base1ctrl.setEuler,[0,0,vizact.elapsed(15)],viz.REL_PARENT)
vizact.whilekeydown(viz.KEY_RIGHT,base1ctrl.setEuler,[0,0,vizact.elapsed(-15)],viz.REL_PARENT)

vizact.whilekeydown(viz.KEY_UP,rearpos.setPosition,[0,vizact.elapsed(.15),0],viz.REL_PARENT)
vizact.whilekeydown(viz.KEY_DOWN,rearpos.setPosition,[0,vizact.elapsed(-.15),0],viz.REL_PARENT)
The arrow keys will allow some motion in the joints. However, the motion is very unstable and the joints frequently break (in fact it may be broken upon loading, requiring several load attempts before it loads a working one).

Is there a way I can set this up to better constrain or control the joints? Alternatively, would it be better to simply construct this with regular parenting constraints instead of the physics joints?

Thanks.
Reply With Quote