Render.ru

клонирование по кривой

smiller_on

Пользователь сайта
Рейтинг
2
#1
Люди добрые поможите кто чем может! вобщем бьюсь с такой нетривиальной для майки задачей, как клонирование объектов по кривой. Перебрал 5 или 6 скриптов с highend3d все либо не рабочие либо не дают задавать количество копий, либо не ориентируют объект по направлению кривой. а всего-то стоит простая задача создания гусеницы танка. Где-то здесь находил тему про гусеницы, но скрипты, которые там фигурируют не совсем удачные, а урок, ссылка на который там есть, какой-то путанный. Самый работоспособный скрипт - это RS_threadcreation, но он не позволяет опять же задавать количество копий, и гусеница получается почему-то довольно разряженной. Может кто-нибудь расскажет коротенечко о своем опыте создания подобных объектов. Стандартными средствами или каким-нибудь скриптом. Заранее благодарен! :)
 

DemX86

Активный участник
Рейтинг
18
#2
Тот самый урок по созданию гусениц вручную -- самое толковое из всего, что там было (http://www.noir.org/tutorials/Xen%20Wildman/treadtut/treadtut.html).
Если нужно замутить клонирование по кривой без последующей анимации, то используй Create Animation Snapshop (в хелпе толковое описание). А если нужно анимировать, то лучше все-таки разберись до конца в вышеупомянутом уроке.
 

tadpole

Знаток
Рейтинг
24
#3
самый элементарный способ, не требующий никаких знаний - рисуешь кривую с точками, так что бы каждая точка была в центре будующего трака, переходишь в режим привязки к точке, выставляешь первый трак на первую точку, дублируешь его сколько надо и дальше расставляешь ручками по кривой.
 

Alex7

Знаток
Рейтинг
56
#4
int $num;
string $AllObj[2];
$AllObj = `ls -selection`;
string $result = "";

$result = `promptDialog
-title "Copy On Curve"
-message "Enter Num:"
-button "OK" -button "Cancel"
-defaultButton "OK" -cancelButton "Cancel"
-dismissString "Cancel"`;

if ($result == "OK") {
$num = `promptDialog -query -text`;
if ($num > 0) {
rebuildCurve -ch 1 -rpo 1 -rt 4 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s 4 -d 3 -tol 0.01 $AllObj[1];

select $AllObj[0];

for ($i = 0; $i < $num; $i++) {
print ($i);
instance;
float $xyz[] = `pointOnCurve -pr (1.0*($num-$i)/($num)) $AllObj[1]`;
move $xyz[0] $xyz[1] $xyz[2];
}
}
}

от нечего делать...
скрипт кидает нужное кол-во инстанцов на кривую
выдели объект копир-я, выдели крив-ю. примени скрипт
..вроде работает
побочные эфекты: правит кривую
пока что не направляет объекты вдоль касательной, попозже доделаю (если надо) (там поправить команду
pointOnCurve надо, ну и повернуть)

предназначен для замкнутой кривой
 

smiller_on

Пользователь сайта
Рейтинг
2
#5
блииин, как ты их так с ходу придумываешь, скрипты эти! спасибо, вещь нужная в хозяйстве! :) Это я себе скопирую, пожалуй, если не возражаешь! А скажи как можно насчет касательной поправить?
 

smiller_on

Пользователь сайта
Рейтинг
2
#6
ТО: tadpole, да и скриптик такой вроде был, на хайэнде. А после этого можно трак анимировать?

Вот еще такой вопрос, опять же по незнанию! Вроде осилил я урок, геморный способ но все же работает. Одно непонятно, после наложения сетки деформации ака latice можно ли как-нибудь двигать эту группу траков вместе с путями, или можно как-нибудь от этого деформатора потом избавиться? Просто сдеформил я кривые, но теперь если начинаешь эту группу двигать кривые начинают страшно корежиться из-а все той же сетки деформации, если делать delete history, чтобы от сетки избавиться, то кривые теряют возможность управлять траками! подскажите как! Может конечно и сам дойду, но что-то болше получаса по-разному извращался, никаких просветов.
 

