Доброго времени суток
Обладая обычными для среднестатистического человека, знаниями физики, но не плохим навыком программирования, решил написать физический движок.
Первый этап данного проекта - моделирование силы притяжения объектов, так скажем в космосе..
объекты пока обладают только массой, координатами, направлением и скоростью..
Понятно, что сила притяжения двух объектов друг к другу равна произведению их массы на постоянную G и деленное на квадрат расстояния между ними.
из второго закона ньютона получаем, что ускорение равно отношению скорости на время.
И, казалось бы что есть ответы на все вопросы, но..
верно ли я понимаю:
1) вектор направления двух притягивающихся объектов нужно нормализовывать?
2) вектор направления до другого тела нужно складывать с текущим вектором направления, или вектор направления не должен меняться, а только модифицироваться координаты.
В общем вопросов больше но нужно хотя бы знать ответы на эти для начала
п.с. код функции, рассчитывающий следующие координаты для объектов, на которые пока действует толька сила притяжения
Код:
procedure TWorld.NextTime(Time:Double);
var
i1,i2:cardinal;
U,R2,L:Double;
V:TCoordinates;
begin
if(Length(Bodies)=0)then
exit;
for i1:=0 to Length(Bodies)-2 do
for i2:=i1+1 to Length(Bodies)-1 do
begin
R2:=GetDistance2(Bodies[i1].Coordinates,Bodies[i2].Coordinates);
U:=(Bodies[i2].Mass/R2)*G*Time;
with V do
begin
X:=Bodies[i2].Coordinates.X-Bodies[i1].Coordinates.X;
Y:=Bodies[i2].Coordinates.Y-Bodies[i1].Coordinates.Y;
Z:=Bodies[i2].Coordinates.Z-Bodies[i1].Coordinates.Z;
L:=sqrt(X*X+Y*Y+Z*Z);
X:=(X/L)*U;
Y:=(Y/L)*U;
Z:=(Z/L)*U;
end;
with Bodies[i1].Coordinates do
begin
X:=X+V.X;
Y:=Y+V.Y;
Z:=Z+V.Z;
{L:=sqrt(X*X+Y*Y+Z*Z);
X:=X/L;
Y:=Y/L;
Z:=Z/L};
end;
V.X:=-V.X;
V.Y:=-V.Y;
V.Z:=-V.Z;
with Bodies[i2].Coordinates do
begin
X:=X+V.X;
Y:=Y+V.Y;
Z:=Z+V.Z;
end;
end;
for i1:=0 to Length(Bodies)-1 do
with Bodies[i1] do
begin
Coordinates.X:=Coordinates.X+Route.X*Speed*Time;
Coordinates.Y:=Coordinates.Y+Route.Y*Speed*Time;
Coordinates.Z:=Coordinates.Z+Route.Z*Speed*Time;
end;
end;
мне действительно нужна помощь, если не понятен мой вопрос, напишите, постараюсь переформулировать или пояснить