こんにちは私は最近、球技をすることを試みられ、これに対する解決策を見つけました。だから私がやったこと:私たちがゲームをプレイしている間、パドルは動いています。私の座標系はそのままで、キャンバスの左上の点は0,0です。パドルはこの座標系で動いています。x軸は0からキャンバスの幅までを指し、y軸は0からキャンバスの高さを指します。幅100、高さ20の固定サイズのパドルを作成しました。そして、その周りに想像上の円を描きます。ボールがパドルに当たると、パドルのセンターポイントを計算します
double paddleCenter=Squash.paddle.getXpos()+Squash.paddle.getPaddleWidth()/2;
次に、ボールの現在位置から中心を減算します。これにより、座標系はパドルの中心になります。ballCenterは、ボールがパドルに当たる点です(-(paddlewidth + r).. 0 ..(paddlewidth + r ))これは、パドルのヒッティングポイントを再スケーリングする以外の何物でもありません
double x0 = ballCenterX-paddleCenter;
ボールの打点(x0)を使用して円の交点を計算します。これは再計算です。x0の既知の座標を持つ円のy座標を求め、y軸の反転が必要でした。
double y0 = -Math.sqrt(paddleRadius*paddleRadius-x0*x0);
半径がpaddleRadius f(x、y)= x ^ 2 + y ^ 2-r ^ 2であるパドルの周りで定義される円の正規方程式の微分を計算する
double normalX=2*x0;
double normalY=2*y0;
Nベクトルを正規化し、表面法線の単位ベクトルを取得します
double normalizer=Math.sqrt(normalX*normalX + normalY*normalY);
normalX=normalX/normalizer;
normalY=normalY/normalizer;
これで、パドルの正規化された(ユニット)サーフェス法線ができました。これらの表面法線を使用して新しい方向を計算します。これは、反射ベクトル公式new_direction = old_direction-2 * dot(N、old_direction)* Nを使用して計算されますが、代わりに常に法線が上向きの場合、法線はボールがパドルを打つポイントからポイントに変化している
double eta=2; //this is the constant which gives now perfect reflection but with different normal vectors, for now this set to 2, to give perfect reflection
double dotprod=vX*normalX+vY*normalY;
vX=vX-eta*dotprod*normalX;//compute the reflection and get the new direction on the x direction
vY=-vY;//y direction is remain the same (but inverted), as we just want to have a change in the x direction
この問題に対する解決策を公開しました。詳細とゲーム全体については、私のgithubリポジトリをご覧ください:
https://github.com/zoli333/BricksGame
EclipseでJavaで書かれています。Ball.javaにコメントアウトされた別のソリューションがあります。再スケーリングは行われず、座標座標系をパドルの中心点に移動せず、代わりに上記のすべてを左上の0,0座標系から計算しますパドルの中心点。これも機能します。