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"))
Другие вопросы по тегам