仮眠プログラマーのつぶやき

自分がプログラムやっていて、思いついたことをつぶやいていきます。

自作ゲームやツール、ソースなどを公開しております。
①ポンコツ自動車シュライシュラー
DOWNLOAD
②流体力学ソース付き
汚いほうDOWNLOAD
綺麗なほうDOWNLOAD
③ミニスタヲズ
DOWNLOAD
④地下鉄でGO
DOWNLOAD
⑤ババドン
DOWNLOAD
⑥圧縮拳(ツール)
DOWNLOAD
⑦複写拳
DOWNLOAD
⑧布シミュレーション
DOWNLOAD
⑨minecraft巨大電卓地形データ
DOWNLOAD
⑩フリュードランダー
デジゲー博頒布α版
DOWNLOAD
⑪パズドラルート解析GPGPU版
DOWNLOAD
⑫ゲーム「流体de月面着陸」
DOWNLOAD

2012年02月

流体力学のプログラムを作りたい!その2

「その1」で流体の挙動を最低限シミュレートできたはずである。
次は少しステップアップして、流体の可視化と、流体の中に存在する「動く障害物」に対してどう処理するかというところを見ていこう。


【可視化 
これはかなり独学なところもあったが、基本は「渦度」を画面に出力すればらしい映像が得られる、という認識で間違いないと思う。

百聞は一見に如かず
画像左半分が128*128格子の渦度の可視化画面
o0512025611361324083

ちなみに右は圧力の可視化。

渦度を求める方法はいろいろすっ飛ばした結果以下のとおり。

a3a

渦度=(A+B+C+D)/4


AとCは、x速度の定義点におけるy速度、BとDはy速度の定義点におけるx速度を表している。
それぞれの速度は、定義点から外れているため、近傍4点から平均を取ってくるなどの方法をとってうまく計算する。
渦度の画面出力は、マイナス値を赤、プラス値を緑などとし、値の大きさと色をフィーリングで比例させればだいたい↑のようなレンダリング結果が得られるだろう。


あと計算高速化のアイディアとして、細かいことをきにしなくていいなら、平均処理をしないで渦度を求めることだってできる。
渦度=周囲4点の時計(又は反時計) 回りへ の速度を平均したもの
とラフに考えれば、格子の「角」における渦度はどうなるか。



a3b

これならx速度、y速度の値をそのまま使えるため計算コストが低く抑えられる。



次に、渦度だけでは画面が寂しいというのなら、幾万ものドット粒子を浮遊させるというのもよくある良い可視化手段である。
srtnh


粒子の移動速度は当然流体の速度と同じで、近傍の速度定義点から求めてやればいい。
a3c


ちなみに3次補間と比べ精度の低い線形補間(バイリニア補間)で求めても粒子の動きは見た目問題ないほど非常になめらかであった。


【流体の中で動く障害物  
流体の計算の醍醐味は、障害物の存在下で流体がどのような挙動を取るのかを見て楽しむことにある。

asdfgv

このように、移動する障害物を流体力学の計算にどのように組み込んだらいいのか。
ここでもスタガード格子ということで考えてみる。

まず格子ごとに、この格子が障害物か流体かを識別するための配列変数「kabe」、を作る。
可動障害物でも静止障害物でも、ある時刻tにおけるある格子が障害物であるときkabeは0の値を取り、流体であるとき1の値を取る。

次に、流体内に、移動しない障害物があるときの処理をおさらいする。
このとき、障害物の境界で強制的に流速を0にすれば良かったはずだ。
一方、障害物が移動することを考えると。
ここのサイトによると、このときの境界の条件は、流速=障害物の移動速度、となる。


最初に、一番単純化して格子の長さが1m×1mとして、1格子からなる最小単位の障害物がx方向に1m/sで動くプログラムを考える。
またΔt=0.2sとする。

最初のt=0.0sの時点では当然こうなる。
a5a
濃い灰色と薄い灰色の速度は固定である。そのため移流や圧力の影響を受けない。
また変数kabeは1と0だけで定義できる状態だ。


さて次にt=0.2sではどうなるか。
a5b
理想ではこうしたいところではあるが、障害物の側面が速度定義点から外れる上、1格子内に壁成分と流体成分が混じっているため、 変数kabeは1と0だけで定義できない状態となる。 

つまり正解はこうなる。
a5a
これはt=0.0sの状況と全く同じである。
これでいいのかと思うかもしれないが、これで良い!


そしてt=1.0sまでタイムステップを進めたとき、↓のようにすれば良い。
a5c


ということはt=0.8sの時点で一番誤差が大きくなり、1m^2の面積の格子に0.8m^2分の誤差流体が入っていることになる。
こんな言い方をしたくないが、こればかりは仕方がない。


そしてつぎに斜め移動の場合を考える。例えば斜め右下30°に1.0m/sの速度を持つ壁としたら、境界条件はx速度=0.87m/s 、y速度=0.5m/s
に固定すれば良い。
そこら辺はさっきのリンク ここ の下の方の説明画像を見ればわかると思う。



