Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MFnMesh ALINTERSECTIONS返回错误结果_Python_Maya_Maya Api - Fatal编程技术网

Python MFnMesh ALINTERSECTIONS返回错误结果

Python MFnMesh ALINTERSECTIONS返回错误结果,python,maya,maya-api,Python,Maya,Maya Api,我正在尝试使用Maya的api来测试一个点是否位于某个网格内,方法是拍摄一条光线并查看它击中多少面。我正在使用MFnMesh.allIntersections执行此操作。我想到的问题是,有时该方法返回的结果是我不期望的,也没有意义的!例如,我正在测试球体底部的一个点,其法线如下: 就像图中一样,它应该达到2点,但出于某种原因,它说它达到了3点! 为什么会这样?我将包含复制此示例的代码: import maya.cmds as cmds import maya.OpenMaya as OpenM

我正在尝试使用Maya的api来测试一个点是否位于某个网格内,方法是拍摄一条光线并查看它击中多少面。我正在使用
MFnMesh.allIntersections
执行此操作。我想到的问题是,有时该方法返回的结果是我不期望的,也没有意义的!例如,我正在测试球体底部的一个点,其法线如下:

就像图中一样,它应该达到2点,但出于某种原因,它说它达到了3点! 为什么会这样?我将包含复制此示例的代码:

import maya.cmds as cmds
import maya.OpenMaya as OpenMaya


cmds.file(new=True, force=True)

cmds.polyCube(subdivisionsWidth=4, subdivisionsHeight=4, subdivisionsDepth=4)
cmds.setAttr("pCube1.translate", 0, 0.236, 0)

cmds.polySphere(subdivisionsAxis=25, subdivisionsHeight=25)
cmds.setAttr("pSphere1.translate", 0, 2, 0)

dag_path = OpenMaya.MDagPath()
sel = OpenMaya.MSelectionList()
sel.add("pCube1")
sel.getDagPath(0, dag_path)

mfn_mesh = OpenMaya.MFnMesh(dag_path)

hit_points = OpenMaya.MFloatPointArray()
hit_ray_params = OpenMaya.MFloatArray()
hit_faces = OpenMaya.MIntArray()

has_int = mfn_mesh.allIntersections(
    OpenMaya.MFloatPoint(0, 1, 0), # Should match pSphere1.vtx[600]'s world position
    OpenMaya.MFloatVector(1.1905393115796414e-08, -1.0, 1.8535209278525144e-07), # Should match pSphere1.vtx[600]'s normal
    None,
    None,
    False,
    OpenMaya.MSpace.kWorld,
    999999,
    False,
    mfn_mesh.autoUniformGridParams(),
    False,
    hit_points,
    hit_ray_params,
    hit_faces,
    None,
    None,
    None,
    0.0001
)

print hit_points.length() # Should return 2 but returns 3!!!

因此,当
MFnMesh.allIntersections
与边或顶点正好相交时,它将返回多个命中点,而不是返回一个命中点,因此可以在同一位置获得多个命中点。我对该方法的容差值进行了调整,但没有效果。因此,当发生命中时,我可以使用
MFloatVector.iseEquivalent
删除几乎相同的位置。现在我得到了预期的输出。

对于我来说,如果我尝试您的代码,它将打印4。它返回两个点。如果我将方向更改为(0,-1,0),它只返回两个点一次。我不知道为什么:|我的变形器正在为那个顶点向我输出那些法线值,虽然我不明白为什么他们会把它搞砸,但他们做到了!这会在未预料到的时间导致一些疯狂的弹出。如果我移除光线投射加速度,它会给出一个正确的结果。我注意到当移除加速度时,它在其他位置仍然会给出错误的结果,所以仍然存在一些问题。我注意到,只有当两个对象直接位于另一个对象之上时才会发生这种情况。有趣且奇怪的是,autodesk有自己的方法让我们发疯:|使用maya.api.OpenMaya(新)而不是maya.OpenMaya(旧)