Toy Excavator Constraints demo¶
Toy-Excavator-Constraints.vpb¶
1# © 2024 Autodesk, Inc. All rights reserved.
2
3# This script is part of the Toy-Excavator-Constraints.vpb and does not run without it.
4
5# Helper class for constraint management. This shows a way how to deal with
6# persistent constraints. Every time we create a new aim or orientation constraint
7# we check if this particular constraint is already present in the scene. Otherwise
8# we would have identical constraints pile up.
9
10class ConstraintsManager(object):
11 def __init__(self):
12 pass
13
14 def __compareNodes(self, list1, list2):
15 if len(list1) != len(list2):
16 return False
17 for i in range(len(list1)):
18 if list1[i].getObjectId() != list2[i].getObjectId():
19 return False
20 return True
21
22 def __hasAimConstraint(self, targetNodes, upTargetNodes, constrainedNode):
23 existingConstraints = vrConstraintService.findConstrainedNode(constrainedNode)
24 for c in existingConstraints:
25 if isinstance(c, vrdAimConstraintNode):
26 return (self.__compareNodes(c.getTargetNodes(), targetNodes) and
27 self.__compareNodes(c.getUpVectorTargetNodes(), upTargetNodes))
28 return False
29
30 def __hasOrientationConstraint(self, targetNodes, constrainedNode):
31 existingConstraints = vrConstraintService.findConstrainedNode(constrainedNode)
32 for c in existingConstraints:
33 if isinstance(c, vrdOrientationConstraintNode):
34 return self.__compareNodes(c.getTargetNodes(), targetNodes)
35 return False
36
37 def addAimConstraint(self, targetNodes, upTargetNodes, constrainedNode):
38 if not self.__hasAimConstraint(targetNodes, upTargetNodes, constrainedNode):
39 vrConstraintService.createAimConstraint(targetNodes, upTargetNodes, constrainedNode)
40 else:
41 print ("aim constraint already exists!")
42
43 def addOrientationConstraint(self, targetNodes, constrainedNode):
44 if not self.__hasOrientationConstraint(targetNodes, constrainedNode):
45 vrConstraintService.createOrientationConstraint(targetNodes, constrainedNode)
46 else:
47 print ("orientation constraint already exists!")
48
49
50# This function is not used in the demo, but can be called to delete all constraints
51# again. It only runs on a subtree so that it does not remove any aim cameras by accident.
52# call: deleteAllConstraintsInSubtree(vrNodeService.findNode("Toy Digger Assembly"))
53def deleteAllConstraintsInSubtree(root):
54 numChildren = root.getChildCount()
55 for i in range(numChildren):
56 deleteAllConstraintsInSubtree(root.getChild(i))
57
58 constraints = vrConstraintService.findConstrainedNode(root)
59 if (len(constraints)) > 0:
60 for c in constraints:
61 vrConstraintService.deleteConstraint(c)
62
63
64constraints = ConstraintsManager()
65
66armLong = vrNodeService.findNode("Arm Long")
67armLongHandle = vrNodeService.findNode("Arm Long Handle")
68armShort = vrNodeService.findNode("Arm Short")
69armShortHandle = vrNodeService.findNode("Arm Short Handle")
70constraints.addOrientationConstraint([armLongHandle], armLong)
71constraints.addOrientationConstraint([armShortHandle], armShort)
72
73cyl1LeftHullTarget = vrNodeService.findNode("Zylinder 1 Left Hull Target")
74cyl1LeftStickTrans = vrNodeService.findNode("Zylinder 1 Left Stick Trans")
75cyl1LeftHullTrans = vrNodeService.findNode("Zylinder 1 Left Hull Trans")
76cap1Body = vrNodeService.findNode("Cap 1 Body")
77constraints.addAimConstraint([cyl1LeftHullTarget], [cap1Body], cyl1LeftStickTrans)
78constraints.addOrientationConstraint([cyl1LeftStickTrans], cyl1LeftHullTrans)
79
80cyl1RightHullTarget = vrNodeService.findNode("Zylinder 1 Right Hull Target")
81cyl1RightStickTrans = vrNodeService.findNode("Zylinder 1 Right Stick Trans")
82cyl1RightHullTrans = vrNodeService.findNode("Zylinder 1 Right Hull Trans")
83cap2Body = vrNodeService.findNode("Cap 2 Body")
84constraints.addAimConstraint([cyl1RightHullTarget], [cap2Body], cyl1RightStickTrans)
85constraints.addOrientationConstraint([cyl1RightStickTrans], cyl1RightHullTrans)
86
87cyl2HullTarget = vrNodeService.findNode("Zylinder 2 Hull Target")
88cyl2StickTrans = vrNodeService.findNode("Zylinder 2 Stick Trans")
89cyl2HullTrans = vrNodeService.findNode("Zylinder 2 Hull Trans")
90constraints.addAimConstraint([cyl2HullTarget], [], cyl2StickTrans)
91constraints.addOrientationConstraint([cyl2StickTrans], cyl2HullTrans)