вопросы по MEL
- Автор темы JazzzDima
- Дата создания
К вопросу о координатах объекта. Попробовал сделать так:
Но это работает, только до обнуления трансформаций. В общем не то, что нужно. Нужны именно координаты относительно центра мировых координат. Как то так.
-----------------------------------------\
Решил ещё с другой стороны зайти. Снять координаты вертекса через pointPosition;, но не могу понять, как полученные значения использовать для $qwe1 = `spaceLocator -p $x $y $z `;
Код:
string $qwe[];
string $qwe1[];
$qwe = `ls -sl`;
float $x = `getAttr $qwe.translateX`;
float $y = `getAttr $qwe.translateY`;
float $z = `getAttr $qwe.translateZ`;
$qwe1 = `spaceLocator -p $x $y $z `;
xform -cp $qwe1;
parent $qwe $qwe1;
-----------------------------------------\
Решил ещё с другой стороны зайти. Снять координаты вертекса через pointPosition;, но не могу понять, как полученные значения использовать для $qwe1 = `spaceLocator -p $x $y $z `;
- Рейтинг
- 5
Такой вопрос. Не могу найти команду, чтобы выдавала координаты объекта (или может его пивота) в пространстве. Нашол только как координаты вертекса определить.
Собственно сам скрипт:
Код:
// Skript stransform space coordinats to other space
// Использование spaceToSpace (float $pt[], string $fromSpace, string $fromNode, string $toSpace, string $toNode)
// $pt - координаты которые необходимо преобразовать
// fromSapce - пространство из корого нужно преобразовать
// fromNode - нода с которой надо взять матрицу преобразования (та с котрой надо преобразовать координаты)
// toSpace - в какую систему надо преобразовать
// toNode - матрицуцу какой ноды нужна для преобразования.
// пример :
/*
float $pt[3] = {1.0, 2.0, 3.0};
$pt = spaceToSpace($pt, "local", "pCube1", "local", "nurbsCone1");
//преобразование из локального в мировое пространство.
$pt = spaceToSpace($pt, "local", "nurbsSphere1", "world", "");
//преобразовать из мирового в локальное простарнство;
$pt = spaceToSpace($pt, "world", "", "local", "pCube1");
*/
proc float[] transformWorld (float $pt[], float $mtx[]){
float $res[] = { 0.0, 0.0 , 0.0 };
if (size($pt) != 3 && size($mtx) != 16){
warning "transformWorld proc : pt != 3 or mtx != 16 elements";
return $res;
}
$res[0] = $pt[0] * $mtx[0] + $pt[1] * $mtx[4] + $pt[2] * $mtx[8] + $mtx[12];
$res[1] = $pt[0] * $mtx[1] + $pt[1] * $mtx[5] + $pt[2] * $mtx[9] + $mtx[13];
$res[2] = $pt[0] * $mtx[2] + $pt[1] * $mtx[6] + $pt[2] * $mtx[10] + $mtx[14];
return $res;
}
proc int getInstanceIndex (string $nodePath){ // возвращает индекс данного узла.
string $paths[] = `ls - allPaths $nodePath` ;
int $i;
for ($i=0; $i< size($paths); $i++){
if ($paths[$i] == $nodePath)
return $i;
retrun -1;
}
}
proc float[] toSpace (float $pt[], string $fromSpace, string $fromNode, string $toSpace, string $toNode){
float $res[] = $pt;
float $mtx[];
if ($fromSpace == "local"){ //преобразуем точку в мировое пространство.
$mtx = `xform -q -ws -m $fromNode`;
$res = transformWorld($res, $mtx);
}
if ($toSpace == "local"){ //преобразуем точку в нужное нам пространство.
int $inst = getInstanceIndex($toNode);
string $attr = $toNode + ".worldInverseMatrix[" + $inst + "]";
$mtx = `getAttr $attr`;
print "\nInverse: "; //обратная матрица.
print $mtx;
$res = transformWorld($res, $mtx);
}
return $res;
}
global proc float[] spaceToSpace (float $pt[], string $fromSpace, string $fromNode, string $toSpace, string $toNode){
return toSpace ($pt, $fromSpace, $fromNode, $toSpace, $toNode);
}
Ребята,подскажите пожалуйста как через mel можно прицепить отрендеренную картинку на превью материала
"grab swatch to hypershade visor"
Echo all cammands выдаёт:
renderWindowMenuCommand grabSwatch renderView; // переходим в режим взятия swatch
renderWindowCheckAndRenderRegion 1 0 0 1; // размер взятого образца (до краёв)
setAttr defaultRenderGlobals.left 0; // если рендер размером 256х256
setAttr defaultRenderGlobals.rght 256;
setAttr defaultRenderGlobals.bot 0;
setAttr defaultRenderGlobals.top 256;
а потом ,когда тянешь её на материал пишет такую дрянь:
hyperShadePanelSetActiveTabLayout hyperShadePanel1 firstPaneTabs false; // дрянь какая то
"grab swatch to hypershade visor"
Echo all cammands выдаёт:
renderWindowMenuCommand grabSwatch renderView; // переходим в режим взятия swatch
renderWindowCheckAndRenderRegion 1 0 0 1; // размер взятого образца (до краёв)
setAttr defaultRenderGlobals.left 0; // если рендер размером 256х256
setAttr defaultRenderGlobals.rght 256;
setAttr defaultRenderGlobals.bot 0;
setAttr defaultRenderGlobals.top 256;
а потом ,когда тянешь её на материал пишет такую дрянь:
hyperShadePanelSetActiveTabLayout hyperShadePanel1 firstPaneTabs false; // дрянь какая то
Подскажите, есть ли способ отследить окончание работы batchRender-а? Нужно выполнить несколько пакетных рендеров подряд с разными настройками камеры, а делать каждый раз проверку по наличию конечного файла не хочется. Майка 2012.
Вот есть часть скрипта с перебором элементов и как пример делает все слои видимыми или нет
Но здесь перебираются только те слои которые начинаются с маленьких a, b или с, или любой заглавной (от d и дальше по алфавиту со слоями ничего не происходит)
Если создать дефолтные слои (layer1...) то всё работает пока не переименуешь хотя бы 1
Может кто обьяснить причину такой избирательности или как её обойти?
Код:
string $layer;
string $AllLayers[] = `ls -type displayLayer`;
for($layer in $AllLayers)
{
setAttr ($layer + ".visibility") 0;
}
Если создать дефолтные слои (layer1...) то всё работает пока не переименуешь хотя бы 1
Может кто обьяснить причину такой избирательности или как её обойти?