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

水中の運動時に考慮すべきこと

水中での運動について考慮すべきことを整理し、提示します。
アクションゲームなどで利用できるのではと思います。

物体は空中にいる時と水中にいる時では少し異なるふるまいをします。
わかりやすい言い方をすれば、重力が小さくなり、粘性抵抗や慣性抵抗が大きくなると言えます*1
重力が小さくなる度合いは物体の体積に比例します。

物理的な説明

一般に液体や気体の中にある物体には、「物体によって押しのけられた液体や気体にかかる重力」と同じ大きさの上向きの浮力(Buoyancy)が働きます。
この力は重力と逆方向なので、結果的に物体に働く重力が小さくなったように見えます。

物体の密度をρ,水の密度をρ',物体の体積をVとすれば、完全に水中にある物体に働く力は、鉛直上向きを正として次のように表されます。

a math image

つまり液体や気体の中にある物体は密度が小さくなるとも考えることができます*2
もし水中に入れた物体の密度が水よりも小さければ、重力は浮力によって完全に打ち消され、物体は水面に浮こうとします*3。 氷が水に浮くのはこのためです。

水は空気に比べて粘性が大きく、粘性抵抗は大きくなります。
慣性抵抗についてはわかりませんが、空気中より大きくなるのではないかと思います。補強よろしくお願いします。

サンプルコード

[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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
-
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
!
 
 
 
 
 
 
 
 
-
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//  浮力のサンプル(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 WATER  350.0        ; 水面の高さ
#define RADIUS 5            ; ボールの半径
#define M      1.0          ; 質量
#define MU     1.0          ; 動摩擦係数(本来は湿潤状態のため乾燥時とは異なる)
 
    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
    if (WATER <= py) {
        ; 水中にいるのでay,ita,cdが変化する
        title "浮力サンプル - 水中にいます"
        ax = 0.0 : ay = 0.6
        ita = 0.3 : cd = 0.03
    } else {
        title "浮力サンプル - 空中にいます"
        ax = 0.0 : ay = 1.0
        ita = 0.1 : cd = 0.01
    }
 
    ; 空気抵抗(粘性抵抗)
    ay -= ita * vy / m
    ax -= ita * vx / m
 
    ; 空気抵抗(慣性抵抗)
    hvx = (0 < vx) - (vx < 0)
    hvy = (0 < vy) - (vy < 0)
    ax -= cd*vx*vx /2/m * hvx
    ay -= cd*vy*vy /2/m * hvy
 
    ; 地面との摩擦
    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 (-0.6<vy)&(vy<0) : vy = 0.0
        py = GROUND - RADIUS
        ay = 0.0
    }
    return
 
*draw
// 画面の初期化
    color 255, 255, 255 : boxf 0, 0, ginfo_winx, WATER
    color 0, 0, 255 : boxf 0, WATER, 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

calcフラグの最初に水中にいるかいないかを判定し、重力や抵抗の係数を決定します。 タイトルバーにボールが水中にあるか空中にあるかを表示します。
その他の処理は今までと変わりありません。


*1 重力が小さくなるというのは物理的に正確ではありませんが、ゲームなど簡素化して使う場合は便利な考え方だと思います。
*2 もちろん物理的には正しくありません
*3 より正確には「浮力が重力と釣り合う位置まで浮上」します。このとき、上式の前提である「完全に水中にある」状態ではなくなり、最後の等号は正しくありません。
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:48:31 (2436d)