我通常编写与Unity3D相关的程序,我对Maya的python API还是相当陌生的。在
我要做的是获得当前选定的面法线平均值:
到目前为止,我实现的是一个立方体的实例,它根据移动操纵器定位。在
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旋转面法线,但我想我遗漏了一些东西。。。在
编辑:
最终解决方案(感谢@theodox)
^{pr2}$
你可以在不解决问题的情况下实现你想要的。
normalConstraint
节点将使对象朝向最近的可用面法线。如果只需要面对齐,可以定位对象,然后创建并立即删除法线约束。最低版本为:其中目标向量是将与曲面对齐的局部轴。(对于如何对齐有很多选项,您应该检查normalConstraint命令中的文档了解更多信息)。在
要实际获得面法线,可以使用
^{pr2}$polyNormalPerVertex
命令来获取面的顶点面法线(它们将以数字形式返回,因此不需要对其进行正则表达式。您需要平均:然而这些都是在局部空间中。将它们转化为世界空间的唯一方法是将它们转化为向量(使用Pymel或Maya api),然后将它们与对象矩阵相乘(同样使用api)。一旦你有了一个世界空间向量,你就可以构造一个新的矩阵,使用这个向量作为“目标向量”,世界向上,这些向量的交叉向量作为你想要对齐的对象的新矩阵。。在
。。。所有这些并不难,但如果你还不太了解API,那就需要做大量的工作。这就是为什么我要先尝试normalConstraint技巧。在
相关问题 更多 >
编程相关推荐