WorldViz User Forum  

Go Back   WorldViz User Forum > Vizard

Reply
 
Thread Tools Rate Thread Display Modes
  #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
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


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


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