ページ 1 / 1
計算の単位
Posted: 2011年5月01日(日) 06:19
by dic
今、シューティングを作ってて、物理の法則(名前は忘れました)にしたがって作っているのです
V = V0 + at 速度=初速度+加速度*時間
というのを使っています
そこで、C言語で
コード:
static double v;
double v0, a;
int t;
v = v0 + a*t;
として計算していますが、60フレームで動作させるものなので上の時間のところの単位が
違うように思えます
1/60秒に一回呼ばれるので t は 1 ではなくて 1/60 ではないのか?と思っています
なので
v = v0 + a*(1/60)*t
になるのが正しいと思いますが、どうでしょうか?
Re: 計算の単位
Posted: 2011年5月01日(日) 07:50
by たかぎ
等加速度直線運動を再現したいのであれば、加速度を秒単位の値ではなく、フレーム単位の値にすればOKです。
また、毎回初速度を使って計算するのではなく、
コード:
static double v = v0;
v += a;
のように、毎回加速度を現在の速度に加算していくだけでかまいません。
なお、変位は、「変位 = 速度×時間」が基本です。
しかし、加速度が絡んでいますので、「変位 = 初速度 + (1/2)×加速度×時間
2」としなければなりません。
これも、毎回初速度を使って計算する必要はなく、次のようにできるかと思います。
コード:
static double v = v0;
static double s = 0;
s += v + a / 2;
v += a;
# 変換ミスを修正しました。
Re: 計算の単位
Posted: 2011年5月01日(日) 11:34
by たいちう
> v = v0 + a*(1/60)*t
> になるのが正しいと思いますが、どうでしょうか?
それで正しいですが単位を確認しましょう。
普通物理で使われる単位はMKSA単位系です。
v : 速度 : m/s
a : 加速度 : m/s/s
t : 単位時間 : s
ここで時間の単位にf(=1/60s)を使うと、
v : 速度 : m/f
a : 加速度 : m/f/f
t : 単位時間 : f
と表せます。単位時間を変えたことで、vもaも数値が
変わることに注意してください。
このようにして求めた速度から位置(m)を計算し、
それを画面上に表示していますが、
画面上での位置の単位はpixel(ここではpとする)ですので、
v : 速度 : p/f
a : 加速度 : p/f/f
t : 単位時間 : f
とした方が直接計算できます。
単位が変わったため、vとaの数値がまた変わります。
物理的な動きをシミュレートして、
その結果を適当な縮尺で画面上に表示したいならば、
最初のMKSA単位系で座標を計算するのが良いでしょう。
式に出てくる全ての物理量について単位を確認してください。
一方、1フレームあたり3pixel移動させれば良くて、
それが秒速何メートルなのかは気にしなくて良い場合、
フレームとpixelで直接計算した方が簡単でしょう。
# たかぎさんのtypoに気付いたので一応指摘
# 等価速度直線運動 → 等加速度直線運動
Re: 計算の単位
Posted: 2011年5月01日(日) 12:30
by softya(ソフト屋)
現実世界での速度は共通認識として距離/時間で表わされますね。それがゲームだとピクセル/フレームが速度です。
ここで問題と成るのは、一秒も1フレームも時間の流れを切り取った単位に過ぎませんよね。
つまり、一定の時間単位で移動した距離が速度に過ぎないってことです。
なので、あまり物理の方程式に目を奪われて根本のところを見失わない事が大切です。
一定の時間を表していれば秒でもフレームでもかまわないのです。
これと
v = v0 + a*(1/60)*t
これで
v = v0 + a*t;
どちらが扱いやすいかって事ですね。
現実の物理方法を出来るだけ忠実にシミュレートしてしないなら秒と言う単位にこだわる理由は特にありません。
v = v0 + a*t;
シンプルなこちらで十分です。
Re: 計算の単位
Posted: 2011年5月01日(日) 14:46
by dic
>>たかぎさん
コード:
static double v = v0;
v += a;
にすると この加速度の単位は p/f (ピクセル/フレーム)ってことですね
なるほど、簡略化した式でも求めれるんですね
念のため、本に目を通して理解してからコードにします
>>たいちうさん
上にもあるように、時間をフレームにしたら加速度もフレーム単位になるんですね
単位の変換が苦手で気がつきませんでした
>>softyaさん
v = v0 + a*t;
で一回作ってみて、ためしに動作させてみたところ
加速度がすんごいことになっていたので、何か計算ミスしていないかいろいろ考えていたところです
また、コードに直してためしに動かせるようにするには、いじらないといけないので
v = v0 + a*(1/60)*t
でもためしてみて、どんな動きをするか確かめてコードにします
Re: 計算の単位
Posted: 2011年5月01日(日) 15:54
by softya(ソフト屋)
v = v0 + a*t;
だとしても全てピクセル/フレームの単位で統一されてないと意味がありません。
v0:ピクセル/フレーム
a:ピクセル/フレーム2
そこら辺の認識に齟齬はありませんか。
Re: 計算の単位
Posted: 2011年5月01日(日) 16:38
by たいちう
> にすると この加速度の単位は p/f (ピクセル/フレーム)ってことですね
物理学的には加速度の単位は長さ/時間/時間です。
暗黙的に、1秒あたり、とか、1フレームあたり、とかいう条件が付いています。
日常で瞬間風速40mとか制限速度60kmとか言う場合、
1秒あたりとか1時間あたりとかの前提が含まれているのと同じです。
普通の会話では必ずしも意識する必要はありませんが、
物理学的には明白な間違いです。
> 単位の変換が苦手で気がつきませんでした
じっくりとやれば難しくありませんよ。
単位に着目することで物理は理解できるようになります。
Re: 計算の単位
Posted: 2011年5月02日(月) 18:23
by dic
>>たいちうさん
アドバイスありがとうございます
また、本にかいてある単位変換のところを読んでみます
>>softyaさん
齟齬・・・む、むずかしい日本語を知ってますねw(私がアホなだけかも)
大丈夫です
v = v0 + a*(1/60)*t
にしたところ結構いい感じに調整しやすい計算式になりました
あとはたかぎさんのように、もちっと計算を楽になるよう考えます
でも 変位 = 速度×時間 で、弾の軌道をみちびきだすと
時間をいじることで、まきもどりの軌道も描けますね
リプレイなどにも応用できそうでとてもおもしろいです
あとは、計算でつまづいたりしたらまた質問させていただきます
回答ありがとうございました
Re: 計算の単位
Posted: 2011年5月03日(火) 07:21
by 三郎
解決しているのに質問するのは気がひけますが、、、
私はシューティングゲームの事も知りませんしゲームも造った事もやった事も無く失礼しますが。
多分弾丸を発射して敵に当てたりするゲームと思いますが、弾丸などを上空方向に発射すれば(水平以外)、段々玉の速度は落ちるし、
反対に上空から発射すれば速度が上がる場合もある(空気抵抗の問題もあり複雑)。物事を正確にシュミレートするのもゲームを面白くするような気もしますが、要するに速度は一定でなく正に加速度に左右される。駄目でしょうか?。
フライトシュミレータとか車の操縦のものを、ゲームセンターで若者のやっているのを見ました。正に加速度の世界でしたが。
Re: 計算の単位
Posted: 2011年5月03日(火) 11:06
by softya(ソフト屋)
三郎 さんが書きました:解決しているのに質問するのは気がひけますが、、、
私はシューティングゲームの事も知りませんしゲームも造った事もやった事も無く失礼しますが。
多分弾丸を発射して敵に当てたりするゲームと思いますが、弾丸などを上空方向に発射すれば(水平以外)、段々玉の速度は落ちるし、
反対に上空から発射すれば速度が上がる場合もある(空気抵抗の問題もあり複雑)。物事を正確にシュミレートするのもゲームを面白くするような気もしますが、要するに速度は一定でなく正に加速度に左右される。駄目でしょうか?。
フライトシュミレータとか車の操縦のものを、ゲームセンターで若者のやっているのを見ました。正に加速度の世界でしたが。
シューティングゲームの弾の場合は、自己加速するミサイルの様な物で、物理的リアリティは求めてないので重力加速度や空気摩擦での減速は基本的に考慮されません。
それとv = v0 + a*t;と言う式そのものが加速度の計算式で、すでに加速度は加味されています。