Alex7

Знаток
Рейтинг
56
#7
Внес небольшие изменения ))

Вроде работает. Использовать x,y,z для разного результата....




--------------------------------------------------------------------------------------------------------------------
//++++++++++Alex7++++++++++++
global vector $vv = <<1,0,0>>;
global int $num;
window -title "Copy On Curve" CopyOnCurveWindow;

columnLayout columnLayout1;
text -label "Axis";

rowLayout -numberOfColumns 3 rowLayout1;
radioCollection radioCollection1;
string $radioButton1 = `radioButton -label "X" -select`;
string $radioButton2 = `radioButton -label "Y"`;
string $radioButton3 = `radioButton -label "Z"`;
setParent ..;

string $TextNum = `textField -text "0" -editable true -width 100 StatusLine`;

rowColumnLayout -numberOfColumns 2 rowColumnLayout1;
string $button1 = `button -label "Ok"`;
string $button2 = `button -label "Cancel"`;

button -edit -command ("ButtonDown" + " OK " + " `textField -query -text $TextNum`") $button1;
button -edit -command ("ButtonDown" + " CANCEL " + "`textField -query -text $TextNum`") $button2;
radioButton -edit -onCommand ("RadioButtonDown" + " 1 ") $radioButton1;
radioButton -edit -onCommand ("RadioButtonDown" + " 2 ") $radioButton2;
radioButton -edit -onCommand ("RadioButtonDown" + " 3 ") $radioButton3;

showWindow CopyOnCurveWindow;




proc ButtonDown (string $whichButton, string $TextNum) {
global int $num;
global vector $vv;

if ($whichButton == "OK") {
int $num = $TextNum;
vector $vv = <<1,0,0>>;
//print($num);
CopyOnCurve($num, $vv);
deleteUI -window CopyOnCurveWindow;
}

if ($whichButton == "CANCEL") {
deleteUI -window CopyOnCurveWindow;
}
}


proc RadioButtonDown (string $whichButton) {

global vector $vv;
if ($whichButton == "1") {$vv = <<1,0,0>>;}
if ($whichButton == "2") {$vv = <<0,1,0>>;}
if ($whichButton == "3") {$vv = <<0,0,1>>;}

}


//============================================


proc matrix Rot_Matr(float $phi, vector $rax) {
matrix $matr[4][4] = <<1.0, 0.0, 0.0, 0.0;
0.0, 1.0, 0.0, 0.0;
0.0, 0.0, 1.0, 0.0;
0.0, 0.0, 0.0, 1.0>>;
vector $urax = unit($rax);
float $rcos = cos(-$phi);
float $rsin = sin(-$phi);
float $u = $urax.x;
float $v = $urax.y;
float $w = $urax.z;
$matr[0][0] = $rcos + $u*$u*(1-$rcos);
$matr[1][0] = $w * $rsin + $v*$u*(1-$rcos);
$matr[2][0] = -$v * $rsin + $w*$u*(1-$rcos);
$matr[0][1] = -$w * $rsin + $u*$v*(1-$rcos);
$matr[1][1] = $rcos + $v*$v*(1-$rcos);
$matr[2][1] = $u * $rsin + $w*$v*(1-$rcos);
$matr[0][2] = $v * $rsin + $u*$w*(1-$rcos);
$matr[1][2] = -$u * $rsin + $v*$w*(1-$rcos);
$matr[2][2] = $rcos + $w*$w*(1-$rcos);

return $matr;
}

proc matrix Mult_Matr(matrix $m1[][], matrix $m2[][]) {
int $i, $j;
matrix $m3[4][4];
for ($i = 0; $i < 4; $i++) {
for ($j = 0; $j < 4; $j++) {
$m3[$i][$j] = $m1[$i][0]*$m2[0][$j]+
$m1[$i][1]*$m2[1][$j]+
$m1[$i][2]*$m2[2][$j]+
$m1[$i][3]*$m2[3][$j];
}
}
return $m3;
}

