python - MFnMesh allIntersections 返回错误结果

标签 python maya maya-api

我正在尝试使用 Maya 的 api 通过发射光线并查看它击中了多少个面来测试某个点是否在某个网格内。我正在使用 MFnMesh.allIntersections 来完成此操作。我提出的问题是,有时该方法会返回我不期望的结果,而且没有意义!例如,我正在测试球体底部的一个点及其法线,如下所示:

Example

如图所示,它应该达到 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.isEquivalent并修剪掉任何几乎相同的位置。现在我得到了预期的输出。

关于python - MFnMesh allIntersections 返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60182256/

相关文章:

用于网络的 Python 线程 - 线程不并行运行

python - 实现余弦相似度损失给出了与 Tensorflow 不同的答案

QT设计器: Connect QSlider and QDoubleSpinBox (both ways)

c++ - 将自定义数据传递给 MPxLocator (Maya API) 的属性

python - 用python绘制电容器板之间的电子偏转

python - pandas:如何将 groupby 行的子集聚合成一行?

c++ - 等效于 MEL setKeyframe 的 Maya C++ API

玛雅中的 python : get theline with warning

maya - 构建后重命名 bazel 输出(扩展)

python - 在 Python 或 C++ 中打开 Maya callBacks 查询内存中的所有回调