Как вы используете флаг maxDistance в OpenMaya.MMeshIntersector.getClosestPoint

#python #api #maya

#python #API #maya

Вопрос:

Я пытаюсь найти ближайшую точку в сетке, используя класс OpenMaya MMeshIntersector, но я хочу ограничить расстояние, которое он ищет. Я использую это, чтобы получить барицентрические координаты для получения более точного значения.

Всякий раз, когда я ввожу значение для ограничения расстояния, я получаю ошибку времени выполнения: (kFailure): неожиданный внутренний сбой. Однако, если я ввожу значение выше 47.0, это работает, но это слишком высокое значение для моего использования, я надеюсь использовать значения ниже 1. Я не уверен, как использовать флаг maxDistance, и не так много документации о том, как его использовать. У кого-нибудь есть какие-либо ссылки или информация о том, как его использовать?

Я искал в Google и просматривал документы maya, но мне не повезло получить какую-либо конкретную информацию

 import maya.OpenMaya as OpenMaya

def getBarycentricCoords(sourceMesh, targetMesh, distanceThreshold):
    selectionList = OpenMaya.MSelectionList()
    selectionList.add(sourceMesh)
    sourceMeshDag = OpenMaya.MDagPath()
    selectionList.getDagPath(0, sourceMeshDag)

    selectionList = OpenMaya.MSelectionList()
    selectionList.add(targetMesh)
    targetMeshDag = OpenMaya.MDagPath()
    selectionList.getDagPath(0, targetMeshDag)


    mObj = OpenMaya.MObject()
    currentFace = OpenMaya.MItMeshPolygon( sourceMeshDag, mObj )

    targetMeshMPointArray = OpenMaya.MPointArray()
    targetMeshMFnMesh = OpenMaya.MFnMesh(targetMeshDag)
    targetMeshMFnMesh.getPoints(targetMeshMPointArray, OpenMaya.MSpace.kWorld)

    matrix = sourceMeshDag.inclusiveMatrix() 
    node = sourceMeshDag.node()
    intersector = OpenMaya.MMeshIntersector()
    intersector.create( node, matrix )

    pointInfo = OpenMaya.MPointOnMesh()
    uUtil = OpenMaya.MScriptUtil(0.0)
    uPtr = uUtil.asFloatPtr()
    vUtil = OpenMaya.MScriptUtil(0.0)
    vPtr = vUtil.asFloatPtr()
    pointArray = OpenMaya.MPointArray()
    vertIdList = OpenMaya.MIntArray()

    for idx in range(targetMeshMPointArray.length()):

        intersector.getClosestPoint( targetMeshMPointArray[idx], pointInfo, distanceThreshold )
        pointInfo.getBarycentricCoords(uPtr,vPtr)
  

Я ожидаю, что любое значение с плавающей точкой в качестве maxDistance должно работать, но я получаю RuntimeError: (kFailure): Unexpected Internal Failure от maya, что на самом деле не помогает мне отлаживать саму ошибку.

Комментарии:

1.Я могу подтвердить ту же ошибку с определенными значениями maxDistance. Достаточно интересно, что во всех примерах, похоже, НЕ используется параметр maxDistance. Кажется, он отлично работает без maxDistance, поэтому вы могли бы опустить его, а затем проверить расстояния самостоятельно (производительность, вероятно, пострадает), или вы можете обернуть try except RuntimeError вокруг него, но это очень грязное решение. Я постараюсь подробнее разобраться в этом.

2.Даже этот пример завершает его с try except ..! Это дешевое решение, но, возможно, оно достаточно хорошее. programtalk.com/python-examples/maya .Открой Майю.MPointOnMesh

3. Ого, так что в основном флаг maxDistance может завершиться ошибкой, если он не достигнет чего-либо при первом запуске. Метод try except сработал, на данный момент я не против сделать это таким образом, спасибо за это! Забавно, что без флага это работает, вероятно, придется указать это в autodesk и надеяться, что они это исправят