2017-08-09 96 views
0

我最近已经意识到python OpenMaya api v2.0,所以我一直在检查我的代码并尝试更新它以使用2.0版本。在大多数情况下,它比旧版本的OpenMaya更有意义...OpenMaya api 2.0中的MFnNurbsSurface.closestPoint问题

我试图使用OpenMaya.MFnNurbsSurface.closestPoint方法时遇到了一个障碍。我似乎无法弄清楚如何实际使用kwargs的方法。玛雅的文档这样说:

closestPoint(testPoint, uStart=None, vStart=None, 
    ignoreTrimBoundaries=False, tolerance=kPointTolerance, 
    space=kObject) -> (MPoint, float, float) 

所以对我来说,这看起来像kwargs,我应该能够使用...但我得到的错误,只是我尝试使用它们每一次 - 当它不错误,我不明白为什么它没有(下面的例子)。如果我不投入克瓦格斯,它'有效',但并没有给我正确的结果,因为我确实需要改变一些克瓦格斯。

下面是这样做的新老办法的一些代码(新正是我迄今为止...):

import maya.OpenMaya as oldOM 
import maya.api.OpenMaya as om 

def getClosestPointOnSurfaceOLD(surf, position): 
    selList = oldOM.MSelectionList() 
    selList.add(surf) 
    mDagPath = oldOM.MDagPath() 
    selList.getDagPath(0, mDagPath) 
    surfFn = oldOM.MFnNurbsSurface(mDagPath) 

    u_util = oldOM.MScriptUtil() 
    u_util.createFromDouble(0) 
    u_param = u_util.asDoublePtr() 

    v_util = oldOM.MScriptUtil() 
    v_util.createFromDouble(0) 
    v_param = v_util.asDoublePtr() 

    p = surfFn.closestPoint(oldOM.MPoint(*position), u_param, v_param, False, 1.0, oldOM.MSpace.kWorld) 

    return [(p[0], p[1], p[2]), (oldOM.MScriptUtil.getDouble(u_param), oldOM.MScriptUtil.getDouble(v_param))] 

def getClosestPointOnSurfaceNEW(surf, position): 
    selList = om.MSelectionList() 
    selList.add(surf) 
    surfFn = om.MFnNurbsSurface(selList.getDagPath(0)) 

    p, u, v = surfFn.closestPoint(om.MPoint(*position), ignoreTrimBoundaries=False, tolerance=1.0, space=om.MSpace.kWorld) 

    return [(p[0], p[1], p[2]), (u, v)] 

我已经通过创建一个nurbsPlane测试它(使用默认值),然后移动它了0.5个单位的y和两个函数的输出与这些线比较:我试着在我的功能“closestPoint”线做

getClosestPointOnSurfaceOLD('nurbsPlane1', (0.0, 1.0, 0.0)) 
getClosestPointOnSurfaceNEW('nurbsPlane1', (0.0, 1.0, 0.0)) 

# Result: [(-2.7755575615628914e-17, 0.5, 2.7755575615628914e-17), (0.5, 0.5)] # <-- old function result 
# Error: TypeError: file <maya console> line 28: integer argument expected, got float # <-- new function result 

其他的事情:

surfFn.closestPoint(om.MPoint(*position), ignoreTrimBoundaries=False) 
# Result: [(-2.7755575615628914e-17, -1.5407439555097887e-33, 2.7755575615628914e-17), (0.5, 0.5)] # 

surfFn.closestPoint(om.MPoint(*position), False) 
# Result: [(-1.1102230246251565e-16, -6.162975822039155e-33, 1.1102230246251565e-16), (0.5, 0.5)] # 

surfFn.closestPoint(om.MPoint(*position), tolerance=1.0) 
# Error: TypeError: file <maya console> line 28: integer argument expected, got float # 

surfFn.closestPoint(om.MPoint(*position), tolerance=1) 
# Error: RuntimeError: file <maya console> line 28: More keyword list entries (6) than format specifiers (5) # 

surfFn.closestPoint(om.MPoint(*position), 1.0) 
# Result: [(-1.1102230246251565e-16, -6.162975822039155e-33, 1.1102230246251565e-16), (0.5, 0.5)] # 

