今、C++で球体の集まりで液体を表現するものを作っています。
球と球が積み重なっていくようにしたいのですが球と球の接触判定はできているのですが、
球と球がぶつかると跳ね返るときもあるのですが、なぜかくっついてしまいます。
なにか意見をお聞かせ願います。
C++についてなのですが
Re:C++についてなのですが
抽象的で、よくわからないですが。
水分子のシミュレーションソフトのようなものでしょうか。
どういう条件で重なるか、跳ね返るかを分けているかによるのでは?
もし水分子だとすれば、疎水性の低いものはくっついて、高いものは反発して離れる、となってるのかな。
どういう風に水分子の静電気的力を表現して球を重ねるのかわからないですけど。
if(接触){
if(疎水性低い){
重なる
}else{
反発
}
}
この疎水性が低いかを判断するif文がちゃんと機能していないほではないでしょうか?
水分子のシミュレーションソフトのようなものでしょうか。
どういう条件で重なるか、跳ね返るかを分けているかによるのでは?
もし水分子だとすれば、疎水性の低いものはくっついて、高いものは反発して離れる、となってるのかな。
どういう風に水分子の静電気的力を表現して球を重ねるのかわからないですけど。
if(接触){
if(疎水性低い){
重なる
}else{
反発
}
}
この疎水性が低いかを判断するif文がちゃんと機能していないほではないでしょうか?
Re:C++についてなのですが
さっそくのご意見ありがとうございます。
プログラムは、OpenGLとC++を使っています。球はOpenGLで描画しています。球は、中心から半径を設定して描画されています。
球同士の当たり判定は、球と球の座標で設定しています。判定の仕方は、座標で判断させているので、中心に半径をたして、それが違うボールの中心に半径を引いたものがあたれば、反発しあうようにしています。
もしよろしければ作ったプログラムを添付しましたので、よろしければ、見ていただけないでしょうか??
よろしくお願いします。
プログラムは、OpenGLとC++を使っています。球はOpenGLで描画しています。球は、中心から半径を設定して描画されています。
球同士の当たり判定は、球と球の座標で設定しています。判定の仕方は、座標で判断させているので、中心に半径をたして、それが違うボールの中心に半径を引いたものがあたれば、反発しあうようにしています。
もしよろしければ作ったプログラムを添付しましたので、よろしければ、見ていただけないでしょうか??
よろしくお願いします。
Re:C++についてなのですが
反発力が0.6と結構跳ね返らないのが原因ではないでしょうか?
このコードだと、例えば壁や球に囲まれるなどして、連続で接触するとベクトルの成分がすぐなくなります。
特にxは加速度もないんで、xでくっつくと、yも連続で接触することになり、ベクトルが0になる
と、なってるんじゃないかなぁ・・・と思います。
あとは仕様の問題でしょうけど
○
↓
○
このようにぶつかってもy成分がx成分に変わることがないんで、不自然な動きをしてる気がします。
自信がないんで参考程度にお願いしますね
このコードだと、例えば壁や球に囲まれるなどして、連続で接触するとベクトルの成分がすぐなくなります。
特にxは加速度もないんで、xでくっつくと、yも連続で接触することになり、ベクトルが0になる
と、なってるんじゃないかなぁ・・・と思います。
あとは仕様の問題でしょうけど
○
↓
○
このようにぶつかってもy成分がx成分に変わることがないんで、不自然な動きをしてる気がします。
自信がないんで参考程度にお願いしますね
Re:C++についてなのですが
何度もありがとうございます 参考になります。
ということは、if文のなかにx成分やy成分の両方の条件を追加したものを書けばいいってことですかね
あと、もしよろしければ、私ならこうするなどの意見もあれば教えていただけないでしょうか??
めんどくさい質問で申し訳ないです。
ということは、if文のなかにx成分やy成分の両方の条件を追加したものを書けばいいってことですかね
あと、もしよろしければ、私ならこうするなどの意見もあれば教えていただけないでしょうか??
めんどくさい質問で申し訳ないです。
Re:C++についてなのですが
物理シミュレーションなんてしたことないんで、的外れなこといってるかもしれませんが。
>if文のなかにx成分やy成分の両方の条件
接触判定してる球の角度をもとめて、ベクトル成分yを分解してxに足せばいいんじゃないでしょうか?
真上からあたることなんてほとんどないと思うんで条件は追加しなくてもいいと思います。
あと、yが0のときは地面の摩擦を考慮して速度を減速すればくっつかないでとまりそうです。
このままだと、壁と球にぶつかった時しか減速しないのでくっつかないと止まらないと。
>私ならこうする
実はC++は使ったことがないんです(汗
というわけでC++の効率のいいコーディング方法もわからないんです。
僕はいつもVectorじゃなくてLinkedListをつかいます(Java、C#)
描写と更新はPaticleクラスの中に入れて、制御するかな・・・
OpenGLがどういう動きをするのかわからないんで、なんともいえないですけど。
距離を求める計算は、重そうだし(平方根)、接触すれば4回同じ計算をしてるんで
double distance = sqrt(test_x*test_x + test_y*test_y + test_z*test_z);
if(distance < 2*BALL_SIZE2){
って書くと思います。
>if文のなかにx成分やy成分の両方の条件
接触判定してる球の角度をもとめて、ベクトル成分yを分解してxに足せばいいんじゃないでしょうか?
真上からあたることなんてほとんどないと思うんで条件は追加しなくてもいいと思います。
あと、yが0のときは地面の摩擦を考慮して速度を減速すればくっつかないでとまりそうです。
このままだと、壁と球にぶつかった時しか減速しないのでくっつかないと止まらないと。
>私ならこうする
実はC++は使ったことがないんです(汗
というわけでC++の効率のいいコーディング方法もわからないんです。
僕はいつもVectorじゃなくてLinkedListをつかいます(Java、C#)
描写と更新はPaticleクラスの中に入れて、制御するかな・・・
OpenGLがどういう動きをするのかわからないんで、なんともいえないですけど。
距離を求める計算は、重そうだし(平方根)、接触すれば4回同じ計算をしてるんで
double distance = sqrt(test_x*test_x + test_y*test_y + test_z*test_z);
if(distance < 2*BALL_SIZE2){
って書くと思います。