ページ 11

ゆっくりと目標値に近づく動作

Posted: 2010年5月06日(木) 17:02
by ft
前回自機を中心に円を描いて動くオプションについて質問させていただきました。

次に自機とオプションの角度を、100カウントくらいかけて自機とボスの角度と等しくなるようにしたいのですがどうすればいいでしょうか?
現在、下のような感じにしているのですが、これですとオプションは常にボス方向に向いてしまっているので、
自機が動いた後追従してゆっくり角度が合うようにしたいのです。
ボスは座標(240,136)に居るという設定でやっています
void graph_option(){
     float ch_boss;//自機とボスの角度
     float ch_option;//自機とオプションの角度
     ch_boss=atan2f(-ch.y+136,-ch.x+240);//自機とボスの角度(240,136)
     ch_option=atan2f(-ch.y+option_y,-ch.x+option_x-);//自機とオプションの角度
     option_x=cosf(ch_boss)*35+ch.x;
     option_y=sinf(ch_boss)*35+ch.y;
     DrawRotaGraphF(option_x, option_y, 0.45f, 0,img_ch_photo[0], 1,0 );
}

Re:ゆっくりと目標値に近づく動作

Posted: 2010年5月06日(木) 17:22
by Justy
 目標の角度から今の角度を引いて、その差の角度に係数をかけてその角度を今の角度に足して
それを新しい今の角度にする、とか。

例)目標が 45度で、自機が 20度なら、差は 25度。
 25度に係数 0.1をかけると 2.5度で、自機の角度に足して 22.5度を今の角度にする

Re:ゆっくりと目標値に近づく動作

Posted: 2010年5月06日(木) 18:12
by ft
座標(240,136)の右あたりでオプションの動作がおかしくなってしまいます。
ちょっと動くと自機を中心にぐるっと回ってしまう感じです。
-π、π付近に関する問題だと思うのですが、自機-ボス、自機-オプション、角度差それぞれどのような修正をかければいいのでしょうか?

Re:ゆっくりと目標値に近づく動作

Posted: 2010年5月06日(木) 18:23
by Justy
>座標(240,136)の右あたりでオプション
 せめて対象と自機との角度とか、係数とかその他詳細情報なしではよくわからないですが、
なんだか Déjà vuな気がします。

C言語何でも質問掲示板 - ホーミング弾について
http://www.play21.jp/board/formz.cgi?ac ... &rln=45550

Re:ゆっくりと目標値に近づく動作

Posted: 2010年5月06日(木) 19:43
by ft
位置はこちらから見て座標(240,136)の右側で起こります。
係数を大きくすると永遠と回ってしまうのですが、
小さくしても回り続けないにしても1周はしてしまいます。
前回は弾だけの角度でしたが、今回は複数の角度を扱うためどうしたらいいのでしょうか?
現在はこんな感じです。
void graph_option(){
    float ch_boss;//自機とボスの角度
    float ch_option;//自機とオプションの角度
    float sa;//ch_bossとch_optionの差

        ch_boss=atan2f(-ch.y+136,-ch.x+240);//自機とボスの角度
        ch_option=atan2f(-ch.y+option_y,-ch.x+option_x);//自機とオプションの角度
    sa=ch_boss-ch_option;

    ch_option=ch_option+0.04f*sa;//係数を0.05にするとクルクル回り続けます
 
    option_x=COS(ch_option)*35+ch.x+16;//現在の位置x
    option_y=SIN(ch_option)*35+ch.y+10;//現在の位置y

    DrawRotaGraphF(option_x, option_y, 0.45f, 0,img_ch_photo[0], 1,0 );
}

Re:ゆっくりと目標値に近づく動作

Posted: 2010年5月06日(木) 22:20
by たいちう
> option_x=COS(ch_option)*35+ch.x+16;//現在の位置x
> option_y=SIN(ch_option)*35+ch.y+10;//現在の位置y

16とか10とかが不要に見えますが。
これだけが原因ではなさそうですが。

ちなみに、係数を1.0にすると、ピタッとボスの方を向きますか?
それができないと、前提が覆ります。

Re:ゆっくりと目標値に近づく動作

Posted: 2010年5月06日(木) 22:41
by Justy
 実行できないので目推測ですが、なんとなくですがわかったかもしれません。
 saの角度を差で求めた後、計数を掛ける前に
[color=#d0d0ff" face="monospace]
const float pi = static_cast<float>(PHI);
if(sa > pi) sa -= pi * 2;
else
if(sa < -pi) sa += pi * 2;
[/color]

としたらどうなりますか?
画像

Re:ゆっくりと目標値に近づく動作

Posted: 2010年5月06日(木) 23:33
by ft
たいちうさん
画像サイズが32*20となっており、そのままですとちょっとズレてしまうのでその補正分です。

Justyさん
できました!
あ、なるほど、二者の位置関係上結果としてsaに180度付近の影響が出てくるのですか。
こうやって改めて眺めてみますと状況がよくわかります。
自分で辿り着けないのがダメダメですが^^;
どうもありがとうございました。