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

Follow вдоль кривой экспрешном - как?

Тема в разделе "Maya", создана пользователем HuziK, 29 мар 2015.

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

    HuziK Активный участник

    С нами с:
    02.10.2006
    Сообщения:
    73
    Симпатии:
    1
    Баллы:
    7
    Всем привет! Есть объект, двигающийся вдоль кривой, нужно экспрешном прописать его вращение по оси движения (аналог Follow).
    У меня вышло следующее:

    float $lastX = `getAttr -t (frame-1) Copter_Cube2.translateX`;
    float $lastY = `getAttr -t (frame-1) Copter_Cube2.translateY`;
    float $lastZ = `getAttr -t (frame-1) Copter_Cube2.translateZ`;
    vector $last = <<$lastX, 0, $lastZ>>;
    print("last = " + $last + "\n");
    // узнали положение объекта кадр назад

    float $curX = `getAttr Copter_Cube2.translateX`;
    float $curY = `getAttr Copter_Cube2.translateY`;
    float $curZ = `getAttr Copter_Cube2.translateZ`;
    vector $cur = <<$curX, 0, $curZ>>;
    print(" cur = " + $cur + "\n");
    // текущее положение объекта

    vector $dir = $cur + $last;

    // узнали направление, в котором переместился объект

    Copter_Cube2.rotateY = atan2d($dir.x, $dir.z);
    // вычисляем угол в градусах, вдоль направления движения

    Проект майки 2015, если это поможет: https://yadi.sk/d/zPoUlJuHfb55o

    Объект вроде бы поворачивает по кривой, но угол явно неверный. Кто разбирается в математике, подскажите пожалуйста, как решить эту задачу.
    Спасибо!
     
  2. dimusart

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

    С нами с:
    10.05.2005
    Сообщения:
    11
    Симпатии:
    3
    Баллы:
    4
    1. ошибка в определении вектора $dir
    2. так же лучше завести переменную под frame

    float $frm = frame;
    float $lastX = `getAttr -t ($frm-1) Copter_Cube2.translateX`;
    float $lastY = `getAttr -t ($frm-1) Copter_Cube2.translateY`;
    float $lastZ = `getAttr -t ($frm-1) Copter_Cube2.translateZ`;
    vector $last = <<$lastX, 0, $lastZ>>;
    print("last = " + $last + "\n");
    // узнали положение объекта кадр назад

    float $curX = `getAttr Copter_Cube2.translateX`;
    float $curY = `getAttr Copter_Cube2.translateY`;
    float $curZ = `getAttr Copter_Cube2.translateZ`;
    vector $cur = <<$curX, 0, $curZ>>;
    print(" cur = " + $cur + "\n");
    // текущее положение объекта

    vector $dir = $cur - $last;

    // узнали направление, в котором переместился объект

    Copter_Cube2.rotateY = atan2d($dir.x, $dir.z);
    // вычисляем угол в градусах, вдоль направления движения
     
    HuziK нравится это.
  3. Александр Чернега

    Александр Чернега Знаток

    С нами с:
    24.12.2009
    Сообщения:
    1.058
    Симпатии:
    56
    Баллы:
    53
    Можно воспользоваться уже готовыми решениями.
    Есть такое
    и такое
     
  4. HuziK

    HuziK Активный участник

    С нами с:
    02.10.2006
    Сообщения:
    73
    Симпатии:
    1
    Баллы:
    7
    Всем спасибо за ответы!
     
    Последнее редактирование: 30 мар 2015
  5. HuziK

    HuziK Активный участник

    С нами с:
    02.10.2006
    Сообщения:
    73
    Симпатии:
    1
    Баллы:
    7
    Один момент, кому интересно: этот экспрешн работает криво при анимации по кривой, а при анимации кейфреймами, работает, как надо.
     
  6. Кирилл Клят

    Кирилл Клят Знаток

    С нами с:
    13.06.2011
    Сообщения:
    406
    Симпатии:
    5
    Баллы:
    22
    Уважаемый Skif, вопрос по вашему видео - когда я делаю по пути анимации , то объект немного криво идет по кривой. Т.е. сначала либо делает зигзаг в начале кривой, (где то 20ую часть всей кривой) , либо поворачивается на 180 градусов и потом уже ползет по ней нормально. Почему? я пробовал rebuild curve и прочее, все равно, в начале кривой объект себя ведет ненормально. Я это "исправил" просто заанимировав twist у объекта как надо, но все равно это неправильно как-то
     
  7. Skif vip

    Skif Administrator Команда форума

    С нами с:
    26.03.2004
    Сообщения:
    6.827
    Симпатии:
    417
    Баллы:
    2.787
    это надо разбираться в конкретном случае. так с ходу не скажу.
     
Модераторы: Dark™, Skif

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