hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
物理のおおまかな話/飛ぶボールその3 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

物理のおおまかな話

飛ぶボールその3(空気の中を高速で飛ぶ)

飛行機などのようにスピードが速い場合の空気抵抗は慣性抵抗の影響を大きくうけます。

	<法則>~
  • 空気抵抗には粘性抵抗と慣性抵抗という2種類がある。今回は慣性抵抗を導入する。
  • 今回もボールの向きとか回転とかは考えない。
  • 風の中に静止している物体(あるいは空気中を移動する物体は)は、速度の2条に比例した力を受け、 その方向は風上から風下方向に向かう方向成分(物体の進行方向と反対方向の方向成分)である。
    • 何いってるのかわけわかりませんね。簡単に言うと、速く動けばそんだけ抵抗が大きくなりますよということです。
  • 空気抵抗は(正面から見たときの)面積が大きいほど大きい。

サンプル

hsp2.png
モジュール:filemp001.as

fileb011.as
Everything is expanded.Everything is shortened.
  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
 95
 96
 97
 98
 99
100
101
102
103
104
105
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
-
|
|
|
!
 
 
-
|
|
|
|
|
|
!
 
 
 
 
 
 
 
 
 
-
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
;
;	 空気抵抗(粘性抵抗+慣性抵抗)のサンプル(v2.61)
;(2007/02/20)
;
 
#include "mp001.as"
 
title "空気抵抗サンプル"
;	 初期化
px = 100 : py = 100    ;座標
vx = 0 : vy = 0        ;速度
ax = 0 : ay = 0        ;加速度
g=1        ;重力加速度
m=1        ;質量
mu = 1      ;動摩擦係数
ita10 = 1
cd=1
 
*main
    ;
    ;	 画面の初期化
    ;
    DrwCls 17,255,255,255        ;16.67ms (= 1/60 秒)
 
    ;
    ;	パラメータ表示
    ;
    color 0,0,0
    mes "座標( "+px+", "+py+" )"
    sqrt vx*vx + (vy*vy) : vv = stat
    mes "速度 v = " + vv
 
    gosub *inkey    ;	 キー入力
 
    ;
    ;	 物理計算
    ;
 
    ax = 0 : ay = g    ;重力
 
    ;空気抵抗(粘性抵抗)
    ay -= vy *ita10/10 / m
    ax -= vx *ita10/10 / m
 
    ;空気抵抗(慣性抵抗)
    if vx<0 : hvx =-1
    if vx>0 : hvx = 1
    if vy<0 : hvy =-1
    if vy>0 : hvy = 1
    if 1 {
        ax -= vx*vx *cd/100 /2/m * hvx
        ay -= vy*vy *cd/100 /2/m * hvy
    } else {
        ;おまけ…揚力もどき
        ;if 0にすると有効になります。
        cl = 1:ay -= vx*vx *cl/100 /2/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
    }
 
    ;速度
    vx = vx + ax    ;速度の変化
    vy = vy + ay
 
    ;座標
    px = px + vx    ;座標
    py = py + vy
 
    if py>400{    ;地面衝突
        vy = vy * -4/5    ;跳ね返り係数 -4/5
        if (-g<vy)&(vy<0) : vy = 0
        py = 400
        ay = 0
    }
 
    ;
    ;	 自機の描画
    ;
    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
 

[hsp3]

Everything is expanded.Everything is shortened.
  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
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
-
|
|
|
!
 
 
-
|
|
|
|
!
 
 
 
 
 
 
 
 
-
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//  空気抵抗(粘性抵抗+慣性抵抗)のサンプル(v3.0, 2007/03/04)  //
 
#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
 
#define GROUND 400.0        ; 地面の高さ
#define RADIUS 5            ; ボールの半径
#define G      1.0          ; 重力加速度
#define M      1.0          ; 質量
#define MU     1.0          ; 動摩擦係数
#define ITA    0.1          ; 粘性抵抗の係数
#define CD     0.01         ; 抗力の係数
#define CL     0.01         ; 揚力の係数
 
    title "空気抵抗サンプル"
 
    px = 100.0 : py = 100.0 ; 座標
    vx = 0.0 : vy = 0.0     ; 速度
    ax = 0.0 : ay = 0.0     ; 加速度
 
*main
    redraw 0
    gosub *inkey            ; キー入力を取得
    gosub *calc             ; 各種物理計算
    gosub *draw             ; 各種描画
    redraw 1
    await 17
goto *main
 
