2015-09-14 3 views
1

Я вообще-то программирую материал, связанный с Unity3D, я все еще довольно новичок в API-интерфейсе Maya Python.Как получить нормальные показатели лица в майе?

То, что я пытаюсь сделать, чтобы получить выбранный в данный момент лицо нормалей среднее:

What I need to achieve

То, что я не достиг до сих пор является экземпляром куба, расположенного в соответствии с Move манипулятором.

Code result

import maya.cmds as cmds 
import re #regular expression 

# get current position of the move manipulator 
pos = cmds.manipMoveContext('Move', q=True, p=True) 

# get the current selection 
selection = cmds.ls(sl=True) 

# trying to get the face normal angles of the current selection 
polyInfo = cmds.polyInfo(selection, fn=True) 
polyInfoArray = re.findall(r"[\w.-]+", polyInfo[0]) # convert the string to array with regular expression 
polyInfoX = float(polyInfoArray[2]) 
polyInfoY = float(polyInfoArray[3]) 
polyInfoZ = float(polyInfoArray[4]) 

print str(polyInfoX) + ', ' + str(polyInfoY) + ', ' + str(polyInfoZ) 

target = cmds.polyCube() 

cmds.move(pos[0], pos[1], pos[2], target) 

Теперь то, что мне нужно только вращать куб к лицу средних нормалей выбора

Пожалуйста, любые мысли по этому поводу?

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

EDIT:

Окончательное решение (благодаря @theodox)

import maya.cmds as cmds 

# get current position of the move manipulator 
pos = cmds.manipMoveContext('Move', query=True, position=True) 

# get the current selection 
selection = cmds.ls(selection=True) 

target = cmds.polyCube() 

cmds.move(pos[0], pos[1], pos[2], target) 

constr = cmds.normalConstraint(selection, target, aimVector = (0,0,1), worldUpType= 0) 
cmds.delete(constr) 

ответ

1

Вы можете достичь что вы хотите, не решая вопроса в вопросе. Узел normalConstraint будет ориентировать объект на ближайшую доступную поверхность лица. Если вам просто нужно выравнивание лица, вы можете позиционировать свой объект, а затем создать и сразу удалить нормальный сундук. Минимальным вариантом будет:

constr = cmds.normalConstraint('reference_object', 
           'object_to_align', 
           aimVector = (0,0,1), 
           worldUpType= 0) 
cmds.delete(constr) 

где вектор цели - это локальная ось, которая будет выровнена с поверхностью. (Существует много вариантов того, как выполнить выравнивание, вы должны проверить документы в команде normalConstraint для более).

Чтобы получить нормальное лицо, вы можете использовать команду polyNormalPerVertex, чтобы получить нормали вершинного лица для лица (они вернутся в виде чисел, поэтому вам не нужно его регулярное выражение. им:.

def face_normal(face): 
    vtxface = cmds.polyListComponentConversion(face, tvf = True) 
    xes = cmds.polyNormalPerVertex(vtxface, q=True, x =True) 
    yes = cmds.polyNormalPerVertex(vtxface, q=True, y =True) 
    zes = cmds.polyNormalPerVertex(vtxface, q=True, z =True) 
    divisor = 1.0/len(xes) 
    return sum(xes)* divisor, sum(yes) * divisor, sum(zes) * divisor 

Однако те, в локальном пространстве единственный способ, чтобы преобразовать их в мировое пространство, чтобы превратить их в вектор (с помощью Pymel или майя API), а затем умножить их на матрицу объекта (также используя API). После того, как у вас есть вектор космического пространства, вы можете построить новую матрицу, используя этот вектор в качестве «целевого вектора», мира вверх и поперечного вектора этих как новую матрицу f или объект, который вы хотите выровнять.

... все из которых не являются super сложно, но это очень много работы, если вы еще не знаете API хорошо. Вот почему я сначала попробую трюк normalConstraint.

+0

Большое спасибо @theodox !! Нормальное ограничение решило мою проблему как шарм, спасибо за альтернативу! –

 Смежные вопросы

  • Нет связанных вопросов^_^