proc float[] Matr_To_Row(matrix $m) {
float $r[16];
$r[0] = $m[0][0];
$r[1] = $m[0][1];
$r[2] = $m[0][2];
$r[3] = $m[0][3];

$r[4] = $m[1][0];
$r[5] = $m[1][1];
$r[6] = $m[1][2];
$r[7] = $m[1][3];

$r[8] = $m[2][0];
$r[9] = $m[2][1];
$r[10] = $m[2][2];
$r[11] = $m[2][3];

$r[12] = $m[3][0];
$r[13] = $m[3][1];
$r[14] = $m[3][2];
$r[15] = $m[3][3];
return $r;
}

proc matrix Row_To_Matr(float $r[])
{
matrix $m[4][4];
$m[0][0] = $r[0];
$m[0][1] = $r[1];
$m[0][2] = $r[2];
$m[0][3] = $r[3];

$m[1][0] = $r[4];
$m[1][1] = $r[5];
$m[1][2] = $r[6];
$m[1][3] = $r[7];

$m[2][0] = $r[8];
$m[2][1] = $r[9];
$m[2][2] = $r[10];
$m[2][3] = $r[11];

$m[3][0] = $r[12];
$m[3][1] = $r[13];
$m[3][2] = $r[14];
$m[3][3] = $r[15];
return $m;
}

//=============================================

proc CopyOnCurve(int $num, vector $vv){

print ($num);
if ($num > 0) {
string $AllObj[2] = `ls -selection`;

rebuildCurve -ch 1 -rpo 1 -rt 4 -end 1 -kr 0 -kcp 0 -kep 1 -kt 0 -s 4 -d 3 -tol 0.01 $AllObj[1];


float $u;
float $txyz[3];
float $rxyz[3];
float $ang;

float $tt[3];
float $nn[3];

vector $v1, $v2;

float $r[16];
matrix $m1[4][4] = Row_To_Matr(`xform -q -m $AllObj[1]`);

matrix $m2[4][4] = <<0,0,0,0;
0,0,0,0;
0,0,0,0;
0,0,0,0>>;


for ($i = 0; $i < $num; $i++) {
select $AllObj[0];
instance;
$u = (1.0*($num-$i)/($num));
$txyz = `pointOnCurve -pr $u $AllObj[1]`;

$tt = `pointOnCurve -pr $u -nt $AllObj[1]`;
$v1 = <<$tt[0],$tt[1],$tt[2]>>;
$v2 = cross($vv,$v1);
$ang = angle($vv,$v1);

$m2 = Rot_Matr($ang, $v2);
$r = Matr_To_Row((Mult_Matr($m1,$m2)));
xform -m $r[0] $r[1] $r[2] $r[3]
$r[4] $r[5] $r[6] $r[7]
$r[8] $r[9] $r[10] $r[11]
$r[12] $r[13] $r[14] $r[15];
move $txyz[0] $txyz[1] $txyz[2];

}
}
}
 

smiller_on

Пользователь сайта
Рейтинг
2
#10
а скрипт чегой-то не заработал "line 1.4: Syntax error" Можкт у меня конечно лыжи не едут. Майка-то у меня 2008. и по уроку какая-то засада все сделал, круится, все замечательно, но группирую, копирую и у копии motion path's отсутствуют. Грущу :(
 

Alex7

Знаток
Рейтинг
56
#11
Быть того не может :) Сейчас скопировал и запустил, работает..
Может ты лишнее скопировал?
Копируй текст после //++++++++++Alex7++++++++++++
 

smiller_on

Пользователь сайта
Рейтинг
2
#12
да я и не говорю, что скрипт кривой, у меня майка почему-то любит line 1.4 ошибку выдавать. А у тебя 2008-я майка? Щас попробую на 8.5 запустить, отпишусь какие будут результаты!
 
Сверху