書きかけ
Unityで船の船体シミュレーションをやりたいということで色々調べた結果をまとめていくかもしれません。
自分はUnityの新Water Systemを使っていますのでそれ前提で言及することもあるかもしれませんが、基本的な考え方は船シミュレーションとして普遍的な内容です。
※飛行シミュレーションから船体のシミュレーションにも手を伸ばしたという人間が書いたので、
船のシミュレーションをちゃんとしている人からすると変なことを言ってるかもしれません(船シミュの正攻法が良く分かってないため)
あと専門家でも何でもないので普通に間違ってる可能性があります。
船体にはいろんな力が働くそうですが、おそらく浮力と抵抗に分けられるんじゃないかと思います。
アヒルのおもちゃをお風呂に沈めると浮いてくるみたいな力です
浮力は以下の公式で求められるそうです。
F = -p × V × g
(※Wikipediaから丸写しした内容です)
このうち、水の密度はだいたい1000kg/m^3であると判っているし、重力加速度もわかっているのでこの2つは定数でよいです。
なので実質的にはV(物体の水没している部分の体積)だけ求めれば浮力は簡単に求められそうです。
浮力のシミュレーションは大体「水没している部分の体積を如何にして求めるか?」の話題が中心になっている印象があります。
例えば、箱の体積は各辺の長さを「縦×横×高さ」で計算すれば簡単に求まります。
あるいは球体であれば「4/3×体積×体積×体積×円周率」で求められるそうです。
しかし、ボートは単純な箱や球ではないので、まずそもそも水没した体積以前に、水没していない状態での体積をいかにして求めるかという問題が出てきます。
これについては、船体を細切れにして考えて、例えば細い柱の束で船体を近似して、各柱の体積を求めるといった方法でほどほどに正確な値が求まるのであまり難しくないはず。
またはちょっと複雑になりそうですが、メッシュの三角形から三角錐を作り出してやるなどすればもっと正確な値が求められるんじゃないかと思います(やり方は知らない)
しかし精密なシミュレーションならともかく、シンプルな船ゲーム程度であればそこまで正確な値を求める必要はないです。
ボートの船体を考えてみる
船体をボックスやボクセルで近似するとかすれば大まかな体積は簡単に求まりそう
問題は、水没した体積のほうです。
水面が平坦で船も水面に平行であれば割と簡単そう。
各柱が何パーセント水没しているかがわかれば、それを合計して全体の水没率に換算できます。
船体の体積が7m^3で、60%が水面下に水没していれば、7×0.6=4.2(m^3)が沈んでいる部分の体積 ・・・というように計算できます。
しかし、船が傾いていたりすると話はややこしくなります。
さらに、水面が波立っている場合は場所によって波が高かったり低かったりするのでこういう平坦な計算では対応できません。