А для того, чтобы было чем анимировать - вот вам три скрипта-заготовки.
Первый - это скрипт, который устанавливает текстуры на так называемый "геометрический буфер", чтобы во время анимации они не подгружалисць по сто раз расходуя траффик и уродуя геометрию. скрипт надо зпихнуть в обычный кубик со следующими параметрами:
Path cut begin and end - B=
0.050 E=
0.950
Hollow -
50.0
А кубик надо прилинковать (CTRL+L) к тому объекту, который надо анимировать (если вставите в скульпт-текстуру прозрачный альфа-канал, то кубик будит невидимым, а ваши скульпты хрен кому удасться спереть

)
Собственно сам скрипт:
list UUID=["ууид0","ууид1","ууид2","ууид3","ууид4","ууид5","ууид6","ууид7","ууид8",];
default
{
state_entry()
{
integer a=llGetListLength(UUID);
integer i;
for(i=0; i<a; i++)
{
llSetTexture(tex,i);
llOwnerSay("Текстуры установлены...");
}
llRemoveInventory(llGetScriptName() );
}
}
Вместо "ууид№" вписываем UUID текстуры находящейсця У ВАС В ИНВЕНТАРЕ. На один прим можно наложить НЕ БОЛЕЕ 9 ТЕКСТУР (т.к. именно столько сторон в этом приме)
ВАЖНО! Текстуры, которые вы вставили в тело скрипта удалять из инвента НЕЛЬЗЯ, иначе скрипт обратясь по несуществующему UUID тутже вылетит с ошибкой. Если подобное произойдёт с купленной у вас вещью, не думаю, что вам скажут спасибо...
Скрипт второй - тестовый рабочий прототип рутового скрипта:
integer i;
integer a;
integer b;
integer trig;
default
{
touch_start(integer total_number)
{
trig++;
if(trig==0) {llSetTimerEvent(0.0);}
if(trig==1) {llSetTimerEvent(0.08);}
else {trig=0;}
}
timer()
{
if(trig==1)
{
b++;
if(b>=4) {b=1;}
if(i<=0) {a=1;}
if(i>=4) {a=-1;}
i=i+a;
integer msg=1000+i;
llMessageLinked(LINK_THIS,2000+b,(string)msg,NULL_KEY);
llSetText("MSG - "+(string)msg+" | B = "+(string)b,<0,1,0>,1);
}
else {}
}
}
Данный скрипт (как и следующий) сам по себе бесполезен и являетсця чем-то вроде подсказки как устроены скульптовые скрипты-аниматоры.
Пихается непосредственно в прим, который надо заанимировать. Является "ведущим скриптом", то есть подаёт команды-кадры "ведомым" скриптам (4 шт. нужны для обхода задержки llSetPrimitiveParams(); она там 0.2 сек если шо...)
Скрипт третий - "ведомый":
list keys=["ууид0","ууид1","ууид2","ууид3","ууид4"];
integer sNum=1;
integer curSculpt;
integer curScript;
default
{
link_message(integer sndr_num, integer num, string msg, key id)
{
list data=llParseString2List(msg,[""],[""]);
curSculpt=llList2Integer(data,0)-1000;
curScript=num-2000;
if(curScript==sNum)
{
llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_SCULPT, llList2Key(keys,curSculpt), PRIM_SCULPT_TYPE_TORUS]);
}
else {}
}
}
В этом скрипте происходит обработка команд от "ведущего" и применение скульпт-текстуры к приму, но поскольку после применения текстуры скрипт "замораживается" на 0.2 сек, а интервал между кадрами должен быть никак не меньше 0.08 сек, необходимо создать ещё 3 таких же скрипта с одной лишь разницой - переменная sNum в первом скрипте должна равняться 1, во втором 2, в третьем 3 и в четвёртом 4.
З.Ы. Количество UUID конкретно в этом скрипте ограничивается только размером памяти, выделяемой скрипту (64 кб или 2000 UUID-шек если забить скрипт ими так "шобы аж свисало") 
З.З.Ы. Обнаружил у данного скрипта один глюк - когда заканчивается непосредственно сама скриптовая анимация, скульпт некоторое время "догоняет" скрипт.