Всем привет!
Задача, уверен, для ведующих в скрипте - примитивнешая, но меня поставила в тупик, долго прыгал вокруг костей, IK и прочего но понял что именно скрипт решает.
Задача следующая. Имеем два объекта, один Point - статичный, на него будем влиять и постоянно движущийся по окружности Dummy.
Нужно, измеряя расстояние между объектами по Z (только Z, т.к. даммик крутится по окружности, расстояние меняется по двум осям), отслеживать период в котором расстояние это снижается до заданного порога, и если этот порог пройден (нижние положения даммика на окружности), то смещать по Z вниз статичный Point, ровно на столько же, на сколько превышен порог близости между объектами.
Такой себе, эффект отрицательно заряженных магнитов.
В попытках решить самостельно, незнаю верно или неверно дошёл до точки что нужно в Z позишн поинта вставить Expression контроллер, и в нём с правильным синтаксисом описать простой If .. бла бла бла если разница двух осей Z меньше числа "x" - сдвинуть Z позишн поинта на эту разницу.
Сложности именно в синтаксисе, как считывать параметры, как их сравнивать и в DO как задать изменение Z позишн поинта.
Alex AndRiELДошло почему не работало. Я ручками возюкал даммик
Теперь стало понятнее.
Как вы возюкаете даммик? Где находится Pivot даммика?
1. Если Pivot объекта Dummy001 находится в центре объекта Dummy001, тогда:
Создаем в центре окружности один объект Dummy (Dummy002) и линкуем к нему объект Dummy001.
В контроллере Float Script создаем переменную на узел Dummy001.
Потом возюкаем объект Dummy002.
Пример. В новой сцене запускаем скрипт:
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
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Alex AndRiEL
Задача, уверен, для ведующих в скрипте - примитивнешая, но меня поставила в тупик, долго прыгал вокруг костей, IK и прочего но понял что именно скрипт решает.
Задача следующая. Имеем два объекта, один Point - статичный, на него будем влиять и постоянно движущийся по окружности Dummy.
Нужно, измеряя расстояние между объектами по Z (только Z, т.к. даммик крутится по окружности, расстояние меняется по двум осям), отслеживать период в котором расстояние это снижается до заданного порога, и если этот порог пройден (нижние положения даммика на окружности), то смещать по Z вниз статичный Point, ровно на столько же, на сколько превышен порог близости между объектами.
Такой себе, эффект отрицательно заряженных магнитов.
В попытках решить самостельно, незнаю верно или неверно дошёл до точки что нужно в Z позишн поинта вставить Expression контроллер, и в нём с правильным синтаксисом описать простой If .. бла бла бла если разница двух осей Z меньше числа "x" - сдвинуть Z позишн поинта на эту разницу.
Сложности именно в синтаксисе, как считывать параметры, как их сравнивать и в DO как задать изменение Z позишн поинта.
Вложения
igorznag
z_min это нужное значение z для поинта в статичном состоянии.
Dummy01 это название объекта Dummy.
Alex AndRiEL
Пробовал и чисто копипастом и объявлять x и z_min в окошко variables.. Point просто никак не реагирует.
Вложения
igorznag
Пример. В новой сцене запускаем скрипт:
Alex AndRiEL
И как раз как надо.
Ладно, разберусь почему у меня лажало.
Спасибо большое!
UPD: Дошло почему не работало. Я ручками возюкал даммик🙂 А через запуск его по сплайну - ОК.
igorznag
Как вы возюкаете даммик? Где находится Pivot даммика?
1. Если Pivot объекта Dummy001 находится в центре объекта Dummy001, тогда:
Создаем в центре окружности один объект Dummy (Dummy002) и линкуем к нему объект Dummy001.
В контроллере Float Script создаем переменную на узел Dummy001.
Потом возюкаем объект Dummy002.
Пример. В новой сцене запускаем скрипт:
2.Если Pivot объекта Dummy001 находится в центре окружности, тогда:
В контроллере Float Script создаем переменную на узел Dummy001.
В контроллере Float Script вместо "$Dummy001.pos.z" используем "$Dummy001.objecttransform.pos.z"
Потом возюкаем объект Dummy001.
Пример. В новой сцене запускаем скрипт: