Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Моделирование физики твердых тел

Страницы: 1 2 След.
Моделирование физики твердых тел
Стоит такая задача, в 2D реализовать физику круглого объекта - мячика, и линий. линии-статические препятствия.
Без всяких физических движков, интересен сам алгоритм, на любом языке. http://gd.isadateam.com/physics_delphi.php - вот здесь есть что-то, но там нет круглых объектов и линий, и слишком сложно для расчетов - предполагается, что это будет запускаться на телефоне, а там процессор слабенький.
Угол падения равен углу отражения. С математикой я не очень, может поможите формулами smile:)
Изменено: rozpants - 11.09.2010 14:18:29
В институте писала прогу на С++, где мячик прыгал в квадратике. Вроде выбирали место откуда он начинает падать и запускали. Там высчитывался кажется угол. В принципе правильно угол падения равен углу отражения, но там еще зависит и от скорости мячика кажись. Задачка интересная. Посмотрю на дисках, может осталась где-то.
Изменено: Ольга Кабушева - 12.09.2010 01:15:27
в квадртике там ничего сложного нет, на мяч действует гравитация, а при соприкосновении со сторонами квадрата просто меняется знак вертикальной либо горизонтальной скорости.

Код
x,y:real; {координаты тела}
vx,vy:real;  {горизонтальная и вертикальная скорости}
g:real;  { ускорение свободного падения}
left,top,right,bottom:integer; { стороны квадрата }

procedure process; { процедура для обновления координат, выполняется периодически}
begin
   vy:=vy + g;
   x:= x + vx;
   y:= y + vy;
   if (x<left) or (x>right) then vx:=-vx;
   if (y<top) or (y>bottom) then vy:=-vy;
end;


Но мне надо чтоб он от линий отскакивал, а линии могут быть не только под прямым углом, под произвольным.
Изменено: rozpants - 12.09.2010 08:06:41
И как он может отскакивать на прежнее расстояние? Там уже нужно уменьшать высоту.
Надо высчитывать не только угол, но и скорость после удара. Она будет зависеть от угла падения, скорости падения. А после того как высчитаем скорость и угол уже можно будет и высоту высчитывать, а точнее расстояние. Честно посмотрю прогу. У меня в итоге мячик останавливался. Оттуда можно будет и плясать. rozpants, а линии каждый раз поворачиваются что ли? Или что вообще из себя будет представлять прога-то?
Ну просто, есть прямоугольная область, в ней могут быть расположены препятствия в виде произвольных линий, и мячик не должен проходить через них, а должен отскакивать. Линии - статические.

Цитата
mihail filatov пишет:
И как он может отскакивать на прежнее расстояние? Там уже нужно уменьшать высоту.

Ну можно домножать скорость на коэффициент 0.99 smile:)
Изменено: rozpants - 13.09.2010 14:09:37
Цитата
rozpants пишет:
Цитата
mihail filatov пишет:

И как он может отскакивать на прежнее расстояние? Там уже нужно уменьшать высоту.


Ну можно домножать скорость на коэффициент 0.99

Так в том и дело, что нужно найти этот коэффициент. Причем, если мячик удариться о верхнее препятствии, то не просто поменять знак, а немного увеличить ее нужно. Или я не права?
она увеличится под действием гравитации
тут надо подойти к вопросу с чисто физико-математической стороны =)

что у нас есть, вектор скорости, допустим... каждый цикл проверяем на пересечение со всеми линиями, это я думаю легко...
если есть контакт, то
... ничего в голову не приходит...
Изменено: rozpants - 13.09.2010 23:37:23
Я позже поищу формулы. Тут практический все физика. Импульс, сила притяжения и т.д.
Так. Нашел чему равна скорость после удара о поверхность с нормалью n
v2 = v1 - 2 * n * ( n * v1 )
n * v1 - скалярное произведение векторов, вектор n должен быть нормализован.
Разъесни все. А то многие не поймут.
Я еще сам не понял =). n-это нормаль поверхности, т.е. вектор перпендикулярный поверхности, направленный в ту сторону в которую врезается мячик. v1 - это вектор скорости до удара, v2 - после. скалярное произведение, это v1*v2 = vector(v1.x*v2.x, v1.y*v2.y);
n - Нормализован, значит длина этого вектора равна 1
Но здесь не учитывается то что скорось должна уменьшаться.
просто отражение от поверхности.
А еще надо найти пересечение окружности с линиями.

