バウンス摩擦による回転を計算するにはどうすればよいですか?


15

前の質問から続きます。ボールがヒットしたサーフェスから非常にリアルに跳ね返っています。今、私はヒットの摩擦からそれを回転させたいです。

これを表示するのは十分簡単です:ティックごとに角速度でボールを回転させ、レンダリング時に同じ回転を適用します。

ボールが壁に当たったとき、回転速度が影響を受けることを知っています...

  • 表面を打つときのボールの初期速度
  • ボールと表面の摩擦係数(物理定数)
  • 入射角(ボールの入射速度ベクトルと表面の法線の間の角度)。

入射角は、ボールの衝撃速度と射出速度のベクトルのドット積で近似されます。(1は高スピン、-1はスピンなし、その他はすべてその間にあることを意味します)

上記のすべてを乗算し、それらが0〜1の範囲に変換され、最大回転速度が乗算されることを確認すると、ボールは予想どおり回転速度で応答するように見えました。1つを除いて、(正の値のため)常に時計回りに回転します。


これは良い方法ですか?もっと簡単な方法を考えられますか?

この方法で問題がなければ、何が欠けていますか?ボールが反時計回りに回転するタイミングを知るにはどうすればよいですか?

回答:


2

あなたの方法はとても簡単です。なぜならとても簡単だからです。必要になる可能性のあることの1つは、ボールの以前のスピンへの依存性です。これは考慮しません。回転するボールは回転エネルギーを表しているため、現実的なシミュレーションでは、おそらく他のエネルギーとともにそれを保存する必要があります。

しかし、ボールがインパクト時に回転していない場合、入射角の方向に対してボールが回転し始める状況は想像できません。つまり、「時計回り」または「反時計回り」は、入射角が法線のどちらの側に相対的であるべきです。

単純に結果に元のx方向ベクトル(左から右に移動する場合は+1、右から左に移動する場合は-1)を乗算するだけでよいと思います。

編集:これにはクロスプロダクトを使用できます。Incident cross normalZ方向のみのベクトルを提供します(2D xy平面上にある場合)。z要素を見てください。正の値の場合、ボールのアプローチにより時計回りに回転するはずです。負の場合、ボールは反時計回りに回転します。


こんにちはeli最初に、私はボールの元のスピンを考慮に入れています。私の投稿でそれを言及するのを忘れていました。2番目に、x方向システムが機能するとは思いません。私はそれを試しましたが、ボールが下から左に向かって表面に当たると、xベクトルは-1になり、反時計回りに回転しますが、実際には時計回りに回転するはずです
-codemonkey

ボールの元のスピンをどのように考慮しますか?それが非常に高速で回転している場合、それはまったく異なる方向に離れて起動する可能性があります。あなたの場合の内積の問題は、余弦(偶数関数)を使用することです。ベクトル間の関係のサイン(インシデントとノーマル)を設定するには、何か他のものが必要です。この目的のために、クロス積(ベクトル積)を使用できます。答えを編集して、クロス積メソッドを含めました。
エリ

編集後に答えを読み直す それを試してみたところ、かなりうまくいきました。元のスピンについては、回転の変化を段階的にすることについてのみ話していました...出口ベクトルに影響する元のスピンについては、それは私の次のステップです:)
codemonkey

この編集は、私が提案した3つの異なる解決策の1つであり、なぜそれを行う必要があるのか​​を説明しました(ドットは角度の方向ではなく、大きさのみを示します)。悲しいかな、私は推測するより簡潔にする必要があります。
カイ

そのkajでごめんなさい、それは私を滑らせた...意図された犯罪:)
codemonkey

3

まず、表面の法線から表面の接線を取得します。t =(ny、-nx)

次に、vt = v dot tとして表面に沿った速度成分を取得できます。

これで、ボールの回転を計算できます:w = |(normal * r)cross vt |、ここでrはボールの半径です。

ここでは、ボールに回転慣性がなく、表面に沿って転がる場合の速度で即座にスピンを開始すると想定しています。摩擦係数を使用してより現実的にすることができ、必要に応じてボールの回転慣性を考慮することができます。


