Virtual VR controllers¶
This example shows how to create virtual hands using python. This can be helpful if your hands are tracked by an external library. Keystrokes can be simulated and the position can be adjusted. The standard hand model can be replaced. With an own hand model also tracked finger positions can be adjusted.
vr/virtualHands.py¶
1# © 2024 Autodesk, Inc. All rights reserved.
2
3from PySide6 import QtGui
4
5menuButton = vrKey(Key_M)
6touchpadButton = vrKey(Key_T)
7pressButton = vrKey(Key_P)
8
9class VirtualHands(vrAEBase):
10 def __init__(self):
11 vrAEBase.__init__(self)
12 self.createHandles()
13 # create right hand
14 self.rightHand = vrDeviceService.createVRDevice("right-controller")
15 # create left hand
16 self.leftHand = vrDeviceService.createVRDevice("left-controller")
17 # simulate keys
18 self.touched = False
19 self.pressed = False
20 menuButton.connect(self.toggleMenu,SWITCH_TOGGLE)
21 touchpadButton.connect(self.toggleTouched,SWITCH_TOGGLE)
22 pressButton.connect(self.togglePressed,SWITCH_ON)
23 self.addLoop()
24 def loop(self):
25 # Use the sphere transformations as tracking values
26 leftPos = self.leftTrans.getWorldTransform()
27 leftPos.translate(40,-90,-200)
28 rightPos = self.rightTrans.getWorldTransform()
29 rightPos.translate(-40,-90,-200)
30 self.rightHand.setTrackingMatrix(rightPos)
31 self.leftHand.setTrackingMatrix(leftPos)
32 def toggleMenu(self,value):
33 self.leftHand.setButtonPressed(True,"menu")
34 self.leftHand.setButtonPressed(False,"menu")
35 def toggleTouched(self,value):
36 self.touched = not self.touched
37 self.rightHand.setButtonTouched(self.touched,"trigger")
38 def togglePressed(self,value):
39 self.rightHand.setButtonPressed(True,"trigger")
40 self.rightHand.setButtonPressed(False,"trigger")
41 def createHandles(self):
42 # create two spheres that can be used to
43 # transform the hands
44 node = findNode("RightHandle")
45 if node.isValid():
46 deleteNode(node)
47 self.rightTrans = createSphere(3, 30, .7, .7, 1)
48 self.rightTrans.setName("RightHandle")
49 setTransformNodeTranslation(self.rightTrans,-280,90,200,True)
50 setTransformNodeRotation(self.rightTrans,0,180,0)
51 self.rightTrans = vrNodeService.getNodeFromId(self.rightTrans.getID())
52 node = findNode("LeftHandle")
53 if node.isValid():
54 deleteNode(node)
55 self.leftTrans = createSphere(3, 30, .7, .7, 1)
56 self.leftTrans.setName("LeftHandle")
57 setTransformNodeTranslation(self.leftTrans,280,90,200,True)
58 setTransformNodeRotation(self.leftTrans,0,180,0)
59 self.leftTrans = vrNodeService.getNodeFromId(self.leftTrans.getID())
60
61hands = VirtualHands()
62
63print("Use key M to open the VR Menu")
64print("Use T to simulate trigger touched")
65print("Use P to simulate trigger pressed")