surfFn.closestPoint(om.MPoint(*position), space=om.MSpace.kWorld) 
# Error: RuntimeError: file <maya console> line 28: More keyword list entries (6) than format specifiers (5) # 

surfFn.closestPoint(om.MPoint(*position), om.MSpace.kWorld) 
# Result: [(-1.1102230246251565e-16, -6.162975822039155e-33, 1.1102230246251565e-16), (0.5, 0.5)] # 

surfFn.closestPoint(om.MPoint(*position)) 
# Result: [(-2.7755575615628914e-17, -1.5407439555097887e-33, 2.7755575615628914e-17), (0.5, 0.5)] # 

surfFn.closestPoint(om.MPoint(*position), False, 1.0, om.MSpace.kWorld) 
# Result: [(-2.7755575615628914e-17, 3.851859888774472e-33, -6.938893903907228e-17), (0.5, 0.5000000000000001)] # 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), uStart=0.0, vStart=0.0, ignoreTrimBoundaries=False, tolerance=1.0, space=om.MSpace.kWorld) 
# Error: TypeError: file <maya console> line 28: integer argument expected, got float # 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0.0, 0.0, False, 1.0, om.MSpace.kWorld) 
# Error: TypeError: file <maya console> line 28: integer argument expected, got float # 

输出中的一些差异对我来说很奇怪,而且这些错误似乎没有道理(就像调整'容差'参数值时的差异)......另外,事实证明,uv 0.5正确的值恰好是巧合的 - 如果我移动和/或旋转平面,旧函数返回不同的uv值,而新函数总是返回0.5,因为它是从平面的对象空间而不是使用世界空间来评估测试点。

我还查看了相应的旧OpenMaya命令的文档,其中有两个条目 - 其中一个条目有一个“paramAsStart”布尔参数,如果您要提供一些启动uv值。思考2​​.0文档可能错过了,我试图将它添加到我的api 2.0尝试中...也没有工作(给我一个错误,我通过了太多的参数)。

对于最低限度,我需要弄清楚如何使它从世界空间评估测试点;然而,当我继续使用OpenMaya api 2.0时,我相信我会再次运行这种类型的东西(kwargs似乎不工作......) - 任何关于如何实际使用这些kwargs的帮助都会被赞赏!

编辑:

更多的测试 - theodox的回答后,我猜的文档可能已经有了ARG顺序不正确因此,我决定测试排列。假设uStartvStart将总是彼此相邻,给出“kwargs”的24个排列,但我决定也尝试无,0.0和0为他们的值(72测试!)。 全部出错。

这里是我的测试线:

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), None, None, False, 1.0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), None, None, False, om.MSpace.kWorld, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), None, None, 1.0, False, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), None, None, 1.0, om.MSpace.kWorld, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), None, None, om.MSpace.kWorld, False, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), None, None, om.MSpace.kWorld, 1.0, False) 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, None, None, 1.0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, None, None, om.MSpace.kWorld, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 1.0, None, None, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 1.0, om.MSpace.kWorld, None, None) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, om.MSpace.kWorld, None, None, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, om.MSpace.kWorld, 1.0, None, None) 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, None, None, False, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, None, None, om.MSpace.kWorld, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, False, None, None, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, False, om.MSpace.kWorld, None, None) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, om.MSpace.kWorld, None, None, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, om.MSpace.kWorld, False, None, None) 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, None, None, False, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, None, None, 1.0, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, False, None, None, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, False, 1.0, None, None) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 1.0, None, None, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 1.0, False, None, None) 



surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0.0, 0.0, False, 1.0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0.0, 0.0, False, om.MSpace.kWorld, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0.0, 0.0, 1.0, False, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0.0, 0.0, 1.0, om.MSpace.kWorld, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0.0, 0.0, om.MSpace.kWorld, False, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0.0, 0.0, om.MSpace.kWorld, 1.0, False) 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 0.0, 0.0, 1.0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 0.0, 0.0, om.MSpace.kWorld, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 1.0, 0.0, 0.0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 1.0, om.MSpace.kWorld, 0.0, 0.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, om.MSpace.kWorld, 0.0, 0.0, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, om.MSpace.kWorld, 1.0, 0.0, 0.0) 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, 0.0, 0.0, False, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, 0.0, 0.0, om.MSpace.kWorld, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, False, 0.0, 0.0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, False, om.MSpace.kWorld, 0.0, 0.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, om.MSpace.kWorld, 0.0, 0.0, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, om.MSpace.kWorld, False, 0.0, 0.0) 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 0.0, 0.0, False, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 0.0, 0.0, 1.0, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, False, 0.0, 0.0, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, False, 1.0, 0.0, 0.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 1.0, 0.0, 0.0, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 1.0, False, 0.0, 0.0) 



surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0, 0, False, 1.0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0, 0, False, om.MSpace.kWorld, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0, 0, 1.0, False, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0, 0, 1.0, om.MSpace.kWorld, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0, 0, om.MSpace.kWorld, False, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 0, 0, om.MSpace.kWorld, 1.0, False) 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 0, 0, 1.0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 0, 0, om.MSpace.kWorld, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 1.0, 0, 0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, 1.0, om.MSpace.kWorld, 0, 0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, om.MSpace.kWorld, 0, 0, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), False, om.MSpace.kWorld, 1.0, 0, 0) 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, 0, 0, False, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, 0, 0, om.MSpace.kWorld, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, False, 0, 0, om.MSpace.kWorld) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, False, om.MSpace.kWorld, 0, 0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, om.MSpace.kWorld, 0, 0, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), 1.0, om.MSpace.kWorld, False, 0, 0) 

surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 0, 0, False, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 0, 0, 1.0, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, False, 0, 0, 1.0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, False, 1.0, 0, 0) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 1.0, 0, 0, False) 
surfFn.closestPoint(om.MPoint(0.0, 1.0, 0.0), om.MSpace.kWorld, 1.0, False, 0, 0) 

而且这些都是会拿出常见的错误:

# Error: RuntimeError: file <maya console> line 1: More keyword list entries (6) than format specifiers (5) # 
# Error: TypeError: file <maya console> line 1: integer argument expected, got float # 
# Error: TypeError: file <maya console> line 1: an integer is required # 
# Error: TypeError: file <maya console> line 1: a float is required # 

如果有人有兴趣,我可以张贴行/错误...

所以,我想这是一个玛雅人的错误 - bleh ...

回答

0

我发布了这个在Autodesk Maya论坛以及...原来有一个关于这个已知的错误。

这里给maya forum thread一个链接,如果有人想了解

0

我认为这是一个怪癖文档生成方式。 C++版本以一种像kwargs这样的Python程序员的方式写入默认参数..但它不是真正的kwargs,它是默认参数。你必须把它们当作刚刚命名的位置参数,并按顺序提供它们。

这为我工作:

def getClosestPointOnSurfaceNEW(surf, position): 
    selList = om.MSelectionList() 
    selList.add(surf) 
    surfFn = om.MFnNurbsSurface(selList.getDagPath(0)) 

    p, u, v = surfFn.closestPoint(om.MPoint(*position)) 

    return [(p[0], p[1], p[2]), (u, v)] 

,所以没有

p, u, v = surfFn.closestPoint(om.MPoint(*position), 0, 0) 

通常情况下,如果你想,以提供更多的参数你通常只是做他们:

p, u, v = surfFn.closestPoint(om.MPoint(*position), 0,0, False, 0.01, om.MSpace.kWorld) 

但是我无法验证这个作品,因为它使我的(测试版)Maya崩溃;不知道这是什么状态,在2017年或2018年制作。

+0

是的,我试过了太,得到了一个TypeError(整数参数预期,有浮动),我使用'None'为也尝试了'uStart/vStart' - 以及'0'和'0.0'。你可以看到我的最后一个测试/结果的例子基本上是你所建议的,但它也惹人了...感谢关于C++文档的额外信息,虽然 - 很高兴知道我不会疯狂考虑kwargs aren'不工作... –