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

Object distance

Тема в разделе "MAXScript", создана пользователем Alex AndRiEL, 18 май 2015.

Модераторы: Savin Denis
  1. Alex AndRiEL

    Alex AndRiEL Знаток

    С нами с:
    28.05.2007
    Сообщения:
    248
    Симпатии:
    33
    Баллы:
    61
    Всем привет!
    Задача, уверен, для ведующих в скрипте - примитивнешая, но меня поставила в тупик, долго прыгал вокруг костей, IK и прочего но понял что именно скрипт решает.
    Задача следующая. Имеем два объекта, один Point - статичный, на него будем влиять и постоянно движущийся по окружности Dummy.
    Нужно, измеряя расстояние между объектами по Z (только Z, т.к. даммик крутится по окружности, расстояние меняется по двум осям), отслеживать период в котором расстояние это снижается до заданного порога, и если этот порог пройден (нижние положения даммика на окружности), то смещать по Z вниз статичный Point, ровно на столько же, на сколько превышен порог близости между объектами.
    Такой себе, эффект отрицательно заряженных магнитов.


    В попытках решить самостельно, незнаю верно или неверно дошёл до точки что нужно в Z позишн поинта вставить Expression контроллер, и в нём с правильным синтаксисом описать простой If .. бла бла бла если разница двух осей Z меньше числа "x" - сдвинуть Z позишн поинта на эту разницу.
    Сложности именно в синтаксисе, как считывать параметры, как их сравнивать и в DO как задать изменение Z позишн поинта.
     

    Вложения:

    • Z.JPG
      Z.JPG
      Размер файла:
      33,3 КБ
      Просмотров:
      71
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Используем контроллер Float Script вместо Float Expression.
    Код:
    x=20; z_min=-10
    if $Dummy01.pos.z-z_min<x then $Dummy01.pos.z-x else z_min
    z_min это нужное значение z для поинта в статичном состоянии.
    Dummy01 это название объекта Dummy.
     
  3. Alex AndRiEL

    Alex AndRiEL Знаток

    С нами с:
    28.05.2007
    Сообщения:
    248
    Симпатии:
    33
    Баллы:
    61
    Эффекта нету :(
    Пробовал и чисто копипастом и объявлять x и z_min в окошко variables.. Point просто никак не реагирует.
     

    Вложения:

    • z2.JPG
      z2.JPG
      Размер файла:
      75,1 КБ
      Просмотров:
      74
    Последнее редактирование: 18 май 2015
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    У меня есть эффект.
    Пример. В новой сцене запускаем скрипт:
    Код:
    c=circle(); c.radius=20;
    c.transform=matrix3 [1,0,0] [0,0,1] [0,-1,0] [0,0,20]
    d=dummy(); d.name="Dummy001";
    d.pos.controller=Path_Constraint();co=d.pos.controller;
    co.path=c; co.follow =true
    p=point();p.name="Point001"
    p.pos.controller[3].controller=float_script()
    co=p.pos.controller[3].controller
    str=""
    str+="x=20; z_min=-10";str+="\n"
    str+="if $Dummy001.pos.z-z_min<x then $Dummy001.pos.z-x else z_min"
    co.script=str
    playAnimation()
     
  5. Alex AndRiEL

    Alex AndRiEL Знаток

    С нами с:
    28.05.2007
    Сообщения:
    248
    Симпатии:
    33
    Баллы:
    61
    Блин, точно!
    И как раз как надо.
    Ладно, разберусь почему у меня лажало.
    Спасибо большое!

    UPD: Дошло почему не работало. Я ручками возюкал даммик:) А через запуск его по сплайну - ОК.
     
    Последнее редактирование: 18 май 2015
  6. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Теперь стало понятнее.
    Как вы возюкаете даммик? Где находится Pivot даммика?
    1. Если Pivot объекта Dummy001 находится в центре объекта Dummy001, тогда:
    Создаем в центре окружности один объект Dummy (Dummy002) и линкуем к нему объект Dummy001.
    В контроллере Float Script создаем переменную на узел Dummy001.
    Потом возюкаем объект Dummy002.
    Пример. В новой сцене запускаем скрипт:
    Код:
    c=circle(); c.radius=20;
    c.transform=matrix3 [1,0,0] [0,0,1] [0,-1,0] [0,0,20]
    d=dummy(); d.name="Dummy001";d.pos=[0,0,0]
    d2=dummy(); d2.name="Dummy002";d2.pos=[0,0,20]
    d.parent=d2
    p=point();p.name="Point001"
    p.pos.controller[3].controller=float_script()
    co=p.pos.controller[3].controller
    co.addobject "d" d
    str=""
    str+="x=20; z_min=-10";str+="\n"
    str+="if $Dummy001.pos.z-z_min<x then $Dummy001.pos.z-x else z_min"
    co.script=str
    2.Если Pivot объекта Dummy001 находится в центре окружности, тогда:
    В контроллере Float Script создаем переменную на узел Dummy001.
    В контроллере Float Script вместо "$Dummy001.pos.z" используем "$Dummy001.objecttransform.pos.z"
    Потом возюкаем объект Dummy001.
    Пример. В новой сцене запускаем скрипт:
    Код:
    fn AlignPivotTo Obj Trgt =
    (
    if classOf Trgt != matrix3 then Trgt = Trgt.transform
    local ChldTms = in coordSys Trgt ( for Chld in Obj.children collect Chld.transform )
    local TmScale = scaleMatrix Obj.objectOffsetScale
    local TmRot = Obj.objectOffsetRot as matrix3
    local TmPos = transMatrix Obj.objectOffsetPos
    local TmOffset = TmScale * TmRot * TmPos
    TmOffset *= obj.transform * inverse Trgt
    Obj.transform = Trgt
    Obj.objectOffsetPos = TmOffset.translation
    Obj.objectOffsetRot = TmOffset.rotation
    Obj.objectOffsetScale = TmOffset.scale
    for i = 1 to Obj.children.count do Obj.children[i].transform = ChldTms[i] * inverse Trgt * Obj.transform
    )--fn AlignPivotTo Obj Trgt =
    
    c=circle(); c.radius=20;
    c.transform=matrix3 [1,0,0] [0,0,1] [0,-1,0] [0,0,20]
    m=matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,20]
    d=dummy(); d.name="Dummy001";d.pos=[0,0,0]
    AlignPivotTo d m
    p=point();p.name="Point001";
    p.pos.controller[3].controller=float_script()
    co=p.pos.controller[3].controller
    co.addobject "d" d
    str=""
    str+="x=20; z_min=-10";str+="\n"
    str+="if $Dummy001.objecttransform.pos.z-z_min<x then $Dummy001.objecttransform.pos.z-x else z_min"
    co.script=str
     
Модераторы: Savin Denis

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