pymel getArea()不返回真实世界单位

时间:2013-12-06 08:41:39

标签: python maya pymel

如果我错了,请纠正我但是当你从meshFace节点使用call getArea()时,它不会返回相对于当前场景单位的区域,而是相对于它自己的比例。

例如:

如果我创建一个场景单位设置为Meters的框,则创建的框的比例为1,1,1。

我打电话给这个方框:

#Assuming you selected only faces from the scene.
import pymel.core as pm

selected = pm.ls(selection = True, flatten = True)
totalFaceArea = 0

for face in selected:
    totalFaceArea = totalFaceArea + face.getArea(space = "world")

print selected
print totalFaceArea

但是,如果我将场景单位更改为厘米,则比例不会改变(这是有意义的)。问题是该区域似乎来自于比例,而不是它在场景中占据的空间量,因此当您更改场景单位时该区域不会改变。

你们知道一种方法来补偿场景单位的变化或者获得场景单位面部区域的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

Maya在内部使用cm,并且在应用单位设置方面存在可耻的不一致。大多数系统和命令在您的工作单位中工作,但不是全部。在我的脑海中,一些保留是摄像机设置,polySelectConstraints,以及(在您的情况下)所有基于API的几何计算。

对于这样的情况,

通常具有纠正功能,可将值转换为我的预期单位。这个功能很简单:

def scene_unit_linear(val):
     _IN_CM = {'m':100, 'in':2.54, 'cm':1, 'ft':30.48}
     _scale = _IN_CM[cmds.currentUnit(q=True, l=True)]
     return _scale * val

不幸的是,困难的部分是知道何时使用它:(另外(这很重要!)如果你得到二维或三维值,你需要使用适当的力量。在你的情况下,你需要因为你得到一个面积值,所以要平方:1平方米是10000平方厘米,而不是100!

   def scene_unit_area(val):
     _IN_CM = {'m':100, 'in':2.54, 'cm':1, 'ft':30.48}
     _scale = _IN_CM[cmds.currentUnit(q=True, l=True)]
     return _scale * _scale * val


world_area = scene_unit_area(face.getArea(space = "world"))