Вот еще пару функций нашел:)
Код
bool colLineCircle(vec2& x1, vec2& x2, vec2& center, float radius, vec2* normal, float* depth)
{
  vec2 c = closestPointOnLine(x1, x2, center);
  vec2 v = center-c;
  float len = length(v);
  if ( len>radius ) return false;
  if ( depth != NULL && normal != NULL )
  {
    *depth = radius - len;
    *normal = normalize(v);
  }
  return true;
}


vec2 closestPointOnLine(vec2& vA, vec2& vB, vec2& vPoint)
{
  vec2 vVector1 = vPoint - vA;
  vec2 vVector2 = normalize(vB - vA);
  double d = length(vA - vB);
  double t = dot(vVector2, vVector1);

  if (t <= 0.0f) return vA;
  if (t >= d   ) return vB;
   
  vec2 vVector3 = vVector2 * t;
  vec2 vClosestPoint = vA + vVector3;

  return vClosestPoint;
}
Изменено: rozpants - 15.09.2010 12:09:20
Притяжение g надо учитывать. Это надо во всех формулах добавлять.
Цитата
mihail filatov пишет:
Притяжение g надо учитывать. Это надо во всех формулах добавлять.

о_О

Нет, в каждом цикле шару к его вектору скорости будет прибавляться вектор гравитации.
а еще в каждом цикле скорость будет умножаться на какой-нибудь коэффициент меньший 1, например 0.99 чтобы скорость постепенно уменьшалась.
Изменено: rozpants - 15.09.2010 20:50:08
Такc, помогите портировать эти функции на Delphi =)А тот тут ссылки да указатели, я боюсь запутаться.
могу предложить следующее
if form1.Shape1.Top+form1.Shape1.Height+dx>=form1.Shape2.Top then
begin
dx:=dx*(-1);
form1.Shape1.Top:=form1.Shape2.Top-form1.Shape1.Height
end;
dx:=dx+1;
form1.Shape1.Top:=form1.Shape1.Top+dx;
это как бы старт, аналогично для оси у, при потребности можно переписать условие, и будет относительно не объекта, а к примеру черного цвета на рисунке.
не, не катит)

Если б шар двигался только по одной координате, по Х, то проканало бы, А если делать по двум координатам Х и У, то получится неправдоподобно
Изменено: rozpants - 17.10.2010 19:53:26
да кстати, виноват, по у нужно прописать, что бы в нужный нас момент dy:=dy*(-1)*sin(z) где z - угол наклона плоскости
Изменено: Дмитрий Сергиенко - 19.10.2010 16:59:29
Не все так просто...
Это ток в 2D, а если бы было в 3D, то вообще геморой.
А если в 4Д сделать, вот было бы круто!=)
Цитата
rozpants пишет:
А если в 4Д сделать, вот было бы круто!=)

Это как?
ну также как в 2д или 3д только в 4хмерном пространстве. Когда мы играем в 3д игры, то по сути наблюдаем проекцию трехмерного мира на 2хмерну плоскость экрана, но можно 4хмерное пространство проецировать в трехмерное, а потом уже это трехмерное в двухмерное, и ... практического применения никакого за исключением, возможно, интересных графических эффектов )
Что-то про 4Д не очень понятно.
Видимо результат можно будет увидеть, только перемещая трёхмерное пространство, на которое будем проецировать, в четырёхмерном пространстве. А математически это будет означать изменение пропорций объекта в трёхмерном пространстве.
Да это очень трудно понять, наверное невозможно) , а есть еще и 11х мерные пространства в математике...
Страницы: 1 2 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)