Render.ru

Object distance

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


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

Вложения

  • 33,3 КБ Просмотров: 309

igorznag

Мастер
Рейтинг
103
#2
нужно в Z позишн поинта вставить Expression контроллер
Используем контроллер Float Script вместо Float Expression.
If .. бла бла бла если разница двух осей Z меньше числа "x" - сдвинуть Z позишн поинта на эту разницу.
Код:
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.
 
Рейтинг
123
#3
Эффекта нету :(
Пробовал и чисто копипастом и объявлять x и z_min в окошко variables.. Point просто никак не реагирует.
 

Вложения

  • 75,1 КБ Просмотров: 331
Последнее редактирование:

igorznag

Мастер
Рейтинг
103
#4
У меня есть эффект.
Пример. В новой сцене запускаем скрипт:
Код:
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()
 
Рейтинг
123
#5
У меня есть эффект.
Пример. В новой сцене запускаем скрипт:
Код:
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()
Блин, точно!
И как раз как надо.
Ладно, разберусь почему у меня лажало.
Спасибо большое!

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

igorznag

Мастер
Рейтинг
103
#6
Дошло почему не работало. Я ручками возюкал даммик
Теперь стало понятнее.
Как вы возюкаете даммик? Где находится 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
 
Сверху