C言語を学習し始めて、まだ1年も経ってないぐらいの初心者なんですが、
円の動きについて困っています。
三角関数を使ってただ単に円の動きをさせることはできたんですが、
動転座標(ox,oy)を中心に半径rで円の動きをさせるやりかたが全然わかりません。
webで調べても物理っぽい計算式での説明しかなかったので、投稿しました。
アルゴリズムかプログラムを教えてください。
(イメージとしては、四聖Plusのカラミティウィンドミルや混沌たる夢世界みたいな円の動き
ちゃんと動点を中心とする円運動アルゴリズム
Re:ちゃんと動点を中心とする円運動アルゴリズム
動転座標って動点座標?
で、三角関数で原点(0,0)で円の動きが出きたなら、その座標にrを乗算すれば半径rの円になります。
さらにその座標にox,oyを足せば、ox,oyを中心とする半径rの円運動が実現出来ますよ。
で、三角関数で原点(0,0)で円の動きが出きたなら、その座標にrを乗算すれば半径rの円になります。
さらにその座標にox,oyを足せば、ox,oyを中心とする半径rの円運動が実現出来ますよ。
Re:ちゃんと動点を中心とする円運動アルゴリズム
すみません動転じゃなくて動点です;
...自分がド低能なのか全然出来ません。
bossのassistというものが、自分の周りを回りながら自機狙いのショットを撃つBOSS_SHOT_PATTERN05という関数の一部なんですが
アシストの移動成分を与えてやる箇所の、
boss.assist.ax=cos(boss.assist.angle);
boss.assist.ay=sin(boss.assist.angle);
boss.assist.angle+=radian(3);//角度から弧度へ変換する関数
の部分を
boss.assist.ax=cos(PI*boss.assist.cnt/70)*1.2+player.x;
boss.assist.ay=sin(PI*boss.assist.cnt/70)*1.2+player.y;
や
boss.assist.ax=cos(boss.assist[i].angle)*1.2+player.x;
boss.assist[i].ay=sin(boss.assist[i].angle)*1.2+player.y;
boss.assist[i].angle+=radian(3);
に変更したんですが、瞬間的にまっすぐ右下(上下逆のままだから)に行って、そのまま回ったりは一切しませんでした。この関数を抜けてからBOSS_ASSIST_MOVEという関数に入って
if(boss.assist[n].stop==0){//ストップフラグ
if(boss.assist[n].nangle==0){//向くだけで成分移動したい時は角度無視フラグに1を
boss.assist[n].x+=cos(boss.assist[n].angle)*boss.assist[n].speed;
boss.assist[n].y+=sin(boss.assist[n].angle)*boss.assist[n].speed;
}
boss.assist[n].x+=boss.assist[n].ax*boss.assist[n].speed;
boss.assist[n].y+=boss.assist[n].ay*boss.assist[n].speed;
}
を行うようにしているんですが、別々に分けると出来なくなるもんなんでしょうか...?
...自分がド低能なのか全然出来ません。
bossのassistというものが、自分の周りを回りながら自機狙いのショットを撃つBOSS_SHOT_PATTERN05という関数の一部なんですが
アシストの移動成分を与えてやる箇所の、
boss.assist.ax=cos(boss.assist.angle);
boss.assist.ay=sin(boss.assist.angle);
boss.assist.angle+=radian(3);//角度から弧度へ変換する関数
の部分を
boss.assist.ax=cos(PI*boss.assist.cnt/70)*1.2+player.x;
boss.assist.ay=sin(PI*boss.assist.cnt/70)*1.2+player.y;
や
boss.assist.ax=cos(boss.assist[i].angle)*1.2+player.x;
boss.assist[i].ay=sin(boss.assist[i].angle)*1.2+player.y;
boss.assist[i].angle+=radian(3);
に変更したんですが、瞬間的にまっすぐ右下(上下逆のままだから)に行って、そのまま回ったりは一切しませんでした。この関数を抜けてからBOSS_ASSIST_MOVEという関数に入って
if(boss.assist[n].stop==0){//ストップフラグ
if(boss.assist[n].nangle==0){//向くだけで成分移動したい時は角度無視フラグに1を
boss.assist[n].x+=cos(boss.assist[n].angle)*boss.assist[n].speed;
boss.assist[n].y+=sin(boss.assist[n].angle)*boss.assist[n].speed;
}
boss.assist[n].x+=boss.assist[n].ax*boss.assist[n].speed;
boss.assist[n].y+=boss.assist[n].ay*boss.assist[n].speed;
}
を行うようにしているんですが、別々に分けると出来なくなるもんなんでしょうか...?
Re:ちゃんと動点を中心とする円運動アルゴリズム
> を行うようにしているんですが、別々に分けると出来なくなるもんなんでしょうか...?
出来ないわけがありません。
理解していないから正しく分けることが出来ないのでしょう。
回転運動について、考え方が二通りあると思います。
直接計算する方法と差分を積み重ねて計算する方法です。
直接計算する方法は簡単ですが、運動の種類が変わるときには、
連続性を保つための計算が必要になります。
直線運動から回転運動に移る場合など。
差分で計算する場合は、運動がどのように変わろうと、
連続性は保証されますが、誤差が蓄積してしまい、
長時間回転していると、中心や半径が意図したものとは
違ってくる場合があります。
誤差の蓄積を避ける方法も当然ありますけど。
私の好みだとおそらく直接計算を選択しますが、
差分で計算している直線運動との共通点を多くするために、
差分を選択する場合もあるでしょう。
連続性の保証も誤差蓄積の排除も、基本的な原理を知らないと
自分ではできないでしょう。
逆にいえば、基本的な原理さえ押さえれば、自由自在です。
プログラムを作る前に、紙に図や式を書いて理解しましょう。
まずは画面中央を回転させることはできますか?
ボスは無視して良いですし、アシストは一機だけで結構です。
プログラム(ともし可能ならば計算過程の図)を載せて下さい。
出来ないわけがありません。
理解していないから正しく分けることが出来ないのでしょう。
回転運動について、考え方が二通りあると思います。
直接計算する方法と差分を積み重ねて計算する方法です。
直接計算する方法は簡単ですが、運動の種類が変わるときには、
連続性を保つための計算が必要になります。
直線運動から回転運動に移る場合など。
差分で計算する場合は、運動がどのように変わろうと、
連続性は保証されますが、誤差が蓄積してしまい、
長時間回転していると、中心や半径が意図したものとは
違ってくる場合があります。
誤差の蓄積を避ける方法も当然ありますけど。
私の好みだとおそらく直接計算を選択しますが、
差分で計算している直線運動との共通点を多くするために、
差分を選択する場合もあるでしょう。
連続性の保証も誤差蓄積の排除も、基本的な原理を知らないと
自分ではできないでしょう。
逆にいえば、基本的な原理さえ押さえれば、自由自在です。
プログラムを作る前に、紙に図や式を書いて理解しましょう。
まずは画面中央を回転させることはできますか?
ボスは無視して良いですし、アシストは一機だけで結構です。
プログラム(ともし可能ならば計算過程の図)を載せて下さい。
Re:ちゃんと動点を中心とする円運動アルゴリズム
ボスのアシストがプレイヤー中心で回るのかな?って疑問はあるんですがとりあえず振動ぐらいするはずですけどね。
x += ax;
この↑累積しているが問題ですね。
差分で移動しているのは何か意味があるんでしょうか?
たいちうさんも書いていますが、机上で計算してシミュレートしてみましたか?
なんとなく動くかなってのじゃだめですよ。
>(イメージとしては、四聖Plusのカラミティウィンドミルや混沌たる夢世界みたいな円の動き
どの弾の動きか分からないので、ごめなさい。
プレーヤー中心の動きなんでしょうか?
x += ax;
この↑累積しているが問題ですね。
差分で移動しているのは何か意味があるんでしょうか?
たいちうさんも書いていますが、机上で計算してシミュレートしてみましたか?
なんとなく動くかなってのじゃだめですよ。
>(イメージとしては、四聖Plusのカラミティウィンドミルや混沌たる夢世界みたいな円の動き
どの弾の動きか分からないので、ごめなさい。
プレーヤー中心の動きなんでしょうか?
Re:ちゃんと動点を中心とする円運動アルゴリズム
差分移動させないフラグを立てて、直接
boss.assist[0].x=player.x+(cos(boss.assist[0].angle)*HANKEI)*boss.assist[0].speed;
boss.assist[0].y=player.y+((sin(boss.assist[0].angle)/2)*HANKEI)*boss.assist[0].speed;
boss.assist[0].angle+=radian(3);
座標に代入してやるとすんなりプレイヤーの回りを周ってくれました。
差分にした理由は、
このボスのアシストというものは全部で50個用意してあって、
ボスアシストのメイン関数で50個分制御するんですが、それぞれの全く別の動きをさせる時に、
それぞれ成分に移動する値を入れてやって、その後一括に実際に移動させる ってな方法をとっていたんですが、
関数を分け隔てる必要性は無かったんですね。
すみません稚拙でした。
boss.assist[0].x=player.x+(cos(boss.assist[0].angle)*HANKEI)*boss.assist[0].speed;
boss.assist[0].y=player.y+((sin(boss.assist[0].angle)/2)*HANKEI)*boss.assist[0].speed;
boss.assist[0].angle+=radian(3);
座標に代入してやるとすんなりプレイヤーの回りを周ってくれました。
差分にした理由は、
このボスのアシストというものは全部で50個用意してあって、
ボスアシストのメイン関数で50個分制御するんですが、それぞれの全く別の動きをさせる時に、
それぞれ成分に移動する値を入れてやって、その後一括に実際に移動させる ってな方法をとっていたんですが、
関数を分け隔てる必要性は無かったんですね。
すみません稚拙でした。