// キー入力
*inkey
    stick key, 5
    if key&128 : end        ; ESCキーで終了
    if key&16 : vy -= 20.0  ; ジャンプ
    if key&1  : vx -=  2.0
    if key&4  : vx +=  2.0
    return
 
// 物理計算
*calc
    ax = 0.0 : ay = g         ; 重力
 
    ; 空気抵抗(粘性抵抗)
    ay -= ita * vy / m
    ax -= ita * vx / m
 
    ; 空気抵抗(慣性抵抗)
    hvx = (0 < vx) - (vx < 0)
    hvy = (0 < vy) - (vy < 0)
    if 1 {
        ax -= cd*vx*vx /2/m * hvx
        ay -= cd*vy*vy /2/m * hvy
    } else {
        ; おまけ…揚力もどき
        ; if 0にすると有効になります。
        ay -= cl*vx*vx /2/m
    }
 
    ; 地面との摩擦
    if py >= (GROUND - RADIUS) {
        hvx = (0 < vx) - (vx < 0)
        ax -= mu*ay*hvx
        if (vx<0)&(vx+ax>0) : ax = -vx
        if (vx>0)&(vx+ax<0) : ax = -vx
    }
 
    ; 速度
    vx += ax : vy += ay
 
    ; 座標
    px += vx : py += vy
 
    ; 地面衝突
    if py > (GROUND - RADIUS) {
        vy *= -0.8          ; 跳ね返り係数 -0.8
        if (-g<vy)&(vy<0) : vy = 0.0
        py = GROUND - RADIUS
        ay = 0.0
    }
    return
 
*draw
    ; 画面の初期化
    color 255, 255, 255 : boxf 0, 0, ginfo_winx, GROUND
    color 128, 64, 64 : boxf 0, GROUND, ginfo_winx, ginfo_winy 
 
    ; パラメータ表示
    pos 0, 0 : color 0, 0, 0
    mes "座標( " + px + ", " + py + " )"
    mes "速度 v = " + sqrt(vx*vx + vy*vy)
 
    ; ボールの描画
    circle px-RADIUS, py-RADIUS, px+RADIUS, py+RADIUS
 
    ; 速度ベクトル描画
    color 255, 0, 0
    DrwArrow px, py, vx*5 + px, vy*5 + py
    return

サンプル解説

というわけで、今回の追加分はここ〜。

	;空気抵抗(慣性抵抗)
	if vx<0 : hvx =-1
	if vx>0 : hvx = 1
	if vy<0 : hvy =-1
	if vy>0 : hvy = 1
	ax -= vx*vx *cd/100 /2/m * hvx
	ay -= vy*vy *cd/100 /2/m * hvy


cd/100は慣性抵抗係数ぐらいに考えてください。
小数点以下を使うために1/100倍しています。

物理計算

慣性抵抗の力の大きさは

F = -1/2 * Cd * ρ * v*v * s

で求められます。 ρは空気密度、sは代表面積、cdは抗力係数でものの形と風に対する向きで決まります。。 速度が2倍になると抵抗4倍。
面積が2倍になると抵抗2倍。
同じ物体が同じ空間にあるなら、ρ、s、は変化しない。 という感じです。

Cdが結構くせもので、風に対する物体の向きによってかわります。この曲線は物体の形で決まります。
平べったいものがあったとして、それを面積の広いほうを風に向ければCdは大きくなるし、 面積の小さいほうを風に向ければCdは小さくなります。
えーっと非常に分かりにくい説明ですが、つまり、球体(ボール)ならどの方向を向いてもCdは同じです。
ゲームぐらいなら深く考えず、球体じゃなくてもCd一定と考えて問題ないでしょう。



加速度は…

F = -1/2 * Cd * ρ * v*v * s     = ma
    -1/2 * Cd * ρ * v*v * s / m = a
    - v*v * (Cd * ρ * s) /2 / m = a

と、こんな感じ。

おまけ

おまけ機能

	cl = 1:ay -= vx*vx *cl/100 /2/m	;おまけ…揚力もどき

揚力が発生する方向がいい加減です。
横に移動すると上方向に揚力が発生します。

サンプルの補足説明

そのまま実行しても慣性抵抗の影響はほとんど見えません。
粘性抵抗と地面の摩擦抵抗を無効にして地面を水平に加速しつづけると見やすいと思います。

添付ファイル:
fileb011.as
231件 [詳細]
fileb006.as
182件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:48:30 (2436d)