Danikの回答に感謝します。ボールの回転慣性を(新しい回転に追加することで)考慮し、また、表面の摩擦も合計回転速度に乗算する係数として考慮しています。摩擦が大きいほど、回転速度が高くなりますよね?
codemonkey

2

わかりました、これは愚かに聞こえるかもしれませんが、ボールベクトルとサーフェス法線のドット積を使用していないので、角度を計算するためにarccosを実行していますか?次いで、角度は、それが余弦が対称の周りに0であるように、または負(同上)(90度まで)陽性であったかどうかを肯定されるため
、これが場合である場合は、面の法線を使用する代わりに、次に、平面方向自体を使用して角度から90度を引くと、0〜180は-90〜+90度になります(放射状に傾斜している場合は-half PI〜+ half PI)。


さて、この場合を考えてみましょう:x + veは正しい、y + iveはダウンしています。表面ベクトルS =(1,0); V1 =(3,4)の上からヒットする2つの衝撃速度ベクトルがあり、ボールを時計回りに回転させる必要があります。V2=(3、-4)の下からヒットする場合、ボールを反時計回りに回転させる必要があります。これで、両方のベクトルの法線はそれぞれ(3 / 5,4 / 5)&(3/5、-4 / 5)になります。これで、両方のベクトルの内積は3/5になります。生成される角度は、両方のベクトルに対してarccos(3/5)= 53度になります。それは本当ですが、反対側に!したがって、この方法を使用すると、両方が時計回りに回転することになります。私のジレマが見えますか?
codemonkey

3つの可能な解決策。1)法線を使用せず、側面の方向を使用し、上記のように90度を減算します。2)法線のxとyを交換し、1を反転(-1で乗算)することで同じものをシミュレートします。3)クロス積は0度付近で対称ではない角度のサインを表すため、2つのベクトルのクロス積の符号で角度を乗算します。
カイ

内積は角度を与えず、角度の大きさだけを与えます。角度の方向も必要です。上記の3つの方法はすべて、サインを使用してサイドをシミュレートします。基本的なトリガーを使用して角度を取得することもできます。Sin(alpha)=反対側の長さ/傾斜した側の長さ(反対側と傾斜した側の間に90度の角度が1つある三角形に基づく)。それと側面の長さを計算するピタゴラスは行います。
カイ

ところで、元の答えをもう一度読んでください。法線の代わりに平面と角度を取り、90度を引くことでジレンマを解決します。
カイ

0

あなたが最初に着装する必要があるのは、壁にぶつかる前に回転速度または回転を十分に試すことです。Siと言えます。Ssのように、ヒット後に同じスピンを維持するために必要な値よりも大きい、等しい、または低い。これにより、ボールと表面の間の摩擦値を使用して、スピン、たとえばSeを打った後に実際を取得できます。

跳ねる表面全体の速度成分を取得Vxi = Vi dot Vx、Vxは大きさ1の表面への平行ベクトルです。

探している値はSs = Vxi / rで、これはVxiを角速度に変換するためです。SiがSsより低い場合、ボールは確実にスピンを獲得するはずです。SiがSsに等しい場合、このことについては、ボールはほぼ同じスピンを維持する必要があります。SiがSsより大きい場合、ボールはスピンを失うはずです

速度の損失と増加は摩擦値Frに依存します。実際には、半径と摩擦力の間のクロスですが、必要に応じてその値を設定できます。

また、バウンドコックに加えて、ボールとボールの間の摩擦によりボールがエネルギーを失うため、Vxiが悪影響を受けることにも注意する必要があります。バウンスコックはVyに影響を与え、摩擦はVxに影響を与えます。

ボールの変形を考慮する必要があります。これは、ボールが壁にくっつく時間またはフレームに影響を与えます。したがって、摩擦力は、スピンと出口速度に影響を与えるより長い時間作用します。この変形は、モデルをどのようにしたいかによって異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.