diff --git a/direct/src/directutil/Mopath.py b/direct/src/directutil/Mopath.py index 24a8a48fbe..c962993ba3 100644 --- a/direct/src/directutil/Mopath.py +++ b/direct/src/directutil/Mopath.py @@ -18,6 +18,8 @@ class Mopath(DirectObject): self.hprPoint = Point3(0) self.tangentVec = Vec3(0) self.fFaceForward = 0 + self.faceForwardDelta = None + self.faceForwardNode = None self.timeScale = 1 self.upVectorNodePath = upVectorNodePath self.reverseUpVector = reverseUpVector @@ -118,16 +120,27 @@ class Mopath(DirectObject): self.hprNurbsCurve.getPoint(self.playbackTime, self.hprPoint) node.setHpr(self.hprPoint) elif (self.fFaceForward and (self.xyzNurbsCurve != None)): - self.xyzNurbsCurve.getTangent(self.playbackTime, self.tangentVec) - #use the self.upVectorNodePath position if it exists to create an up vector for lookAt + if self.faceForwardDelta: + # Look at a point a bit ahead in parametric time. + t = min(self.playbackTime + self.faceForwardDelta, self.xyzNurbsCurve.getMaxT()) + lookPoint = Point3() + self.xyzNurbsCurve.getPoint(t, lookPoint) + if self.faceForwardNode: + self.faceForwardNode.setPos(lookPoint) + else: + self.xyzNurbsCurve.getTangent(self.playbackTime, self.tangentVec) + lookPoint = self.posPoint + self.tangentVec + + # use the self.upVectorNodePath position if it exists to + # create an up vector for lookAt if (self.upVectorNodePath is None): - node.lookAt(Point3(self.posPoint + self.tangentVec)) + node.lookAt(lookPoint) else: if (self.reverseUpVector == False): - node.lookAt(Point3(self.posPoint + self.tangentVec), + node.lookAt(lookPoint, self.upVectorNodePath.getPos() - self.posPoint) else: - node.lookAt(Point3(self.posPoint + self.tangentVec), + node.lookAt(lookPoint, self.posPoint - self.upVectorNodePath.getPos()) def play(self, node, time = 0.0, loop = 0):