[maya] nurbsCurve node modifying its input curveDatas

234 views
Skip to first unread message

fruit...@gmail.com

unread,
Nov 3, 2018, 10:31:50 PM11/3/18
to Python Programming for Autodesk Maya
hi folks,

I noticed something I never saw before, so I'd like to know if I'm missing something :
in a nutshell, I got different results when I connect the outCurve datas from a node to a motionPath, and when I pass the same connection through a nurbsCurve before connecting it to a motionPath.
I'm sure an example would be much self-explanatory, so you can run this snippet to see what I mean

sks = [cmds.createNode('joint', ss=1) for _ in xrange(2)]
nurbs = cmds.nurbsPlane(ch=0, ax=[0,1,0], w=2, lr=4)[0]
crv = cmds.duplicateCurve(nurbs + '.u[0.5]', ch=1)[0]
curveIso = cmds.listConnections(crv + '.create', s=1, d=0)[0]
cmds.setKeyframe(sks[-1], v=-4, at='tz')
cmds.currentTime(10)
cmds.setKeyframe(sks[-1], v=-14, at='tz')
cmds.skinCluster(nurbs, sks, tsb=1)

# - first setup
mp = cmds.createNode('motionPath')
cmds.connectAttr(curveIso + '.outputCurve', mp + '.geometryPath')
cmds.setAttr(mp + '.uValue', .2)
loc = cmds.spaceLocator()[0]
cmds.connectAttr(mp + '.allCoordinates', loc + '.t')
cmds.setAttr(mp + '.fractionMode', True)
# - second setup
mp = cmds.createNode('motionPath')
cmds.connectAttr(crv + '.ws', mp + '.geometryPath')
cmds.setAttr(mp + '.uValue', .2)
loc = cmds.spaceLocator()[0]
cmds.connectAttr(mp + '.allCoordinates', loc + '.t')
cmds.setAttr(mp + '.fractionMode', True)


As you can see if you scroll the timeline, the 2 locators have a different behavior. However, the 2 setups are the same, except for a nurbsCurve (that I'd like to bypass)
So I suspect the nurbsCurve does another operation, but I don't know which one exactly and why. Any explanation about that ?
cheers

Neil Roche

unread,
Nov 5, 2018, 1:28:25 PM11/5/18
to Python Programming for Autodesk Maya
Hi,

Because of a weird bug in Maya when you set parametric length on a motion path you need to set the opposite; 

cmds.setAttr(mp + '.fractionMode', True)  

actually turns parametric off.

So you need to do  

cmds.setAttr(mp + '.fractionMode', not True)  or cmds.setAttr(mp + '.fractionMode',  False) 

To get your code snippet to work.

Cheers,

Neil

fruit...@gmail.com

unread,
Nov 5, 2018, 1:35:09 PM11/5/18
to Python Programming for Autodesk Maya
Hi Neil,
thanks for the answer. Indeed, as you flagged, parametric attribute is the 'GUI' name, and fractionMode is the core name, parametric==not fractionMode.
In my example, I explicitely set the fractionMode to True, on purpose, because this is the behavior I need (i.e. not parametric).
But my thoughts are more about "what happens in a nurbsCurve node, to change the output of my curveIso ?"

In other words, I would expect to have the same result in curveFromSurfaceIso.outputSurface and in nurbsCurve.worldSpace. I don't.
Any idea of what the nurbsCurve is implicitely doing to my curveFromSurfaceIso.outputSurface ?

Neil Roche

unread,
Nov 6, 2018, 9:57:50 AM11/6/18
to Python Programming for Autodesk Maya
I would guess that the curveFromSurfaceIso node will work like a parametric curve irrespective of whether parametric is set on or off as you have the min and max U values at 0 and 1 and it has no concept of where to draw any cvs inbetween.  Once you have created the curve by connecting the outputCurve to the curve.create attribute you now have a curve with 4 cvs so with parametric off it will function as expected and the locator will move as the cvs are stretched apart from each other, differently to the motion path with the curveFromSurfaceIso input. That's my guess anyway.

fruit...@gmail.com

unread,
Nov 6, 2018, 6:53:13 PM11/6/18
to Python Programming for Autodesk Maya
Interesting. that's the best guess I came up with so far too ! A bit like some datas not being computed, maybe for optimisation purpose, unless they are explicitely required, which happens when we plug the nurbsCurve.
off topic, this situation reminds me a bit of Young's interference experiment (https://en.wikipedia.org/wiki/Young%27s_interference_experiment) where the signal is both a wave and a particle until we force it to choose one ^^ here, the data is can be different things, depending on what we plug after ^^
Reply all
Reply to author
Forward
0 new messages