![]()  | 
	
| 
		 
			 
			#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.  | 
		
  | 
	
		
  |