物理のおおまかな話
飛ぶボールその1 †
ボールは空中に置くと地面に落ちる。なぜか?地球に引力があるから。
ってそりゃ知ってる話でしょうが…で、結局引力ってどんな感じのもんなん?というのが問題。
<法則>
- ボールの移動速度は、ボールに何らかの力が働かない限り変化しない。
- 地球はボールをある一定の力で引っ張っている。
- 「一定の力」は地球上の人が普段生活する範囲ではどこに行ってもほとんど変わりません。今回は深海や成層圏とかまで行かないで下さい。(^ ^;
- 力の大きさはボールの質量に関係してくる。質量が大きいほど強く引っ張られる。
- ボールに「常に一定の力」が加わると、ボールの移動速度は常に一定の法則で変化する。
- 一定の力は引力に限定するものじゃないけど…いまは引力と考えていいや。
- この法則とゆーのは、一定時間ごとに一定の大きさだけ速度が増える、というもの。
- ボールは地面にはぶつからないし、手でも触らないものとしておく。おさっしのとおり時間とともにどんどん早くなっていきます。
- この法則による速度変化は、ボールが重くても軽くても大きくても小さくても平べったくてもまん丸でも、一切関係ありません。
- 「実際は違うじゃん!」といわれそうですが、その辺は後で説明します。今回とは別の法則で力が加わっていますので。今回は空気がないから、とだけ。
んーと、まー、いーいう感じです。
気楽にサンプルいってみましょう。
+
| | 重力サンプル
|
モジュール:mp001.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
|
#include "mp001.as"
title "重力加速度サンプル"
px = 100 : py = 100 vx = 0 : vy = 0 ax = 0 : ay = 0 g = 1
*main
DrwCls 17,255,255,255
color 0,0,0
mes "座標( "+px+", "+py+" )"
sqrt vx*vx + (vy*vy) : vv = stat/1 mes "速度 v = " + vv
if vy = 0 : mes "スペースキーを押してください。"
gosub *inkey
ax = 0 : ay = g
vx = vx + ax vy = vy + ay
px = px + vx py = py + vy
if py>400 : ay = 0 : vy = 0 : py = 400
boxf px, py, px+10, py+10
color 255,0,0
DrwArrow px+5,py+5, vx*5+px+5, vy*5+py+5
goto *main
stop
*inkey
stick key, 5
if key&16 : vy=vy-20 if key&1 : vx-=2
if key&4 : vx+=2
if key&128 : end
return
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
-
|
!
| #module
#deffunc DrwArrow int x1, int y1, int x2, int y2
line x1, y1, x2, y2
x = x1 - x2
y = y1 - y2
x3 = (x - y) / 7 + x2
y3 = (y + x) / 7 + y2
line x2, y2, x3, y3
x3 = (x + y) / 7 + x2
y3 = (y - x) / 7 + y2
line x2, y2, x3, y3
return
#global
#const G 1 #const GROUND 400 #const RAD 6 title "重力加速度サンプル"
px = 100 : py = 100 vx = 0 : vy = 0 ax = 0 : ay = G
*main
redraw 0
color 255, 255, 255 : boxf
gosub *inkey gosub *calc gosub *draw await 17
redraw 1
goto *main
stop
*inkey
stick key, 5
if key & 128 : end
if key & 16 : vy -= 20 vx += 2*((key>>2&1) - (key&1))
return
*calc
vx += ax : vy += ay py += vy px = limit(px + vx, RAD, ginfo_winx - RAD)
if py > GROUND - RAD { vy = 0 : py = GROUND - RAD
}
return
*draw
color : pos 0, 0
mes "座標( " + px + ", " + py + " )"
mes "速度 v = " + sqrt(vx*vx + vy*vy) if vy = 0 : mes "スペースキーを押してください。"
color 192, 192, 192
boxf ginfo_winx, ginfo_winy, 0, GROUND
color
circle px - RAD, py - RAD, px + RAD, py + RAD
color 255 : DrwArrow px, py, vx * 5 + px, vy * 5 + py
return
|
|
|
今回新たに増えた変数は次の変数。
ax :x方向加速度
ay :y方向加速度
操作方法。
- スペースキーを押すと、物体に下から上に向かう方向の速度を加えます。
ジャンプやボールを上になげるイメージです。
- キーボードの←→キーで横移動が出来ます。
x方向の速度に値を加えているだけなので前回の復習といったような動きをします。
今回の肝心の部分はこんだけです。
一番最後の行では物体が画面から消えてしまわないように、地面を作っています。
; 物理計算
vx = vx + ax ;速度の変化
vy = vy + ay
px = px + vx ;座標
py = py + vy
if py>400 : vy = 0 : py = 400 ;地面の代わり
というわけで、座標のところはもういいですね。
今回のポイントは速度の変化です。axは1コマ当たりの速度変化の量で、単位は
ax [ドット/(コマ×コマ)]
と考えてください。
前回と同様に×1コマが省略されています。実際はこんな感じです。
vx = vx + ( ax * 1 )
(ax × 1コマ)の計算で増加する速度(ドット/1コマ)になります。
このようにして時間(コマ)とともに速度 vx,vyは変化していきます。(ちなみに、この axは一般に「加速度」と呼ばれています。)
一般的な速度を求める式はこんな感じです。
(現在の速度)=(1コマ当たりの速度変化量)×(経過した時間・コマ数) + (移動前の速度)
(経過した時間・コマ数)は経過時間のことです。普通1コマなので1と考えれば計算が楽ですね。
- さて、重力と速度の関係が分かったでしょうか?
地球の引力、というか一定の力で引っ張り続けている物体の移動なのですが…まあ通常ゲームでは引力で使うことが多いでしょう。
px = px + vx
は
px += vx
と記述することが出来ます。
ここからは物理習ったぞというひとだけ読んでください。
質量m、重力加速度gの場所に置いてあるボールにかかる力Fは
F = m * g
です。
力と質量と加速度の関係…運動方程式は、
F = m * a
なので、
F = m * a = m * g
a = g
となります。質量の大小にかかわらず、加速度は同じになります。
このように今回は水も空気もないので鳥の羽でも金の延べ棒でも同じ加速度で落下し、同じ高さから落とせば同じ速度で落下します。