レス数:4 / 状態:未解決 / No:16 / ATOM
1
日付:2010/04/24(土)22:17:34
ID:LdruFdXBy9E.
物理演算関連の勉強のためビリヤードのような玉の衝突を実現して
いるコードを求めてこちらにたどり着きました。
こちらで公開されているサンプルコード「円同士の衝突を計算する」
ですが、ある円のベクトルが0の場合、他の円からエネルギーを得ても
めり込み処理で多少移動するだけの障害物化します。
わざとベクトル0の円を作るようにしたコード
onClipEvent (load) {
var i;
var j;
var num = 10;
for (i = 0; i<num; i++) {
_root.attachMovie("tama", "tama"+i, i); // 玉を生成
var obj = eval("_root.tama" + i); // 参照パス
obj._x = Math.random() * 400; // x座標
obj._y = Math.random() * 600; // y座標
obj.dx = (Math.random() * 2 - 1) * 10; // x方向移動量
obj.dy = (Math.random() * 2 - 1) * 10; // y方向移動量
obj.rad = i * 2 + 15; // 半径
obj.g = obj.rad - 14; // 重さ(玉同士の比率が出せればいいので自然界での重さみたいなのは気にせずに適当でOK)
obj._xscale = obj._yscale = obj.rad * 10 * 2;
obj.drag = false; // ドラッグ状態
}
//勝手に追加しますた
i = 0;
var obj = eval("_root.tama" + i); // 参照パス
obj.dx = 0; // x方向移動量
obj.dy = 0; // y方向移動量
//勝手に追加しますた
// マウス加速度
dx = 0;
dy = 0;
fx = 0;
fy = 0;
}
いるコードを求めてこちらにたどり着きました。
こちらで公開されているサンプルコード「円同士の衝突を計算する」
ですが、ある円のベクトルが0の場合、他の円からエネルギーを得ても
めり込み処理で多少移動するだけの障害物化します。
わざとベクトル0の円を作るようにしたコード
onClipEvent (load) {
var i;
var j;
var num = 10;
for (i = 0; i<num; i++) {
_root.attachMovie("tama", "tama"+i, i); // 玉を生成
var obj = eval("_root.tama" + i); // 参照パス
obj._x = Math.random() * 400; // x座標
obj._y = Math.random() * 600; // y座標
obj.dx = (Math.random() * 2 - 1) * 10; // x方向移動量
obj.dy = (Math.random() * 2 - 1) * 10; // y方向移動量
obj.rad = i * 2 + 15; // 半径
obj.g = obj.rad - 14; // 重さ(玉同士の比率が出せればいいので自然界での重さみたいなのは気にせずに適当でOK)
obj._xscale = obj._yscale = obj.rad * 10 * 2;
obj.drag = false; // ドラッグ状態
}
//勝手に追加しますた
i = 0;
var obj = eval("_root.tama" + i); // 参照パス
obj.dx = 0; // x方向移動量
obj.dy = 0; // y方向移動量
//勝手に追加しますた
// マウス加速度
dx = 0;
dy = 0;
fx = 0;
fy = 0;
}
2
名前:k
日付:2010/04/25(日)08:39:59
ID:9kJEWPZA4knz
うーん、結論から言うと、ここのサイトの物理演算は近似的なものなので、
処理が軽い(?)分、実際の現象とかけ離れています。
例えば、遅く右に進む円Aの後方から、早く右に進む円Bが衝突すると、
円A,Bともに、左に進むような挙動をしていると思います。
なので、速度0の円の処理も上手くいかないと思います。
物理Ⅱを少し習ったなら、反発係数の式と、運動量保存則の式を連立して、
正しい式が比較的簡単に求められます。
この際、めり込みは修正し、接線と垂直方向のベクトルのみを計算でいじります。
ご自分で勉強しているなら、一度自分で出してみるのもいいと思います。
処理が軽い(?)分、実際の現象とかけ離れています。
例えば、遅く右に進む円Aの後方から、早く右に進む円Bが衝突すると、
円A,Bともに、左に進むような挙動をしていると思います。
なので、速度0の円の処理も上手くいかないと思います。
物理Ⅱを少し習ったなら、反発係数の式と、運動量保存則の式を連立して、
正しい式が比較的簡単に求められます。
この際、めり込みは修正し、接線と垂直方向のベクトルのみを計算でいじります。
ご自分で勉強しているなら、一度自分で出してみるのもいいと思います。
3
名前:◆..HAKuHiNs
日付:2010/04/25(日)11:14:49
ID:yDl4tzgDJCHR
>>1
衝突してるっぽく見えるなんちゃって処理でして
物理的にはデタラメです。
ベクトルが0のときに障害物化するのは、
衝突後の反射方向を計算するアルゴリズムに問題があります。
衝突前の速度の方向情報が 0 だと反射後の方向の計算ができないため
どの方向にも動けなくなっています。
衝突後の反射方向が明らかにおかしい事があるのは
後ろから衝突するような状況のときに反射方向が逆転してしまっています。
また、衝突後の座標の補正も不完全で、衝突した直後に再び衝突してしまう状況がよくあります。
いろいろ不備が多いので、該当ページはいずれ書き直したいと思います。
あいかわらず、なんちゃって処理になりますが…。
衝突してるっぽく見えるなんちゃって処理でして
物理的にはデタラメです。
ベクトルが0のときに障害物化するのは、
衝突後の反射方向を計算するアルゴリズムに問題があります。
衝突前の速度の方向情報が 0 だと反射後の方向の計算ができないため
どの方向にも動けなくなっています。
衝突後の反射方向が明らかにおかしい事があるのは
後ろから衝突するような状況のときに反射方向が逆転してしまっています。
また、衝突後の座標の補正も不完全で、衝突した直後に再び衝突してしまう状況がよくあります。
いろいろ不備が多いので、該当ページはいずれ書き直したいと思います。
あいかわらず、なんちゃって処理になりますが…。
4
名前:こんなぺーじも
日付:2010/04/26(月)16:16:47
ID:6bUIa6bNwgog
このスレッドについて
質問の状態 : | 未解決 |
投稿開始日 : | 2010/04/24(土)22:17:34 |
投稿終了日 : | 2010/04/26(月)16:16:47 |
投稿者 : | |
レス総数 : | 4 |
スレッド番号 : | 16 |