Moving objects in VR

This example shows how to move objects interactively using a ParentContraint. The script allows you to move all objects whose names begin with “movable”. The “Pointer” interaction is used to query the movement of the hands.

vr/objectMove.py
 1# © 2024 Autodesk, Inc. All rights reserved.
 2
 3from PySide6 import QtCore, QtGui
 4
 5class ObjectMover():
 6    def __init__(self):
 7        self.moverEnabled = False
 8        self.createMenu()
 9        self.node = None
10    def startMove(self,action,device):
11        self.node = self.getMovable(device.pick().getNode())
12        if not self.node.isNull():
13            vrSessionService.addNodeSync(self.node)
14            self.constraint = vrConstraintService.createParentConstraint([device.getNode()],self.node,True)
15    def stopMove(self,action,device):
16        if not self.node == None and not self.node.isNull():
17            vrSessionService.removeNodeSync(self.node)
18            vrConstraintService.deleteConstraint(self.constraint)
19    def createMenu(self):
20        icon = QtGui.QIcon()
21        icon.addFile("objectMoveOn.png",QtCore.QSize(),QtGui.QIcon.Mode.Normal,QtGui.QIcon.State.On)
22        icon.addFile("objectMoveOff.png",QtCore.QSize(),QtGui.QIcon.Mode.Normal,QtGui.QIcon.State.Off)
23        self.tool = vrImmersiveUiService.createTool("CustomObjectMover")
24        self.tool.setText("Move")
25        self.tool.setCheckable(True)
26        self.tool.setIcon(icon)
27        self.tool.signal().checked.connect(self.enableMover)
28        self.tool.signal().unchecked.connect(self.disableMover)
29    def deleteMenu(self):
30        vrImmersiveUiService.deleteTool(self.tool)
31    def enableMover(self):
32        if not self.moverEnabled:
33            pointer = vrDeviceService.getInteraction("Pointer")
34            start = pointer.getControllerAction("start")
35            start.signal().triggered.connect(self.startMove)
36            execute = pointer.getControllerAction("execute")
37            execute.signal().triggered.connect(self.stopMove)
38            self.moverEnabled = True
39    def disableMover(self):
40        if self.moverEnabled:
41            pointer = vrDeviceService.getInteraction("Pointer")
42            start = pointer.getControllerAction("start")
43            start.signal().triggered.disconnect(self.startMove)
44            execute = pointer.getControllerAction("execute")
45            execute.signal().triggered.disconnect(self.stopMove)
46            self.moverEnabled = False
47    def getMovable(self,node):
48        while not node.isNull():
49            print((node.getName()))
50            if node.getName().startswith("movable"):
51                return node
52            node = node.getParent()
53        return node
54
55mover = ObjectMover()