Просмотр полной версии : Движение по эллипсу - программная анимация
_pkiller_
07.02.2006, 03:08
Подскажите пожалуйста формулу движения по эллипсу с затухающей скоростью (см. рисунок). Я представляю решение этой проблемы так - нужно разбить эллипс на параболы и для каждой параболы рассчитать движение объекта (формулу движения по параболе я знаю), думаю что можно по другому, но точно не знаю как.
эллипс имеет очень простую математическую формулу - это общество точек вида n, для которых верно следующее уравнение:
расстояние (n, center1) + расстояние (n, center2) == константа.
где center1 и center2 - точки-центры эллипса
есть формула - рисуем по ней кривую. все оч просто
кстати - как насчет заплатить))
кстати - как насчет заплатить))
Жди.... :D Скажи еще по расценкам твоей фирмы.
Сколько там у вас? $40-60/час?
Конкретно, то формула которую продемонстрировал Король отлично работает. Смотри, здесь ползунок Масштабирования движется по эллипсу
http://rovno.mainmaps.com
на этом форуме в качестве валюты я принимаю мороженое и шоколад
_pkiller_
07.02.2006, 03:54
Злые вы))) А как на счет затухающей скорости в формуле? Не совсем понял про разные точки-центры эллипса
Злые вы))) А как на счет затухающей скорости в формуле? Не совсем понял про разные точки-центры эллипса
Ты в школе учился? Там в курсе физики есть формулы для равнозамедленного движения ( ускорение отрицательное ). Почитай книжку.
_pkiller_
07.02.2006, 03:57
Жди.... :D Скажи еще по расценкам твоей фирмы.
Сколько там у вас? $40-60/час?
Конкретно, то формула которую продемонстрировал Король отлично работает. Смотри, здесь ползунок Масштабирования движется по эллипсу
http://rovno.mainmaps.com
Хорошо если бы я получал хотя бы 30 уе в час))
Просто решил понабраца опыта в программной анимации, параболу освоил, иду дальше)
_pkiller_
07.02.2006, 03:59
Интересно общаться с умными людьми, которые говорят полуответами)) А ползунок там движется по сектору окружности помоему.
_pkiller_
07.02.2006, 04:04
нашел я формулу движения по эллипсоидной окружности
var rad = 200; //больший радиус
var xoff = 300;
var yoff = 100;
var pi = Math.PI;
var inc = pi/50;
var t=0;
var k=0.3;//коэф уменьш меньшего радиуса
_root.onEnterFrame = function() {
ball._x =ballx= (rad*Math.cos(t)) + xoff;
ball._y =bally= (rad*k*Math.sin(t)) + yoff;
t+= inc;
}
подскажите как привязать сюда ускорение, чтоб получилось равнозамедленное движение и повернуть весь путь движения на угол в 45 градусов.
нашел я формулу эллипса типа (x*x)/(a*a) + (y*y)/(b*b)=1, из этой формулы можно вывести нужную мне формулу? и как сюда привязать ускорение и время?
Очевидно, рассчитывая одну координату через другую, постоянно меняя эту "другую". Скорость изменения и "изменения изменения" и есть скорость и ускорение.
_pkiller_
07.02.2006, 10:52
Перерыл пол интернета, нигде не могу найти формулу равнозамедленного движения по эллипсоидной траектории. Кроме вышеупомянутого способа нет ничего. Есть кто знающий, подскажите, плиз.
Nox Noctis
07.02.2006, 11:41
так ли критична для тебя формула?
такое движение, как ты показал, можно сделать вообще без единого синуса или косинуса. :)
вот тут я предлагал решение для движения по окружности:
http://www.flasher.ru/forum/showthread.php?p=493903#post493903
движение по эллипсу - можно сделать абсолютно аналогично: необходимо только у внешнего клипа поменять _xscale и _yscale
а тут движение по окружности с отрисовкой синусоиды:
http://www.flasher.ru/forum/showthread.php?p=496071#post496071
сделано по тому же принципу, с минимумом математики
_pkiller_
07.02.2006, 11:46
Спасибо за информацию, очень все просто и понятно, буду знать. Но мне бы хотелось с равнозамедленным движением и остановкой в некоторой точке на этой окружности (эллипсе) в зависимости от заданных параметров.
_pkiller_
07.02.2006, 11:48
Насколько я понял ты подошел к проблеме с другой стороны, ты просто сместил центр вращения объекта, и при вращении получается, что он движется по кругу, оригинально, а главное просто, еще раз сенкс за идею. Но очень хочется равнозамедленное))
Nox Noctis
07.02.2006, 12:49
Насколько я понял ты подошел к проблеме с другой стороны, ты просто сместил центр вращения объекта, и при вращении получается, что он движется по кругуименно так. это флэш, почему бы не пользоваться его спецификой. :)
Но очень хочется равнозамедленное))
ээ... так что мешает-то?
в моем варианте всего один параметр, влияющий на скорость движения - это приращение _rotation. у меня это приращение - константа. а тебе нужно его менять с какой-то заданной величины до нуля. скорость уменьшения зависит от того, на какой угол нужно успеть повернуть объект. сам не сосчитаешь, что нужно дописать? :)
_pkiller_
08.02.2006, 03:07
Спасибо большое за развернутый ответ, как дописать - тут вопросов нет)) Сенкс)
_pkiller_
08.02.2006, 04:24
Сделал. получилось, но остался один вопрос, когда помещаешь мувик -объект с движением, на сцену делаешь ему _yscale=40; то объект тоже сжимается, пытаюсь внутри мувика с движением изначально увеличить _yscale на ту же величину, ничего не проходит, все равно искаженный объект получается. Очень хорошо видно, если объект шар.
_pkiller_
08.02.2006, 05:17
А так хотелось увидеть формулу с синусами)) Видно не судьба)
_pkiller_
08.02.2006, 07:18
Вот что в конечном счете получилось. Тока не пойму. почему объект не останавливается в конце пути а возвращается обратно, в точку отбытия.
Он должен остановиться приблизительно в точке, где a=2, так во и поставь это уловие if (a>2). В противном случае надо удалять сам onEnterFrame, т.е. delete _root.onEnterFrame.
_pkiller_
08.02.2006, 11:04
Этот способ я пробывал. тока как то не правильно подучается, а хочется красивого кода))
Nox Noctis
08.02.2006, 14:23
Сделал. получилось, но остался один вопрос, когда помещаешь мувик -объект с движением, на сцену делаешь ему _yscale=40; то объект тоже сжимаетсяесли внешний сжал - внутренний нужно растянуть, чтобы он остался таким, как прежде. логично? :)
если у внешнего масштаб _yscale=40, то у внутреннего должен быть масштаб _yscale=(100/40)*100. обычное правило пропорции. :)
в более общем виде, получается:
outer._xscale = ...;
outer._yscale = ...;
outer.inner._xscale = 100/outer._xscale*100;
outer.inner._yscale = 100/outer._yscale*100;
вот то, что у тебя должно было получиться.
обрати внимание, если выкинуть код рисования, управляющего кода остается совсем мало, и этот код абсолютно прост.
var radius_big = 200; // большой радиус
var radius_small = 50; // малый радиус
var speed = 10; // скорость вращения
var start_angle = 45; // угол поворота оси эллипса
//
this.createEmptyMovieClip("outer", 0);
outer.createEmptyMovieClip("inner", 0);
var plotter = outer.inner.createEmptyMovieClip("plotter", 0);
plotter.lineStyle(1, 0, 100);
plotter.moveTo(-5, -5);
plotter.lineTo(5, -5);
plotter.lineTo(5, 5);
plotter.lineTo(-5, 5);
plotter.lineTo(-5, -5);
//
outer._rotation = start_angle; // поворот оси эллипса
// масштабирование (чтобы получился малый радиус)
outer._yscale = radius_small/radius_big*100;
plotter._x = radius_big; // большой радиус
// масштабирование (чтобы вращающийся объект не исказился)
plotter._yscale = 100/outer._yscale*100;
outer.inner.speed = speed;
//
outer.inner.onEnterFrame = function()
{
this._rotation += this.speed;
this.plotter._rotation = -this._rotation;
};
_pkiller_
08.02.2006, 15:02
Наиогромнейший респект Nox Noctis,))) я так понял кроме тебя мало кто профисионально помогает начинающим. Большой сенкс тебе, о флэш-гуру нашего общего дела))
Nox Noctis
08.02.2006, 15:08
замедление и остановку сам допишешь к этому коду? :)
_pkiller_
09.02.2006, 02:49
конечно, я уже сделал до этого)) здесь аналогично, надо просто уменьшать величину speed и все дела)) сенкс)
_pkiller_
09.02.2006, 04:06
насколько я понял, создается три мувика, самый внешний для образования эллипса, внутри него для вращенияи последний самый глубокий для предотвращения искажения и собственно сам объект в нем. Сделал все аналогично, придал торможение и остановку. Вот что получилось (см. файл).
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.