pymel getArea() не возвращает единицы измерения реального мира
Исправьте меня, если я ошибаюсь, но когда вы используете call getArea() из узла meshFace, он не возвращает площадь относительно текущих единиц сцены, а скорее относительно собственного масштаба.
Например:
Если я создаю коробку с единицами сцены, установленными на "Метры", то коробка создается с масштабом 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 ответ
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"))