Maya中如何获取面法线的平均值?

2024-05-19 00:40:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我通常编写与Unity3D相关的程序,我对Maya的python API还是相当陌生的。在

我要做的是获得当前选定的面法线平均值:

What I need to achieve

到目前为止,我实现的是一个立方体的实例,它根据移动操纵器定位。在

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旋转面法线,但我想我遗漏了一些东西。。。在

编辑:

最终解决方案(感谢@theodox)

^{pr2}$

Tags: theposimportretruegetcurrentfloat
1条回答
网友
1楼 · 发布于 2024-05-19 00:40:03

你可以在不解决问题的情况下实现你想要的。normalConstraint节点将使对象朝向最近的可用面法线。如果只需要面对齐,可以定位对象,然后创建并立即删除法线约束。最低版本为:

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

其中目标向量是将与曲面对齐的局部轴。(对于如何对齐有很多选项,您应该检查normalConstraint命令中的文档了解更多信息)。在

要实际获得面法线,可以使用polyNormalPerVertex命令来获取面的顶点面法线(它们将以数字形式返回,因此不需要对其进行正则表达式。您需要平均:

^{pr2}$

然而这些都是在局部空间中。将它们转化为世界空间的唯一方法是将它们转化为向量(使用Pymel或Maya api),然后将它们与对象矩阵相乘(同样使用api)。一旦你有了一个世界空间向量,你就可以构造一个新的矩阵,使用这个向量作为“目标向量”,世界向上,这些向量的交叉向量作为你想要对齐的对象的新矩阵。。在

。。。所有这些并不难,但如果你还不太了解API,那就需要做大量的工作。这就是为什么我要先尝试normalConstraint技巧。在

相关问题 更多 >

    热门问题