- ベストアンサー
ボール同士の衝突
2個のボールが衝突したときのおかしな挙動に困っています。 ちゃんと跳ね返るときもあれば、 いきなり高速移動する くっついたまま離れない。 以下が衝突時の関数です。 アドバイス等お願いします。 bool NearBall=false; void CBallBallView::BallCounter(CPoint *Pos1,CPoint *Pos2,int Radian1,int Radian2,Vector *Vec1,Vector *Vec2,double *SinB,double *CosB,double *SinD,double *CosD) { int Width=Pos1->x-Pos2->x; int Height=Pos1->y-Pos2->y; if(Width==0){return;} if((Radian1+Radian2)*(Radian1+Radian2)>=Width*Width+Height*Height &&NearBall==false) { double Cos=Width/sqrt((double)(Height+Width)*(Height+Width)); double Sin=Height/sqrt((double)(Height+Width)*(Height+Width)); double Tan=Sin/Cos; double tmpCos1; double tmpSin1; double tmpCos2; double tmpSin2; double SinA=*SinB; double CosA=*CosB; double SinC=*SinD; double CosC=*CosD; tmpCos1=(2*Cos*Cos-1)*CosA+2*Sin*Cos*SinA; tmpSin1=2*Sin*Cos*CosA-(2*Cos*Cos-1)*SinA; tmpCos2=(2*Cos*Cos-1)*CosC+2*Sin*Cos*SinC; tmpSin2=2*Sin*Cos*CosC-(2*Cos*Cos-1)*SinC; *CosB=-tmpCos1; *SinB=-tmpSin1; *CosD=-tmpCos2; *SinD=-tmpSin2; NearBall=true; } else { if((Radian1+Radian2)*(Radian1+Radian2)<Width*Width+Height*Height-300) { NearBall=false; } } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>double Cos=Width/sqrt((double)(Height+Width)*(Height+Width)); >double Sin=Height/sqrt((double)(Height+Width)*(Height+Width)); Cos がコサインで Sin がサインのつもりなら上の式が おかしいと気付く筈 それ以外は、仮引数の意味(何を表しているのか)が不明 なので(私には)答えられない (例:Radian1, Radian2, Vec1, Vec2, SinB, CosB, SinD, CosD) 玉が衝突するのなら、玉の大きさは考えなくていいのだろうか >if((Radian1+Radian2)*(Radian1+Radian2)>=Width*Width+Height*Height &&NearBall==false) ここで何と何とを比べているのまったく不明 仮に Radian1,2 が角度だとすると角度と長さと比べるのにどういう意味があるのだろうか
その他の回答 (2)
- shige_70
- ベストアンサー率17% (168/946)
ずいぶんとややこしいことをしてらっしゃいますね。 まず距離の2乗を算出し(距離自体を算出するのは無駄です)、それが両方のボールの半径の和の2乗以下になったら衝突とする。 跳ね返りも、たとえば、両方のボールの中心点を結ぶ直線がy軸と平行になるように速度ベクトルを線型変換(回転)してからy成分を交換して、最後に逆変換(回転をもとに戻す)をしてあげる、という感じでいいと思います。
補足
わかりました、ありがとうございます。
- sha-girl
- ベストアンサー率52% (430/816)
>くっついたまま離れない。 衝突判定時に球がめりこんでいるのでは? めりこんだ球を跳ね返しても、めりこんだまま 永遠と衝突判定を繰り返すことになります。
補足
わかりました。ありがとうございます。
補足
回答ありがとうございます。 Cos がコサインで Sin がサインのつもりなら上の式が おかしいと気付く筈 >>気がつきました。すみません。 >>大分動きがスムーズになりました。 Radian1=ボール1の半径 Radian2=ボール2の半径 Vec1=今現在は不要 Vec2=今現在は不要(最初、x軸y軸の正負でひっくり返そうと思っていましたが、cos,sinでよくなりました。) SinB=ボール1のsin CosB=ボール1のcos SinD=ボール2のsin CosD=ボール2のcos if判定で, ボールの半径1とボールの半径2の和を2乗したものを ボールの中心同士の距離を2乗したものと比べました。 遅いボールに速いボールが後ろから追跡するときに 接触時に引っ張っているような感じです。