- Рейтинг
- 51
Привет всем. Я хочу сделать своеобразный Nose Gate для автоматической чистки ключей анимации взятой с Camera Tracker.
Я сделал видеосъемку и отследил на ней тракером движущуюся точку. Точка в кадре то двигается, то не двигается. В те моменты когда она не двигается тракер все равно отслеживает хоть минимальное но движение. После этого я присвоил данные тракера к Dummy. И в тех местах, где Dummy статичен, он все равно слегка перемещается. С помощью этого скрипта я хочу отследить каждый участок такого статичного дрожания Dummy и кадрам этого участка назначить позицию начального кадра этого участка. Проще говоря я хочу устранить все незначительные колебания Dummy.
for i=1 to 100 do
-- Запускаем цикл на 100 кадров. Он будет обрабатывать
-- каждый кадр используя следующий цикл [k]
-- Этот цикл нужен для того, чтобы при обнаружении
-- дрожащего участка переменная var не менялась
-- в его рамках, а ее значение будет присвоено всем кадрам этого участка.
(var=$dummy*.position
-- В начале первого цикла присваиваем переменной var
-- положение Dummy в текущем (начальном) кадре.
-- После выполнения цикла [k] выполняется следующий
-- виток цикла в котором переменной var
-- присваивается новое значение.
for k=i to k+=1 do(
-- Этот цикл [k] сравнивает значение текущего кадра, со
-- значением следующего кадра и при соответствии
-- условиям производит замену значения текущего кадра на первичное
-- значение данного участка (значение переменной var).
if (at time k+1 $dummy*.position)>var+1 or
(at time k+1 $dummy*.position)<var+1 do
(at time k $dummy*.position)=var
-- Если позиция в текущем кадре отличается от позиции в следующем кадре меньше
-- чем на 1 (это значение условно. Оно означает величину дрожания)
-- то текущему кадру присваивается значение переменной
-- var, то есть начальному значению этого участка.
i=k
-- А переменной i (для цикла ) присваивается текущее значение k
-- (цикла [k]), для того чтобы цикл продолжился
-- не со следующего кадра а с кадра следующего после участка
-- дрожания (обработанного циклом [k]).
else continue)
-- Иначе, если позиция в текущем кадре отличается от следующего
-- больше чем на 1 (значит пошла какая-то анимация)
-- и подолжается цикл .
)
Короче все это дело имеет примерно такой вид:
for b in $* where classof b == dummy do(
for i=1 to 100 do
(var=b.position
for k=i to k+=1 do(
if (at time k+1 b.position)>var+1 or
(at time k+1 b.position)<var+1 do
(at time k b.position)=var
i=k
else continue
)
else continue
)
else continue
)
else exit
Вобщем вся эта голематья не работает конечно, потому, что я безгоду неделя изучаю MaxScript, и еще не знаю синтаксис. Так что пожалуйста не смейтесь если я нагородил охинею, а помогите написать это правильно.
зы: знаю, что Савин Денис не любит когда много текста, но извените по-проще не получилось
Я сделал видеосъемку и отследил на ней тракером движущуюся точку. Точка в кадре то двигается, то не двигается. В те моменты когда она не двигается тракер все равно отслеживает хоть минимальное но движение. После этого я присвоил данные тракера к Dummy. И в тех местах, где Dummy статичен, он все равно слегка перемещается. С помощью этого скрипта я хочу отследить каждый участок такого статичного дрожания Dummy и кадрам этого участка назначить позицию начального кадра этого участка. Проще говоря я хочу устранить все незначительные колебания Dummy.
for i=1 to 100 do
-- Запускаем цикл на 100 кадров. Он будет обрабатывать
-- каждый кадр используя следующий цикл [k]
-- Этот цикл нужен для того, чтобы при обнаружении
-- дрожащего участка переменная var не менялась
-- в его рамках, а ее значение будет присвоено всем кадрам этого участка.
(var=$dummy*.position
-- В начале первого цикла присваиваем переменной var
-- положение Dummy в текущем (начальном) кадре.
-- После выполнения цикла [k] выполняется следующий
-- виток цикла в котором переменной var
-- присваивается новое значение.
for k=i to k+=1 do(
-- Этот цикл [k] сравнивает значение текущего кадра, со
-- значением следующего кадра и при соответствии
-- условиям производит замену значения текущего кадра на первичное
-- значение данного участка (значение переменной var).
if (at time k+1 $dummy*.position)>var+1 or
(at time k+1 $dummy*.position)<var+1 do
(at time k $dummy*.position)=var
-- Если позиция в текущем кадре отличается от позиции в следующем кадре меньше
-- чем на 1 (это значение условно. Оно означает величину дрожания)
-- то текущему кадру присваивается значение переменной
-- var, то есть начальному значению этого участка.
i=k
-- А переменной i (для цикла ) присваивается текущее значение k
-- (цикла [k]), для того чтобы цикл продолжился
-- не со следующего кадра а с кадра следующего после участка
-- дрожания (обработанного циклом [k]).
else continue)
-- Иначе, если позиция в текущем кадре отличается от следующего
-- больше чем на 1 (значит пошла какая-то анимация)
-- и подолжается цикл .
)
Короче все это дело имеет примерно такой вид:
for b in $* where classof b == dummy do(
for i=1 to 100 do
(var=b.position
for k=i to k+=1 do(
if (at time k+1 b.position)>var+1 or
(at time k+1 b.position)<var+1 do
(at time k b.position)=var
i=k
else continue
)
else continue
)
else continue
)
else exit
Вобщем вся эта голематья не работает конечно, потому, что я безгоду неделя изучаю MaxScript, и еще не знаю синтаксис. Так что пожалуйста не смейтесь если я нагородил охинею, а помогите написать это правильно.
зы: знаю, что Савин Денис не любит когда много текста, но извените по-проще не получилось