вопросы по MEL
- Автор темы JazzzDima
- Дата создания
- Рейтинг
- 2
Всем привет. Задача - необходимо приаттачить geometry cach к 1000 объектов. Но проблема в том, что команда attachGeometryCache является Runtime, не имеет никаких флагов и при выполнении выдает диалоговое окно для выбора кеш файла. Вопрос, есть ли возможность указать команде путь к кеш файлу програмно?
Почитайте, что такое команда.
- Рейтинг
- 47
Господа, у меня вопрос по переменным в процедурах.
Есть нормально работающий целый код. Хочу его разбить на части (start, end) и в середину вставить некоторые действия. Возникает проблема с переменными. В первой части кода, создается Плейн и загоняется в string $plane[]. Во всех последующих процедурах, пишется "$plane" is an undeclared variable. Как я ее только не пытался сделать глобальной (и приписывал Global в “теле” процедуры, и пробовал объявить в самом начале), ничего не выходит.
Что бы не быть голословным, вот тот самый код:
В общем, суть вопроса: как сделать так, что бы информация об объектах (их названия) присвоенная переменными в куске start, оставалась и распознавалась во всех остальных частях кода?
Есть нормально работающий целый код. Хочу его разбить на части (start, end) и в середину вставить некоторые действия. Возникает проблема с переменными. В первой части кода, создается Плейн и загоняется в string $plane[]. Во всех последующих процедурах, пишется "$plane" is an undeclared variable. Как я ее только не пытался сделать глобальной (и приписывал Global в “теле” процедуры, и пробовал объявить в самом начале), ничего не выходит.
Что бы не быть голословным, вот тот самый код:
Код:
// перед запуском должен быть выделен полигон, или три вертекса, или два ребра.
proc start() {
ConvertSelectionToVertices;
string $vtxSel[] = `ls -sl -fl`;
string $selectedObjectStore[] = `ls -sl -o`;
[b]$objectSelectionStore[/b] = `listRelatives -p $selectedObjectStore[0]`;
if (size($vtxSel) < 3)
error "Please select at least 3 Vertices, 2 Edges or 1 Face";
// create and align helperPlane
string [b]$plane[][/b] = `polyPlane -w 1 -h 1 -sx 1 -sy 1 -ax 0 1 0 -cuv 2 -ch 1 -n rotationPlane`;
select ( $plane[0] + ".vtx[0:2]") $vtxSel[0] $vtxSel[1] $vtxSel[2];
snap3PointsTo3Points(0);
select $plane[0];
MoveTool;
}
//получается, объект у которого было выделение, заносится в $objectSelectionStore
//а созданная плоскость (которая в последствии будет определять опорную точку) в $plane[]
---------------------------------------------------------------------------------------------------------------
// вот тут и начинаются проблемы с переменной $plane[0].
proc rotZ() {
string $obj1 = [b]$plane[0][/b];
float $getPivotRotZ = `getAttr ($obj1 + ".rotateAxisZ")`;
$pivotRotZ = $getPivotRotZ + 90.0;
setAttr ($obj1 + ".rotateAxisZ") $pivotRotZ;
}
----------------------------------------------------------------------------------
// здесь они продолжаются уже с двумя. $plane[0] и $objectSelectionStore
proc end() {
// parent object to helperPlane
parent [b]$objectSelectionStore $plane[0][/b];
// freeze transformations on object
makeIdentity -apply true -t 0 -r 1 -s 0 -n 0 $objectSelectionStore;
// unparent object
parent -world $objectSelectionStore;
// cleanup
delete $plane;
}
- Рейтинг
- 17
Вариации на тему "Хелп не читал, не читаю и читать не буду!"
область видимости переменных - это общий принцип программирования, одинаковый во всех известных мне языках. В майской документации описан. И в сопутствующей литературе тоже.
опять же передача данных в процедуру и получение результата - тоже общий принцип, вытекающий из предыдущего, и методы здесь опять-таки одинаковые во всех известных мне языках : либо через параметры процедуры, либо через глобальные переменные, либо через запись/чтение.
Глобальные переменные вещь довольно тонкая, их лучше на начальном этапе не использовать, optionVar не все понимают, запись-чтение в файл неэлегантно. так что остается передавать имя вашей плоскости в процедуру через параметры вызова процедуры, что-то типа
gloabal proc myProc(string $nameOfPlane)
(
print ("Name of plane is "+$nameOfplane+"\n")
};
cooтветсвенно вызов будет либо
myProc "pPlane1" ;
либо
myProc("pPlane1")
область видимости переменных - это общий принцип программирования, одинаковый во всех известных мне языках. В майской документации описан. И в сопутствующей литературе тоже.
опять же передача данных в процедуру и получение результата - тоже общий принцип, вытекающий из предыдущего, и методы здесь опять-таки одинаковые во всех известных мне языках : либо через параметры процедуры, либо через глобальные переменные, либо через запись/чтение.
Глобальные переменные вещь довольно тонкая, их лучше на начальном этапе не использовать, optionVar не все понимают, запись-чтение в файл неэлегантно. так что остается передавать имя вашей плоскости в процедуру через параметры вызова процедуры, что-то типа
gloabal proc myProc(string $nameOfPlane)
(
print ("Name of plane is "+$nameOfplane+"\n")
};
cooтветсвенно вызов будет либо
myProc "pPlane1" ;
либо
myProc("pPlane1")
Вычисление изменения инпута ноды.
В ригах стараюсь избегать использования экспрешнов, успешно заменяя их нод-нетворками (которые, понятное дело, работают быстрее). И практически любую логическую конструкцию получается так реализовать. Исключение составляет - сохранение значения атрибута с предыдущего шага выполнения. В экспрешне это можно сделать, используя глобальную переменную. Предыдущим шагом выполнения при этом будет - предыдущий кадр. Очевидно, что и для работающих в реальном времени нод время каким-то образом квантуется. Так же Майя различает dirty и clean plugs. Dirty plug - это атрибут который не вычислился с тех пор, как значение входящего атрибута изменилось. Т.е. существует ДЕЛЬТА между предыдущим значением атрибута и текущим.
Вопрос: как вычислять эту разницу между текущим значением атрибута и значением до его изменения без помощи экспрешна с глобальной переменной или скомпилированной специально для этого ноды? Можно ли решить эту задачу, используя только стандартные майские ноды (кроме expression)?
В ригах стараюсь избегать использования экспрешнов, успешно заменяя их нод-нетворками (которые, понятное дело, работают быстрее). И практически любую логическую конструкцию получается так реализовать. Исключение составляет - сохранение значения атрибута с предыдущего шага выполнения. В экспрешне это можно сделать, используя глобальную переменную. Предыдущим шагом выполнения при этом будет - предыдущий кадр. Очевидно, что и для работающих в реальном времени нод время каким-то образом квантуется. Так же Майя различает dirty и clean plugs. Dirty plug - это атрибут который не вычислился с тех пор, как значение входящего атрибута изменилось. Т.е. существует ДЕЛЬТА между предыдущим значением атрибута и текущим.
Вопрос: как вычислять эту разницу между текущим значением атрибута и значением до его изменения без помощи экспрешна с глобальной переменной или скомпилированной специально для этого ноды? Можно ли решить эту задачу, используя только стандартные майские ноды (кроме expression)?