ボールの衝突サンプルプログラム

正式公開版 Ver 1.1(99/10/5公開)


ビリヤードもどきです

ボールサンプル ver1.1をダウンロードする(Windows95/98/NT4用、LZH圧縮、104KB)

右クリックor左クリックで配置が初期化されます。

ボールサンプルVer1.1プログラムソースをダウンロードする(Windows95/98/NT4用、LZH圧縮、29KB)


作者のたわごと

10/8日 このページを作り直し

 なぜかこのページがクラッシュしたので(笑)、作り直しました。前書いてあったことと少し違いがでてると思いますが、こんなもんだったのではないかと。技術的な細かい話はBBSの過去ログ参照。

 

10/5日 Ver1.1

 ブレイクなどが変だというので、修正。イベント駆動型にしました。

 

10/4日 Ver1.0

 BBSの方で、衝突に関する質問があったので、さくっと作成(作成時間、1時間)。主要部分はこんなんです↓

// 衝突処理

for (j = 0; j < BMAX; j++) {
 for (i = 0; i < BMAX; i++) {
  if (i < j) {
   // 位置の差を求める
   CVector3 vdp = bp[i] - bp[j];

   // 球の中心間距離を求める
   double dp = vdp.abs();

   // 球の中心間距離が2R以下なら衝突
   if (dp < R * 2) {

    // 相対位置の単位ベクトルを求める
    CVector3 ndp = vdp.norm();

    // 相対速度を求める
    CVector3 vv = bv[i] - bv[j];

    // 球の中心を結んだ方向での相対速度を求める
    double dv = vv.inprod(ndp);

    // 接触位置からどの程度動いたか?
    double bt = (R * 2 - dp) / -dv;

    // 接触位置まで時間を戻す
    bp[i] -= bv[i] * bt;
    bp[j] -= bv[j] * bt;

    // 反射処理
    bv[i] += ndp * dv * -(1.0 + E) / 2.0;
    bv[j] += ndp * dv * (1.0 + E) / 2.0;
   }
  }
 }
}


ソフトウェアトップページに戻る