MFnMesh allIntersections 返回错误结果
MFnMesh allIntersections returning wrong results
我正在尝试使用 Maya 的 api 来测试一个点是否在某个网格内,方法是发射一条射线并查看它击中了多少个面。我正在使用 MFnMesh.allIntersections
进行此操作。我遇到的问题是,有时 returns 方法的结果出乎我的意料,而且没有意义!例如,我正在测试球体底部的一个点,其法线如下:
如图所示,它应该达到 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
正好与边或顶点相交时,而不是 return 一个命中点它会 return 多个,所以有可能得到很多命中在同一个位置。我尝试了该方法的公差值,但没有任何效果。因此,当命中发生时,我可以使用 MFloatVector.isEquivalent
和 trim 来排除任何几乎相同的位置。现在我得到了预期的输出。
我正在尝试使用 Maya 的 api 来测试一个点是否在某个网格内,方法是发射一条射线并查看它击中了多少个面。我正在使用 MFnMesh.allIntersections
进行此操作。我遇到的问题是,有时 returns 方法的结果出乎我的意料,而且没有意义!例如,我正在测试球体底部的一个点,其法线如下:
如图所示,它应该达到 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
正好与边或顶点相交时,而不是 return 一个命中点它会 return 多个,所以有可能得到很多命中在同一个位置。我尝试了该方法的公差值,但没有任何效果。因此,当命中发生时,我可以使用 MFloatVector.isEquivalent
和 trim 来排除任何几乎相同的位置。现在我得到了预期的输出。