Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / равномерное движение по эллипсу

равномерное движение по эллипсу

Поделиться

Страницы: 1 2 Следующая

game_casual_Постоялецwww5 июля 200717:17#0
Всем привет! Мне срочно нужна формула равномерного движения спрайта по эллипсу! У кого есть какой либо материал? помогите! Буду рад любому совету!

Правка: 5 июля 2007 17:39

_WinnieПостоялецwww5 июля 200718:25#1
Я бы записал эллипс параметрической формулой (A*cos(phi), B*sin(phi)),
Встаёт вопрос, как изменять phi на данном апдейте delta_time, что бы движение было равномерным. Я бы увеличивал бы phi небольшими порцями, пока длина ломаной не станет равной (скорость * delta_time). Так как порции небольшие, то длина ломаной будет соответствовать длине кривой элипса (а небольшую неточность человеческий глаз не заметит). 
game_casual_Постоялецwww5 июля 200718:34#2
_Winnie

Как раз небольшими порциями, т.е. скорость - ОЧЕНЬ И ОЧЕНЬ ЗАМЕНТА на глаз!

_WinnieПостоялецwww5 июля 200719:01#3
sensey_alex
Я про превращение непрерывного в дискретное, кривой - в ломаную, и то, что если разбить delta_time на очень небольшие кусочки, то будет незаметна дискретность.

HybernaculumПостоялецwww6 июля 20076:13#4
Можно взять интеграл по кривой эллипса, от phi0 до phi1, затем зная длину по кривой и phi0, выразить phi1 - это и будет
искомый угол для формулы (A*cos(phi), B*sin(phi)). Если phi0 можно принять равной нулю, и "скакать" всегда от некоторого нуля, то останется только в цикле рендера увеличивать путь по кривой на dT * speed, где speed - скорость равномерного движения чтобы посчитать phi1.

Правка: 6 июля 2007 6:50

KpeHDeJIbУчастникwww6 июля 200710:25#5
А ну как бы в одних местах тогда на глаз будет заметно что точка по эллипсу движется быстрее, я так думаю.
Например если взять сильно вытянутый по оси Ox эллипс то например движение из угла 0º в угол скажем 10º,
не то же самое, что из угла 80º в угол 90º (если угол относительно все той же оси Ox)...
А как сделать равномерно я хз :) Думать надо а я не спал два дня, посплю пойду потом подумаю <(^_^)>

Правка: 6 июля 2007 10:26

Sbtrn. DevilПостоялецwww6 июля 200711:51#6
Непросвещённому мне кажется, что тут можно поступить просто:
1) Найти вектор, касательный к эллипсу в данной точке. (d(x(t)/dt,d(y(t))/dt).
2) Нормализовать. :)

Возможно, это неправильно. Тогда можно попытаться поступить по-другому и честно, т. е., решить функциональное уравнение относительно phi (t):

(d (A*cos (phi (t)) )/dt)^2 + (d (B*sin (phi (t)) )/dt)^2 = V^2

(update)

Не, функциональное уравнение - слишком круто. :)
Можно попробовать по-другому. Допустим, точка движется по закону x(t), y(t). Тогда:
а) x(t), y(t) будут лежать на эллипсе, т. е., (x(t)/A)^2+(y(t)/B)^2=1;
б) x'(t)^2 + y'(t)^2 = V^2 (скорость равномерная).
в) ну и какие-нибудь начальные условия, типа y(0)=0, x(0)=A.

Отсюда система (в нотации мапла):

{ (x(t)/A)^2+(y(t)/B)^2=1, diff (x(t),t)^2+diff (y(t),t)^2=V^2, y(0)=0, x(0)=A }

Решать без маткада или мапла, очевидно, не стОит даже пытаться. :)

Мапл выдает мне довольно-таки ужасное решение, цитировать которое здесь не решаюсь. Но основная его идея - x(t)=корень уравнения f(t,_Z), где f(t,_Z) включает интеграл от 0 до _Z. Иными словами, похоже, по мнению мапла задачка не имеет решения в аналитической форме. :|

Правка: 6 июля 2007 12:24

NikopolМодераторwww6 июля 200712:40#7
Математически точно эту задачу не решить,
т.к. для этого надо взять эллиптический интеграл.
А он неберущийся.

Так что придётся решать численными методами.

game_casual_Постоялецwww6 июля 200713:46#9
Nikopol

Блин, а попроще решить эту задачу можно?

game_casual_Постоялецwww6 июля 200713:50#10
Счроно нужно решение!!!!!!!!!!!!!!!!!!!!!! помогите ! Просьба писать попроще и ясно!
_WinnieПостоялецwww6 июля 200714:16#11

Ещё способ, более простой для записи в коде, без аппроксимации кривой ломаной (он менее универсален, так как требует знания аналитической производной).

Пусть у нас есть кривая F(phi(t)), для эллипса F(phi) - это (A*cos(phi), B*sin(phi))
Мы хотим менять phi(t) так, что бы скорость движения по кривой F(phi(t)) оставалась постоянной, V.
Скорость движения по кривой - это модуль вектора производной, то есть |F'(phi(t))|* phi'(t) = V
Таким образом, уравнение на функцию phi -

phi'(t) = V / |F'(phi(t))|

Вспомнив, что такое производная функции -

phi(t + dt) = phi(t) + phi'(t) * dt 

И то что в нашем случае F(phi) ==  (A*cos(phi), B*sin(phi)) и значит |F'(phi)| это sqrt(A2*sin2(phi) + B2*cos2(phi))

записываем код:

float phi = 0;

while (true)
{
  float delta_phi = V / sqrt(A2*sin2(phi) + B2*cos2(phi)) * delta_time;
  phi += delta_phi;
  поставить черепашку в положение (A*cos(phi), B*sin(phi));
}


Если написал непонятно, извиняюсь, но объяснять популярно в форуме что такое производная (вкратце и некорректно - f(t + dt) = f(t) + f'(t) * dt при малых dt) и что такое скорость (вкратце - производная положения), и что такое векторная математика, и как сделать фискированный небольшой dt - нет времени.

Правка: 6 июля 2007 14:23

DreamRunnerПостоялецwww6 июля 200715:22#12
Вот ещё метод:
1. прибавляем угол A (или ещё чтото)
2. вычисляем точку на периметре (думаю проблем нет)
3. двигаемся к этой точке с постоянной скоростью (главная фишка!)
4. при достижении этой точки переходим к п.1
game_casual_Постоялецwww6 июля 200715:22#13
_Winnie


помоему эллипс движется сильно быстро, там где он сплющен и соотвественно медленно, там где он растянут!!!

game_casual_Постоялецwww6 июля 200715:24#14
DreamRunner

Вот именно там где главная фишка и ничего не понятно!!! Что ты понимаешь под постоянной скоростью?

Страницы: 1 2 Следующая

/ Форум / Программирование игр / Физика

2001—2014 © GameDev.ru — Разработка игр