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