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)