Сначала вы попробовали обычное ограничение:
normalConstraint -weight 1 -aimVector 1 0 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0;
В противном случае вы можете использовать ClosestPointOnMesh (на основе uv): https://download.autodesk.com/us/maya/2008help/Nodes/closestPointOnMesh.html
# USER DEFINE
surface = cmds.polySphere(n='pSphere1')
movingObj = cmds.spaceLocator(n='locator1')[0]
# AUTOMATION
aimLocator = cmds.spaceLocator(n='aimloc')[0]
closest = cmds.createNode('closestPointOnMesh')
surface_sh = cmds.listRelatives(surface, ni=True)[0]
cmds.connectAttr(surface_sh+'.worldMesh[0]', closest+'.inMesh')
cmds.connectAttr(surface_sh+'.worldMatrix[0]', closest+'.inputMatrix')
cmds.connectAttr(movingObj+'.t', closest+'.inPosition')
# this command is bugged in python so, lets use mel.eval
cmds.select(surface, aimLocator)
pctr = mel.eval('pointOnPolyConstraint -offset 0 0 0 -weight 1;')[0]
cmds.connectAttr('{}.parameterU'.format(closest), '{}.target[0].targetU'.format(pctr), f=True)
cmds.connectAttr('{}.parameterV'.format(closest), '{}.target[0].targetV'.format(pctr), f=True)
cmds.orientConstraint(aimLocator, movingObj, mo=False, weight=1)
Вы можете подключить нормальный выход в любом случаеЯ позволю вам следовать его руководству (на русском языке, но все шаги здесь): https://www.youtube.com/watch?v=dPliNB4uZ0w