0

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

例如:

如果我创建一个场景单位设置为米的盒子,那么这个盒子的比例是 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

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

你们知道一种补偿场景单元变化的方法或一种在场景单元中获取面部区域的方法吗?

谢谢!

4

1 回答 1

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 平方米是 10,000 平方厘米,而不是 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"))
于 2013-12-06T17:49:32.990 回答