# See pybullet quickstart guide here: # https://docs.google.com/document/d/10sXEhzFRSnvFcl3XxNGhnD4N2SedqwdAvK3dsihxVUA/edit# # Create a Tiltbrush-like app, drawing lines using any controller # Line width can be changed import pybullet as p CONTROLLER_ID = 0 POSITION=1 ORIENTATION=2 BUTTONS=6 #assume that the VR physics server is already started before c = p.connect(p.SHARED_MEMORY) print(c) if (c<0): p.connect(p.GUI) p.setInternalSimFlags(0)#don't load default robot assets etc p.resetSimulation() p.loadURDF("plane.urdf") p.loadURDF("cube.urdf",0,0,1) p.setGravity(0,0,-10) p.setRealTimeSimulation(1) prevPosition=[None]*p.VR_MAX_CONTROLLERS colors=[0.,0.5,0.5]*p.VR_MAX_CONTROLLERS widths = [3]*p.VR_MAX_CONTROLLERS a=[0,0,0] #use a few default colors colors[0] = [0,0,0] colors[1] = [0.5,0,0] colors[2] = [0,0.5,0] colors[3] = [0,0,0.5] colors[4] = [0.5,0.5,0.] colors[5] = [.5,.5,.5] p.startStateLogging(p.STATE_LOGGING_VR_CONTROLLERS, "vr_hmd.bin",deviceTypeFilter=p.VR_DEVICE_HMD) p.startStateLogging(p.STATE_LOGGING_GENERIC_ROBOT, "generic_data.bin") p.startStateLogging(p.STATE_LOGGING_CONTACT_POINTS, "contact_points.bin") while True: events = p.getVREvents(p.VR_DEVICE_HMD+p.VR_DEVICE_GENERIC_TRACKER) for e in (events): pos = e[POSITION] mat = p.getMatrixFromQuaternion(e[ORIENTATION]) dir0 = [mat[0],mat[3],mat[6]] dir1 = [mat[1],mat[4],mat[7]] dir2 = [mat[2],mat[5],mat[8]] lineLen = 0.1 dir = [-mat[2],-mat[5],-mat[8]] to = [pos[0]+lineLen*dir[0],pos[1]+lineLen*dir[1],pos[2]+lineLen*dir[2]] toX = [pos[0]+lineLen*dir0[0],pos[1]+lineLen*dir0[1],pos[2]+lineLen*dir0[2]] toY = [pos[0]+lineLen*dir1[0],pos[1]+lineLen*dir1[1],pos[2]+lineLen*dir1[2]] toZ = [pos[0]+lineLen*dir2[0],pos[1]+lineLen*dir2[1],pos[2]+lineLen*dir2[2]] p.addUserDebugLine(pos,toX,[1,0,0],1) p.addUserDebugLine(pos,toY,[0,1,0],1) p.addUserDebugLine(pos,toZ,[0,0,1],1) p.addUserDebugLine(pos,to,[0.5,0.5,0.],1,3) events = p.getVREvents() for e in (events): if (e[BUTTONS][33]&p.VR_BUTTON_WAS_TRIGGERED): prevPosition[e[CONTROLLER_ID]] = e[POSITION] if (e[BUTTONS][32]&p.VR_BUTTON_WAS_TRIGGERED): widths[e[CONTROLLER_ID]]=widths[e[0]]+1 if (widths[e[CONTROLLER_ID]]>20): widths[e[CONTROLLER_ID]] = 1 if (e[BUTTONS][1]&p.VR_BUTTON_WAS_TRIGGERED): p.resetSimulation() #p.setGravity(0,0,-10) p.removeAllUserDebugItems() p.loadURDF("plane.urdf") if (e[BUTTONS][33]==p.VR_BUTTON_IS_DOWN): pt = prevPosition[e[CONTROLLER_ID]] #print(prevPosition[e[0]]) #print(e[1]) diff = [pt[0]-e[POSITION][0],pt[1]-e[POSITION][1],pt[2]-e[POSITION][2]] lenSqr = diff[0]*diff[0]+diff[1]*diff[1]+diff[2]*diff[2] ptDistThreshold = 0.01 if (lenSqr>(ptDistThreshold*ptDistThreshold)): p.addUserDebugLine(e[POSITION],prevPosition[e[CONTROLLER_ID]],colors[e[CONTROLLER_ID]],widths[e[CONTROLLER_ID]]) #p.loadURDF("cube_small.urdf",e[1]) colors[e[CONTROLLER_ID]] = [1-colors[e[CONTROLLER_ID]][0],1-colors[e[CONTROLLER_ID]][1],1-colors[e[CONTROLLER_ID]][2]] prevPosition[e[CONTROLLER_ID]] = e[POSITION]