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")