MFnMe sh allIntersections возвращает неверные результаты - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь использовать API Майи, чтобы проверить, находится ли точка внутри определенного меня sh, стреляя в луч и видя, сколько лиц оно ударяется. Я делаю это с 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!!!

1 Ответ

1 голос
/ 13 февраля 2020

Так получается, когда MFnMesh.allIntersections пересекается точно с ребром или вершиной, вместо того, чтобы возвращать одну точку попадания, он возвращает несколько, поэтому можно получить много попаданий в одной и той же позиции. Я играл со значением допуска метода, и это не имело никакого эффекта. Поэтому вместо попадания я могу использовать MFloatVector.isEquivalent и обрезать любые позиции, которые почти идентичны. Теперь я получаю ожидаемый результат.

...