ページ 11

Box2Dでプログラムから垂直同期をとってループを回すと重力が弱くなってしまう

Posted: 2016年1月31日(日) 13:33
by H.MAI
今Box2Dでプログラムを作っています。
フルスピードでループを回した場合は問題ないのですが
以下のように垂直同期でモニタのリフレッシュレート(60Hz)に合わせて
ループを回すとBox2Dの重力がとても弱くなってしまいます(落下スピードが遅い)。
処理回数が減った為かと思いSetGravity()の設定値を上げてみたのですが
どれだけ上げてもある一定のところから重力が強くなりません。
Step()の値も色々弄ってみたのですがダメでした。
フルスピードでループを回せばどんどん重力を強くできます。
垂直同期をとった場合でも重力を強めるにはどうすればよいでしょうか?
※Box2Dはオフィシャルサイトからダウンロードしたbox2d-master.zipというものです(最新バージョンだと思います)

コード:

world.SetGravity(b2Vec2(0, 30.f));

while(1){
    world.Step(1/60.f, 10, 10);
    vsync(); //vsyncを入れると重力が弱くなってしまう(どれだけ上げても一定値から強くならないStep()の値を弄ってもダメ)
}

Re: Box2Dでプログラムから垂直同期をとってループを回すと重力が弱くなってしまう

Posted: 2016年1月31日(日) 16:39
by ISLe
重力じゃなくて座標系を調整したら良いのでは。

Re: Box2Dでプログラムから垂直同期をとってループを回すと重力が弱くなってしまう

Posted: 2016年1月31日(日) 17:22
by H.MAI
座標系というのは、それぞれのオブジェクトの動きを自分で制御するってことですかね?
その他の力学系の力を与えるメソッドなんかも全て上手く効かなくなってしまうのですよね…
自分なりに色々検索してみたんですがどうも情報に行き当たらなくて。

Re: Box2Dでプログラムから垂直同期をとってループを回すと重力が弱くなってしまう

Posted: 2016年1月31日(日) 17:48
by ISLe
何もしないと、1m1ピクセルなので
1mあたり何ピクセルにしたいのか決めて
Box2Dに座標やサイズをセットするときはその数値で割って
画面に表示するときはその数値を掛ける
というふうにするのだそうです。

重力は加速度なので精度の問題が大きそうに感じたので
一定以上大きくならないというのはそのへんかなと思いました。

フルスピードで回すとどんどん強くなるというのは謎ですけど。

Re: Box2Dでプログラムから垂直同期をとってループを回すと重力が弱くなってしまう

Posted: 2016年1月31日(日) 18:58
by H.MAI
仰る通りでした!
デフォルトでは1mが1pxになってたようでした。
1m辺りのpx数を変更する事でこの辺りの問題を解消できました!
誠にありがとうございました!