4

私は現在、ブレイクアウトのようなゲームを書いている最中ですが、どうすればボールを表面から適切に跳ね返すことができるのだろうと思っていました。

私は速度を90度回転させる素朴な方法を採用しました。それは次のとおりです。

[vx, vy] -> [-vy, vx]

これは(当然のことながら)あまりうまく機能しませんでした。ボールの位置と速度、およびボールが当たるポイント(ただし、代わりに跳ね返るポイント)がわかっている場合、そのポイントからボールを​​跳ね返すにはどうすればよいですか?

制約:

  • 私は整数数学を使用しています(どこにもFPはありません)
  • 私のすべての表面は単純な平らな表面です(垂直、水平、またはブロック)
  • 90度の角度で跳ね返りたいだけです
  • すべての衝突は純粋に弾力性があります(これはブレイクアウトです-摩擦などの必要はありません)

言語固有のコードは必要ありません。誰かがこれを適切に行う方法についての小さな数式を提供できれば、それは私にとってうまくいくでしょう。

ありがとう!

4

7 に答える 7

5

垂直面または水平面のいずれかで跳ね返るだけであると仮定すると、それぞれX方向またはY方向の速度を無効にすることができます。

したがって、[vx、vy]があり、それが垂直壁で跳ね返る場合は、[-vx、vy]になります。

[vx、vy]があり、それが水平の壁で跳ね返る場合は、[vx、-vy]になります。

于 2010-05-16T19:10:48.970 に答える
5

水平壁では[vx、vy]-> [vx、-vy]を、垂直壁では[vx、vy]-> [-vx、vy]を試してみます。

于 2010-05-16T19:11:23.470 に答える
4

接触点で法線ベクトルを計算する必要があります。法線に沿った速度の成分は方向を切り替えますが、法線に垂直な速度の成分は同じままです。

水平面/垂直面の場合、法線は簡単に計算できます。より複雑な表面の場合、表面の方程式などに依存する場合があります。

また、これはボールのエネルギーが変化しないことを前提としています。ボールの摩擦/熱損失/回転などを考慮すると、複雑になる可能性があります。

于 2010-05-16T19:14:09.987 に答える
3

インパクトポイントでサーフェスに垂直な線の周りにベクトルを反射しています。2Dで:

exit_angle=180-impact_angle。

于 2010-05-16T19:11:34.907 に答える
3

衝突でエネルギーが失われないと仮定すると、速度(vx、vy)で移動するボールは、垂直面で跳ね返った後は速度(-vx、vy)で移動し、水平面で跳ね返った後は(vx、-vy)で移動します。

一般的なケース(任意の法線ベクトルで平面を跳ね返り、エネルギー損失はないと仮定します)については、計算セクションのこのウィキペディアの記事を参照してください:http://en.wikipedia.org/wiki/Specular_reflection

于 2010-05-16T19:37:24.690 に答える
1

あなたは表面とボールの速度を知る必要があります。たとえば、x軸[vx、vy]に平行な線で跳ね返ると、[vx、-vy]になります。線がy軸に平行である場合、[vx、vy]は[-vx、vy]になります。線がどちらの軸にも平行でない場合はさらに複雑になりますが、サーフェスの方向性(x、y軸の場合は(1、0)および(0、1))に沿った速度の単純な反射を探しています。

于 2010-05-16T19:12:01.257 に答える
0

軸に沿ったボックスからの90度の反射は、X/Y速度の符号を適切に反転させることです。それを超えて、内積と少しのベクトルのいじりが必要ですが、その数学はまだ非常に安全です-必要に応じて固定小数点として簡単に行うことができます。

于 2010-05-16T19:37:09.243 に答える