ところで話はかわり、タコマ橋という有名な橋があるのだが、これは完成後すぐに横風によるカルマン渦が発生して上下に振動し、ついには崩壊してしまったアメリカの橋だ。
このように、障害物(壁)が流体の力を受けて移動する場合の計算は、ポアソン方程式で圧力計算が終わったあとの障害物周囲の圧力を障害物に働く力として計算すればよい。


これで可動障害物の話は終わり。





最後に。

iPhoneアプリで面白い物を見つけた。
「wind tunnel lite」という格子法で計算されているCFDアプリだ。
指で流体を動かせる機能も付いている。
当然フルにスペックを使って計算されているはずなので電池消耗アプリとしていいかもしれない・・・(そんな馬鹿な)

そして風上差分の大欠点である数値拡散を抑えるため、CIP法の勉強を最近始めたので 
次の記事にはCIP法についてわかったことを書いていこうと思う。

今回お世話になった参考文献。
http://news.mynavi.jp/articles/2007/10/09/cedec01/006.html
(やはり西川善司さんの講座は参考になる)


次回:流体力学のプログラムを作りたい!その3

Hand Brakeドラッグ&ドロップ化計画

今回はちょっとラフな記事で
HSPで便利ツールを作ったよという話。。。


アニメをiPod Touchで持ち歩くため動画変換に愛用しているHandbrake (英語版)
携帯動画変換君よりbyteあたりの画質が良い(気がする)
外国製のソフトで、かなり評価が高く日本でもよく使われているのだが欠点が3つある



・複数の動画を選択してドロップすると、1番目の動画だけ読み込み2つ目以降が無視される
・読み込んだ動画の数だけ「Add To Queue」のボタンを押さないといけない
・ファイルの名前に日本語が入っていると出力名が文字化けする 



1つ目の欠点の解決法は、フォルダ全体を読み込みできる機能があるので、ドロップはあきらめてフォルダの選択をすると、中にある複数の動画が一気に読み込まれる。だが日本語版だとフォルダを選択した際にエラーを吐く。
それに、この機能一瞬便利かと思うのだが、複数の動画が入っているフォルダすらも複数ある場合は、やはりめんどくささがフォルダの数に比例して増すためやっぱ微妙。 

2つ目の解決法はなく、↑で言ったようにフォルダで動画を一気に読み込んでも、その後、動画の数だけボタンを押す操作は必須。なんという仕様・・

3つ目の解決法は日本語版をダウンロードすればいいのだが、そうするとフォルダ選択でエラーを吐く・・の堂々めぐり


1、3は英語版、日本語版の独特の不具合であるが
結局、2つめの欠点があるかぎり、何度も同じボタンを押すという煩わしさから解放されないのだ。



そこで、携帯動画変換君みたくドラッグ&ドロップで変換リストを作れるようにし、Handbrake(英語版)でも日本語出力で文字化けしないツールを作ってみた。
これがそれ
Handbrakeドラッグドロップツール

我ながらネーミングはひどいと思う
実際キューに直接ドロップするわけでなく、このソフトにドロップしてからHandbrake専用規格に変換して移すので、タイトル通りのHandbrakeでドラッグ&ドロップができたーというのは嘘になるのだが・・


以下はReadme の一部抜粋
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
【概要】

このソフトは、ウィンドウにドロップされた複数の動画ファイルをHandbrakeの専用規格「.queue」形式で出力するソフトです。
Handbrakeでそれをインポートすることで全部の動画を「Add To  Queue」 を押したあとの状態にすることができます。

【操作方法】

起動したら、ウィンドウに動画をドロップして下さい。終わったら中央の「.queueの出力&終了」ボタンを押して
出力された「save.queue」をHandbrakeのキュー画面からインポートすると、さっきドロップした動画全ファイルがキューに溜まっているのがわかるかと思います。
あとは迷わず「Encode」ボタンを押して、save.queueは捨てて下さい。

Handbrakeと連携して初めて活躍するソフトなのでまずHandbrakeがインストールされていることが前提です。
Handbrakeの細かい設定をいじっている人は細部の変更が反映されないかもしれません。(settingフォルダの規定の「○○.txt」をいじればあなたの設定通りに出来ると思います。)



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





もしダウンロードしてくださった方で何か不具合を発見があった方は、 良ければ コメント欄に書き残してもらえるとデバッグがはかどるのでご協力よろしくおねがいします。 


PS・・いくつかバグを修正しましたがXP32bitでの環境でエラー終了するバグが残っています、今直してます・・あとHand brakever 0.9.6がリリースされましたが、本ソフトの出力するqueueはver.0.9.5以下にしか対応してません。これも直してます・・・
プロフィール

toropippi

記事検索
アクセスカウンター

    QRコード
    QRコード
    • ライブドアブログ