1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Maya", создана пользователем smiller_on, 17 янв 2008.

Модераторы: Dark™, Skif
  1. smiller_on

    smiller_on Пользователь сайта

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

    DemX86 Знаток

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

    tadpole Знаток

    С нами с:
    12.08.2005
    Сообщения:
    712
    Симпатии:
    1
    Баллы:
    24
    самый элементарный способ, не требующий никаких знаний - рисуешь кривую с точками, так что бы каждая точка была в центре будующего трака, переходишь в режим привязки к точке, выставляешь первый трак на первую точку, дублируешь его сколько надо и дальше расставляешь ручками по кривой.
     
  4. Alex7

    Alex7 Знаток

    С нами с:
    07.03.2006
    Сообщения:
    148
    Симпатии:
    0
    Баллы:
    63
    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 надо, ну и повернуть)

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

    smiller_on Пользователь сайта

    С нами с:
    16.03.2007
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    2
    блииин, как ты их так с ходу придумываешь, скрипты эти! спасибо, вещь нужная в хозяйстве! :) Это я себе скопирую, пожалуй, если не возражаешь! А скажи как можно насчет касательной поправить?
     
  6. smiller_on

    smiller_on Пользователь сайта

    С нами с:
    16.03.2007
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    2
    ТО: tadpole, да и скриптик такой вроде был, на хайэнде. А после этого можно трак анимировать?

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

    Alex7 Знаток

    С нами с:
    07.03.2006
    Сообщения:
    148
    Симпатии:
    0
    Баллы:
    63
    Внес небольшие изменения ))

    Вроде работает. Использовать 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];

    }
    }
    }
     
  8. tadpole

    tadpole Знаток

    С нами с:
    12.08.2005
    Сообщения:
    712
    Симпатии:
    1
    Баллы:
    24
    а че нельзя то? делай анимацию по кривой...
     
  9. smiller_on

    smiller_on Пользователь сайта

    С нами с:
    16.03.2007
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    2
    Обалдеть, вот что значит - учите MEL. Спасибище, Alex7, огроменное!
     
  10. smiller_on

    smiller_on Пользователь сайта

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

    Alex7 Знаток

    С нами с:
    07.03.2006
    Сообщения:
    148
    Симпатии:
    0
    Баллы:
    63
    Быть того не может :) Сейчас скопировал и запустил, работает..
    Может ты лишнее скопировал?
    Копируй текст после //++++++++++Alex7++++++++++++
     
  12. smiller_on

    smiller_on Пользователь сайта

    С нами с:
    16.03.2007
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    2
    да я и не говорю, что скрипт кривой, у меня майка почему-то любит line 1.4 ошибку выдавать. А у тебя 2008-я майка? Щас попробую на 8.5 запустить, отпишусь какие будут результаты!
     
Модераторы: Dark™, Skif

Поделиться этой страницей