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
type t = Vec3.t -> Vec3.t -> Vec3.t
let none _ _ = (0., 0., 0.)
let uniform a _ _ = a
let gravitation ~gm ~center pos _ =
let d = Vec3.sub center pos in
let r = Vec3.length d in
if r < 1e-9 then (0., 0., 0.) else Vec3.scale (gm /. (r *. r *. r)) d
let spring ~k_over_m ~anchor pos _ = Vec3.scale k_over_m (Vec3.sub anchor pos)
let drag ~c _ vel = Vec3.scale (-.c) vel
let submerged ~water ~half_height y =
if half_height <= 0. then if y < water then 1. else 0.
else Float.max 0. (Float.min 1. ((water -. (y -. half_height)) /. (2. *. half_height)))
let buoyancy ?(damping = 1.5) ~g ~water ~half_height ~density () (_, y, _) vel =
let s = submerged ~water ~half_height y in
let up = (g *. s /. density) -. g in
Vec3.add (0., up, 0.) (Vec3.scale (-.damping *. s) vel)
let sum fs pos vel = List.fold_left (fun acc f -> Vec3.add acc (f pos vel)) (0., 0., 0.) fs