Вычислить нормали вершины в Maya с помощью Python - PullRequest
0 голосов
/ 17 мая 2018

У меня есть сценарий, когда я делаю свет, он указывает на мой объект. Я сделал это с нормальным ограничением. Но есть ли другой способ сделать это без ограничений?

Я думаю, мне нужно вычислить нормаль ближайшей вершины моего Света? Но я не знаю, как это сделать, если кто-то может мне помочь, было бы здорово!

См. Снимок экрана

Вот как я сделал NormalConstrain:

    myNormalConstrain = cmds.normalConstraint('mySphere','myLight', aimVector = (0,0,1), worldUpType = 'scene',name='NormalConstrainToObject')

1 Ответ

0 голосов
/ 17 мая 2018

Самый простой способ - создать узел 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)

Вместо того, чтобы получать номер и удалять узел, как здесь, вы можете оставить узел вокруг и подключить его нормальный атрибут к чему-либо для живых обновлений. Это довольно дорогой для обновления узел, однако, поэтому не используйте эту версию для чего-то вроде анимационной установки без тестирования производительности, чтобы быть уверенным, что это доступно

...