Render.ru

AEScript - как сделать отражение после удара о стенку ?

_shpion_

Пользователь сайта
Рейтинг
2
#1
Приветствую !
Такая проблема:
нужно сделать эффект бильярда, т.е. шар ударяется о "стенку", и после удара надо чтобы угол подения был равен углу отражения.
Нашел такой скрипт:
segDur = .9;// duration of each "segment" of random motion
minVal = [0.1*thisComp.width, 0.1*thisComp.height];
maxVal = [0.9*thisComp.width, 0.9*thisComp.height];

seed = Math.floor(time/segDur);
segStart = seed*segDur;
seedRandom(seed,true);
startVal = random(minVal,maxVal);
seedRandom(seed+1,true);
endVal = random(minVal,maxVal);
ease(time,segStart,segStart + segDur, startVal, endVal);

Но тут следующая позиция задается случайным образом.
Помогите плиз приделать к нему синусы и косинусы.
спасибо.
 

monter

Знаток
Рейтинг
35
#2
В программировании игр используют не математику(Sin и Cos они долго просчитываются), а изменение прирфщения на противоположный знак при достижении какого-либо условия(напрмер границы экрана), типа:

deltaX=1;
deltaY=1;

Начало цикла;
positionX=positionX+deltaX;
positionY=positionY+deltaX;
if (positionX == 720) {deltaX = -1;}
if (positionY == 576) {deltaY = -1;}
if (positionX == 0) {deltaX = 1;}
if (positionY == 0) {deltaY = 1;}
Конец цикла;
 

_shpion_

Пользователь сайта
Рейтинг
2
#3
Переписал, вот что получилось:

segDur = 5;
minX=0.1*thisComp.width
minY=0.1*thisComp.height
maxX=0.9*thisComp.width
maxY=0.9*thisComp.height
posX=300;
posY=200;
deltaX=50;
deltaY=60;

seed = Math.floor(time/segDur);
segStart = seed*segDur;

startVal = [posX, posY];
posXnew = posX+deltaX;
posYnew = posY+deltaY;
if (posXnew > maxX) deltaX = -deltaX;
if (posYnew > maxY) deltaY = -deltaY;
if (posXnew < minX) deltaX = -deltaX;
if (posYnew < minY) deltaY = -deltaY;
endVal = [posXnew, posYnew]

ease(time,segStart,segStart + segDur, startVal, endVal);
---
но проблема в том что постоянно происходит инициализация двух переменных (posX=300;posY=200; ), т.е. движение получается зацикленным (в течение seed движение от [posX;posY] к [posXnew;posYnew].
Нужно менять алгоритм/движок, я плохо разбираюсь в функциях, поэтому не понимаю, как в первом посте получается движение от А к В к С, причем каждая точка/координата генерится рандомом %-(
---
прошу помощи
 

serko

Активный участник
Рейтинг
15
#4
Я смотрю, Вы такие темы мутите. Примитив я умею, типа минуса поставить на вращение и т.п.
 
#6
может немножко через задницу:))
в АЕ старых версий была папка MMScript, а в ней, в частности, gravity.mm (это для загрузки Motion Math).
Не знаю, писать его тут или сами найдете?
Одним словом, если в нем сделать
damping = 1
grav = 0
то , вроде, все работает так как требуется.
(вначале перед запуском скрипта нужно поставить два ключа позишн, задающих начальную скорость)
 

_shpion_

Пользователь сайта
Рейтинг
2
#7
mazzza, спасибо, Друг
выручил
лежит в \Scripts
вибираешь рамку;
Drag, Gravity = 0
Elasticity, Density = 1
2 точки, как ты и сказал, причем скорость зависит от соотношения растояния по XY к времени и ЗАРАБОТАЛО !
СПАСИБО !!!
 

monter

Знаток
Рейтинг
35
#8
Привет mazzza! опять тебебе паркет паменяли!У тебя как всегда самый точный ответ :)
2: _shpion_ это ОнА
 

_shpion_

Пользователь сайта
Рейтинг
2
#9
Прошу прощения
не хотел обидеть, просто чувства переполняют
оч круто
еще раз спасибо
тем более приятно получить ответ от девушки
 
Сверху