Добрый день!
Очень прошу помочь новичку в Майа в вопросе, который связан с моделированием для научных целей (биология).
У меня есть skeleton. Скелет, который получился в результате импорта файла PDB (формат, описывающий координаты атомов макромолекул). Т.е. joints - это атомы, а bones - межатомные расстояния. Более того, считав весь PDB-файл (все структуры) и поместив все joints в каждой модели в keyframes, я получил анимированную модель макромолекулы. Далее идёт "химическая" кухня, задание ограничений для того, чтобы при движении молекула не занимала невозможных с точки зрения химии положений.
Ну и вот - теперь стала задача атомы представить шариками. А вот тут нас ждала маленькая засада. Атомов в сцене - десятки тысяч, доходит до 100 тысяч. Пробовали с NURBS, Poligons - ничего не вышло. Машина P-IV, 3,2 Ghz, памяти 2 Gb. Остановились на частицах.
А вот теперь вопрос - как в real time при помощи joints управлять положением per particles. Написался у меня следующий скрипт:
global proc contrpart()
global proc contrpart()
{
float $x;
float $y;
float $z;
string $pame;
$pame = ("_Pame_");
particle -n $pame ;
addAttr -ln "rgbPP" -dt vectorArray ($pame + "Shape") ;
addAttr -ln "rgbPP0" -dt vectorArray ($pame + "Shape");
addAttr -ln "radiusPP" -dt doubleArray ($pame + "Shape") ;
addAttr -ln "radiusPP0" -dt doubleArray ($pame + "Shape");
addAttr -ln Mult -at double -min 0 -max 10 -dv 1 $pame;
setAttr -e -keyable true ($pame+".Mult");
setAttr (($pame + "Shape") +".particleRenderType") 4;
global float $xtrans=-1;
global float $ytrans=3;
global float $ztrans=8;
global float $xmov;
global float $ymov;
global float $zmov;
global float $vect[];
global float $vect1[];
global int $i;
global string $am;
global int $i1;
global string $am1;
joint -a -p 0 0 0 -n "j1";
joint -a -p 2 3 0 -n "j2";
joint -a -p 1 6 8 -n "j3";
joint -a -p 3 1 2 -n "j4";
joint -a -p 5 2 -2 -n "j5";
setKeyframe -attribute "translateX" -time 1 -value -1 j3;
setKeyframe -attribute "translateY" -time 1 -value 3 j3;
setKeyframe -attribute "translateZ" -time 1 -value 8 j3;
emit -o $pame -pos 0 0 0 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
emit -o $pame -pos 2 3 0 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
emit -o $pame -pos 1 6 8 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
emit -o $pame -pos 3 1 2 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
emit -o $pame -pos 5 2 -2 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
setKeyframe -attribute "translateX" -time 24 -value 10 j3;
$am1="j3";
expression -s "global float $vect[];\r\n$vect=`joint -q -a -p $am1`;" -o $am1 -ae 1 -uc all ;
$am="j4";
expression -s "global float $vect1[];\r\n$vect1=`joint -q -a -p $am`;" -o $am -ae 1 -uc all ;
$i1=2;
$i=3;
dynExpression -s "particle -e -or $i1 -at position -vv ($vect[0]) ($vect[1]) ($vect[2]) _Pame_Shape ;\r\nparticle -e -or $i -at position -vv ($vect1[0]) ($vect1[1]) ($vect1[2]) _Pame_Shape ;" -rad _Pame_Shape;
}
Как вы видите, частицы 2 и 3 движутся за joints 3 и 4. Проблема в строке "dynExpression.........", где пришлось явно прописывать частицы и ведущие "суставы". Но, как вы понимаете, программа пишется для того, чтобы унифицировать импорт макромолекул, а они, как известно, все разные.
Вот в этом и заключается вопрос: как модифицировать скрипт (или может как-то по другому связать частицы с ведущими joints) таким образом, чтобы при любом количестве joints и particles они привязывались автоматически и двигались вместе?
С уважением.
Юра.
Очень прошу помочь новичку в Майа в вопросе, который связан с моделированием для научных целей (биология).
У меня есть skeleton. Скелет, который получился в результате импорта файла PDB (формат, описывающий координаты атомов макромолекул). Т.е. joints - это атомы, а bones - межатомные расстояния. Более того, считав весь PDB-файл (все структуры) и поместив все joints в каждой модели в keyframes, я получил анимированную модель макромолекулы. Далее идёт "химическая" кухня, задание ограничений для того, чтобы при движении молекула не занимала невозможных с точки зрения химии положений.
Ну и вот - теперь стала задача атомы представить шариками. А вот тут нас ждала маленькая засада. Атомов в сцене - десятки тысяч, доходит до 100 тысяч. Пробовали с NURBS, Poligons - ничего не вышло. Машина P-IV, 3,2 Ghz, памяти 2 Gb. Остановились на частицах.
А вот теперь вопрос - как в real time при помощи joints управлять положением per particles. Написался у меня следующий скрипт:
global proc contrpart()
global proc contrpart()
{
float $x;
float $y;
float $z;
string $pame;
$pame = ("_Pame_");
particle -n $pame ;
addAttr -ln "rgbPP" -dt vectorArray ($pame + "Shape") ;
addAttr -ln "rgbPP0" -dt vectorArray ($pame + "Shape");
addAttr -ln "radiusPP" -dt doubleArray ($pame + "Shape") ;
addAttr -ln "radiusPP0" -dt doubleArray ($pame + "Shape");
addAttr -ln Mult -at double -min 0 -max 10 -dv 1 $pame;
setAttr -e -keyable true ($pame+".Mult");
setAttr (($pame + "Shape") +".particleRenderType") 4;
global float $xtrans=-1;
global float $ytrans=3;
global float $ztrans=8;
global float $xmov;
global float $ymov;
global float $zmov;
global float $vect[];
global float $vect1[];
global int $i;
global string $am;
global int $i1;
global string $am1;
joint -a -p 0 0 0 -n "j1";
joint -a -p 2 3 0 -n "j2";
joint -a -p 1 6 8 -n "j3";
joint -a -p 3 1 2 -n "j4";
joint -a -p 5 2 -2 -n "j5";
setKeyframe -attribute "translateX" -time 1 -value -1 j3;
setKeyframe -attribute "translateY" -time 1 -value 3 j3;
setKeyframe -attribute "translateZ" -time 1 -value 8 j3;
emit -o $pame -pos 0 0 0 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
emit -o $pame -pos 2 3 0 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
emit -o $pame -pos 1 6 8 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
emit -o $pame -pos 3 1 2 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
emit -o $pame -pos 5 2 -2 -at rgbPP -vv 0 0 1 -at radiusPP -fv 0.7;
setKeyframe -attribute "translateX" -time 24 -value 10 j3;
$am1="j3";
expression -s "global float $vect[];\r\n$vect=`joint -q -a -p $am1`;" -o $am1 -ae 1 -uc all ;
$am="j4";
expression -s "global float $vect1[];\r\n$vect1=`joint -q -a -p $am`;" -o $am -ae 1 -uc all ;
$i1=2;
$i=3;
dynExpression -s "particle -e -or $i1 -at position -vv ($vect[0]) ($vect[1]) ($vect[2]) _Pame_Shape ;\r\nparticle -e -or $i -at position -vv ($vect1[0]) ($vect1[1]) ($vect1[2]) _Pame_Shape ;" -rad _Pame_Shape;
}
Как вы видите, частицы 2 и 3 движутся за joints 3 и 4. Проблема в строке "dynExpression.........", где пришлось явно прописывать частицы и ведущие "суставы". Но, как вы понимаете, программа пишется для того, чтобы унифицировать импорт макромолекул, а они, как известно, все разные.
Вот в этом и заключается вопрос: как модифицировать скрипт (или может как-то по другому связать частицы с ведущими joints) таким образом, чтобы при любом количестве joints и particles они привязывались автоматически и двигались вместе?
С уважением.
Юра.