物理のおおまかな話
転がるボール †
車がブレーキを踏むと止まるあの現象です。
物の表面と表面がこすれたときに生まれます。
摩擦にはおもに2種類あります。
- 動摩擦 -- 動いているものに働く摩擦。
- 静止摩擦 -- 止まっているものに働く摩擦。
とまあ、ありますが、動摩擦だけ押さえてればかなりそれっぽい動きをしてくれるので、
静止摩擦は気にしなくてもいいでしょう。
え、転がり摩擦ですか?これについては知識不足なんでそのうち調べたら書きます。たぶん
動摩擦とあんま変わんないと思います。小さくなるだけってだけで。たぶんですが…。
さて、どうでもいい前置きは終わりです。
んでは、毎度おなじみ超アバウトな動き方の法則解説です。
<法則>
- 物同士がこすれると(ひきずって動かすなど)、動いている方向と反対方向に引っ張られるような感じになる現象です。
- 摩擦の大きさは物どうしが触れている面積は関係ありません。
- 接触面積が増える→物同士を押さえつける力が分散する。そんなイメージ。
- 摩擦の大きさは、表面の材質と、接触している物どうしが押し付けあっている力の大きさに関係します。
- 重いものだと地面に押し付ける力が大きいので摩擦が大きくなります。
- 表面がつるつるしたものよりざらざらしているモノのほうが摩擦が大きかったりしますよね。
- 地面に置いている物を引きずって移動させようとしたとき、物に横から力を加えている間は摩擦力が発生しますが、物を引っ張っていないなど力を加えていない間は摩擦力は発生していません。
- 押すとか引っ張るとかしないかぎり摩擦抵抗は生まれないというわけです。
モジュール: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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
-
|
|
|
|
|
|
!
-
|
|
|
|
!
|
#include "mp001.as"
title "動摩擦サンプル"
px = 100 : py = 100 vx = 0 : vy = 0 ax = 0 : ay = 0 g=1 m=1 mu = 1
*main
DrwCls 17,255,255,255
color 0,0,0
mes "座標( "+px+", "+py+" )"
sqrt vx*vx + (vy*vy) : vv = stat mes "速度 v = " + vv + " ("+vx+", "+vy+")"
if vy = 0 : mes "スペースキーを押してください。"
gosub *inkey
ax = 0 : ay = g
if py>=400 {
if vx<0 : hvx =-1
if vx>0 : hvx = 1
if vx=0 : hvx = 0
ax -= hvx*mu*ay
if (vx<0)&(vx+ax>0) : ax = -vx
if (vx>0)&(vx+ax<0) : ax = -vx
}
vx = vx + ax vy = vy + ay
px = px + vx py = py + vy
if py>400{ vy = vy * -4/5 if (-g<vy)&(vy<0) : vy = 0
ay = 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
color 0,0,255 : DrwArrow px+5,py+5, ax*50+px+5, ay*50+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
|
|
平方根モジュールはさくらさんとこのHSP Tipsを参考にさせていただきました。m(_ _)mども
摩擦を表現した部分だけ抜き出しました。
水平な地面の上にある物体を想定して作っています。
;地面との摩擦
if py>=400 {
if vx<0 : hvx =-1
if vx>0 : hvx = 1
if vx=0 : hvx = 0
ax -= hvx*mu*ay
if (vx<0)&(vx+ax>0) : ax = -vx
if (vx>0)&(vx+ax<0) : ax = -vx
}
- if py>=400 ...のとこで地面に触れたときだけ、物体と地面との間に摩擦が生まれるようにしています。
- hvxに進行方向の±を記録。
- muは動摩擦係数。
- 水平な地面上に限定するので地面に垂直な加速度はayを使用。
ということで式はこうなります。
ax -= hvx*mu*ay
このあとさらに、マイナスしすぎて反対方向に移動してしまわないように摩擦抵抗に上限値を設定します。
if (vx<0)&(vx+ax>0) : ax = -vx
if (vx>0)&(vx+ax<0) : ax = -vx
垂直抗力Nの物体に働く摩擦力は
F = μ * N
です。
垂直抗力Nと言うのは、地面から垂直方向に物体が受けている力。今回の場合重力意外に働く力がないので
N = m * g
になります。で、運動方程式がF=maだから…
F = μ * N
= μ * m * g = m * a
μ * g = a
としてこのときの加速度が出ます。
この加速度は進行方向と反対方向に進むので、元の値から引いてやります。