2013-12-06 3 views
0

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

Однако, если я изменить единицы сцены в сантиметры, то масштаб не меняется (что имеет смысл). Проблема в том, что область, похоже, исходит из масштаба, а не объема пространства, которое он занимает на сцене, поэтому область не изменяется при изменении единиц сцены.

Вы, ребята, знаете способ компенсировать изменение в единицах сцены или способ получить область лица в единицах сцены?

Спасибо!

+0

Майя не имеет масштаб Любое совпадение в графическом интерфейсе, что. в противном случае, это означает ** ложь **. Единственное, что произойдет, если установить масштаб на что-то другое, кроме значения по умолчанию, - это проблемы. SO, если вы хотите использовать масштаб, вам нужно реализовать целый ряд кода, который все еще не работает , В основном они думали, что они представили масштабный механизм, но они так и не сделали. (и действительно, модуль Mayas по умолчанию является жестким, система говорит cm, потому что это то, как ведут себя все элементы, зависящие от единицы). Но тогда почти все компьютерные программы имеют эту проблему даже для большинства программ САПР. – joojaa

ответ

3

Майя использует внутреннюю часть 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")) 
+0

Другие вещи, которые также не работают с другими подразделениями, время от времени являются динамикой, которая имеет собственное представление об устройстве. – joojaa

+0

Спасибо theodox! Это то, что мне нужно! – TheBeardedBerry

+0

+1, хорошая работа theodox –