Самый простой способ - создать узел closestPointOnMesh и подключить его к атрибуту worldMesh
вашей сетки. Единственная проблема заключается в том, что в Maya 2016 есть ошибка (не уверенная в других), когда нормальное значение, возвращаемое из узла, фактически не нормализуется, если вы используете единицы, отличные от сантиметров. Вот функция, которая делает это:
import maya.cmds as cmds
import maya.api.OpenMaya as api
def get_closest_normal(surface, x, y , z):
node = cmds.createNode('closestPointOnMesh')
cmds.connectAttr(surface + '.worldMesh ', node + ".inMesh")
cmds.setAttr( node + ".inPosition", x, y, z, type='double3')
normal = cmds.getAttr(node + ".normal")
# there's a bug in Maya 2016 where the normal
# is not properly normalized. Not sure
# if it's fixed in other years.... this
# is the workaround
result = api.MVector(*normal)
cmds.delete(node)
result.normalize()
return result
print get_closest_normal('pSphereShape1', 10, 1, 1)
Вместо того, чтобы получать номер и удалять узел, как здесь, вы можете оставить узел вокруг и подключить его нормальный атрибут к чему-либо для живых обновлений. Это довольно дорогой для обновления узел, однако, поэтому не используйте эту версию для чего-то вроде анимационной установки без тестирования производительности, чтобы быть уверенным, что это доступно