ページ 1 / 1
龍神録の13章について
Posted: 2010年6月11日(金) 22:19
by シエル
しょうもない質問ですみません。。
龍神録の13章「敵にショットを撃たせてみよう」で、
弾の画像を描画するところの処理は下記の関数で書かれているのですが、
このDrawROtaGraphFの第四引数のラジアンを指定するところの計算について、
自機と敵の位置から求めたラジアンにPIを2で割った値を足していますが、
なぜ、PIを2で割った値を足すと、弾の画像が自機の方向に正しく向いてくれるのでしょうか?
どなたか分かるように説明していただけると助かります。。
よろしくお願い致します。
DrawRotaGraphF(shot.bullet[j].x+FIELD_X,shot.bullet[j].y+FIELD_Y,1.0, shot.bullet[j].angle+PI/2,img_bullet[shot.bullet[j].knd][shot.bullet[j].co[/url],TRUE);
Re:龍神録の13章について
Posted: 2010年6月11日(金) 22:24
by yu
弾画像が -PI/2 の方向に向いているので
+PI/2 で弾が進んでいる方向に画像を回転しています。
Re:龍神録の13章について
Posted: 2010年6月11日(金) 22:40
by シエル
yuさん、ありがとうございます。
-PI/2の方向とはどういう方向ですか?
Re:龍神録の13章について
Posted: 2010年6月11日(金) 22:58
by yu
> -PI/2の方向とはどういう方向ですか?
度数法で表すと -90° の向きです。今の場合は、上向きです。
また PI/2 は 90°ですね。
今、弾画像は -90°の向きであり、+90°をせずに 0°の方向に弾を進めようとすると
-90°の向きで 0°の方向に進みます。
これだと不自然になるので、進行方向と弾の画像の向きを揃えるために +90°をしてます。
# 追記
# 弾画像の向きというものは、弾が進むべき方向を指します。(説明下手ですみません;)
# ナイフを例に挙げると、柄の部分を進行方向に向けて進んでくると違和感がありますよね。
# しかし、不自然にならない弾もあります。(向きが関係無い円形の弾等)

Re:龍神録の13章について
Posted: 2010年6月11日(金) 23:22
by シエル
角度って、360度(2πラジアン)で考えるのではないのでしょうか?
180度で考えて、上をマイナスで、下をプラスで180度ずつ考えるのでしょうか?
あと少しで分かりそうなんですが。。。

Re:龍神録の13章について
Posted: 2010年6月11日(金) 23:41
by yu
0 ~ 360°で表すこともできますが、個人的に
-90°+ 90° = 0°の形にしたかったので負の値を用いました。
記述する際には分かりにくいのでしませんが、
関数に角度として 720°(4π)等を渡すこともできますよ。

Re:龍神録の13章について
Posted: 2010年6月11日(金) 23:54
by Dixq (管理人)
90°と 90°+360°
-90°と -90°+360°
もっと言えば
x°と x°+360°
これってそれぞれ向き異なるでしょうか?
試しに計算結果を表示させてみて下さい。
同じ結果になるはずです。
つまり延々と数値が増えても大丈夫なのです(あまりに大きいと計算誤差が増えるでしょうけど)
例えば
(90*n)°
のnを0~延々とカウントアップさせてみて下さい。
右、下、左、上、 右、下、左、上、 右・・・
を繰り返すはずです。
で、0°って右ですよね?
しかし、弾の画像って上向いてるんですよ。
だから、PI/2を足して右向き状態をデフォルトにさせてるんです。
弾の画像を回転させて右向きに予めフォトショなどで変換しておけばこれは必要なくなります。
参考:
http://www.linux.or.jp/JM/html/LDP_man- ... sin.3.html
Re:龍神録の13章について
Posted: 2010年6月12日(土) 00:18
by Dixq (管理人)
単位円における(45+360*n)°の座標を計算するプログラムを
DXライブラリで作ってみました。
#define _USE_MATH_DEFINES
#include <math.h>
#define M_PIF ((float)M_PI)
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了
printfDx("正常範囲\n");
for( int i=0; i<10; i+=1 ){
printfDx("%f,%f\n",cosf(M_PIF*2*i+M_PIF/4),sinf(M_PIF*2*i+M_PIF/4));
}
printfDx("--------------------------------\n異常範囲\n");//あまりに数が大きいとダメ
for( int i=0; i<10000; i+=1000 ){
printfDx("%f,%f\n",cosf(M_PIF*2*i*100+M_PIF/4),sinf(M_PIF*2*i*100+M_PIF/4));
}
ScreenFlip();
WaitKey();
DxLib_End() ;// DXライブラリ使用の終了処理
return 0 ;// ソフトの終了
}
実行結果は添付ファイル参照
計算誤差がなければ計算結果は全て同じである事が期待されるものです。
※
floatの有効桁数が大体6桁である事を頭に入れておくと良いと思います。
Re:龍神録の13章について
Posted: 2010年6月12日(土) 10:52
by シエル
あっ!
もしかして、atan2の関数が返す値って、右向きの0度を基準にして
時計回りで、360度(2πラジアン)までの値をラジアンの値で返すんですかね?
だとすると、その基準に合わせるために、現在上向きに向いている弾画像にPI/2(90度)分の
傾きをプラスすることによって、0度の向きにあわせる。
その値に後はatan2関数で求まったラジアンを足せば、見事に自機の方に画像が
向いてくれるということですかね?
理解できてる気がします。どうでしょうか?
Re:龍神録の13章について
Posted: 2010年6月12日(土) 11:20
by Dixq (管理人)
いえ、atan2は
-PI <= atan2(y,x) <= -PI
の範囲だったと思います。
しかし、範囲がどうだろうと関係ないのです。
だって-PIとPIは同義なのですから、0と2PIも同じなのです。
この話はそんなに深く考えるようなものではなく、
・角度は360°ごとに同じものになる
・龍神録のデフォルトの画像は-90°の向きを向いている
ということから、計算結果+90°の向きを向かせて描画しているのです。
良く解らなければ弾の画像をペイントでも何でもいいので、90°回転させて上書き保存し、
+90°を消して下さい。同じ事になります。
(その場合、弾の読み込み関数を少しいじらないといけません)
Re:龍神録の13章について
Posted: 2010年6月12日(土) 11:29
by シエル
何か深く考えすぎてたようでした。
たぶん理解できたので、これにて解決にします。
yuさん、Dixqさん本当にありがとうございました!
