#1
|
|||
|
|||
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) 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. |
|
|