вы на самом деле не делаете отражение ... чтобы отразить по большой оси, вы должны отменить соответствующую координату вектора скорости (и исправить положение). Я не вижу такого поведения в вашем коде.Вместо этого ваша скорость y не имеет знака независимо от направления вверх / вниз, поэтому вы просто добавляете гравитацию в соответствии с ней ... для исправления либо переписываете код, либо добавляете yreflection
в свой код, связанный с гравитацией ... также вы получили тета?Я ожидал бы, что угол только при первой стрельбе
см.
Вот небольшой пример C ++ с воздушным трением:
//---------------------------------------------------------------------------
double pos[2],vel[2],acc[3],r; // ball
double x0,y0,x1,y1; // walls
//---------------------------------------------------------------------------
void ball_update(double dt)
{
int i;
double v,k=0.0001,g=9.81;
dt*=10.0; // time multiplier for simulation speed ...
// compute driving force/acceleration
v=sqrt((vel[0]*vel[0])+(vel[1]*vel[1])); // |vel|
acc[0]= -(k*vel[0]*v); // gravity + air friction (k*vel^2)
acc[1]=+g-(k*vel[1]*v);
// Newton/D'Alembert simulation
for (i=0;i<2;i++) vel[i]+=acc[i]*dt;
for (i=0;i<2;i++) pos[i]+=vel[i]*dt;
// colision/reflect
if (pos[0]<x0+r){ pos[0]=x0+r; vel[0]=-vel[0]; }
if (pos[0]>x1-r){ pos[0]=x1-r; vel[0]=-vel[0]; }
if (pos[1]<y0+r){ pos[1]=y0+r; vel[1]=-vel[1]; }
if (pos[1]>y1-r){ pos[1]=y1-r; vel[1]=-vel[1]; }
}
//---------------------------------------------------------------------------
void ball_init()
{
Randomize();
pos[0]=0.5*(x0+x1);
pos[1]=0.5*(y0+y1);
double a=2.0*M_PI*Random(),v=50.0;
vel[0]=v*cos(a);
vel[1]=v*sin(a);
r=20.0;
}
//---------------------------------------------------------------------------
Моя система координат (0,0) - это верхний левый угол, и x указывают вправо, а y указывает вниз ... Чтобы использовать это простоинициализируем стены x0,y0,x1,y1
, вызываем ball_init()
, а затем в некотором таймере вызываем ball_update(dt)
и визуализируем шарик на pos
и радиусе r
...
Вот как это выглядит:
![preview](https://i.stack.imgur.com/sP7ba.gif)
PS. Вам необходимо настроить такие параметры, как время дельты dt
, ускорения или добавить масштаб в пикселях в соответствии с вашими потребностями... Вам нужно, чтобы все устройства были совместимы ... Я рекомендую использовать SI (м, м / с, м / с ^ 2, с, N, ..), поэтому вам также нужно решить, насколько великав пикселях (в метрах)