2008-05-16[n年前へ]
2008-05-30[n年前へ]
■(加速度センサ対応)体感・実感バストシミュレータを作る
体感・実感バストシミュレータを作ってみました。アプリケーションのウィンドーを揺らしたり、(もしThinkpadユーザなら)PCを揺らしたりすると、その振動に応じた変形を計算・表示するというシミュレータです。下の動画はその(Windows上で動作する)アプリケーションを動かしている例になります。マウスでウィンドーを動かすと、その力(加速度)に応じた複雑な変形が生じたりすることが見て取れると思います。
また、Thinkpadを持ち上げ、傾けてみたり・揺らしてみたりすると、その動きに対応する変形が生じるので、まるでバーチャルリアリティのようにその変形の因果関係を体感できるかもしれません。端的に言ってしまえば、このアプリケーションを動かしつつ胸の前でThinkpadを持って体を動かすと、その動きに応じた変形シミュレーション計算結果を刻々表示(レンダリング)する、なんていう遊びもできるわけです。
不可思議に見える動きでも、案外こんな実験をしているうちに、その因果関係を実感・納得できるかもれいません。それが、「体感バストシミュレータ」だったりすると、ナニな感じは漂いますが、そんなクダらなさがこのサイトの一つの特徴でもあるので、(色々な視点から眺めた下の動画でも)適当に流し見しつつ・楽しんで頂けたら幸いです。
このアプリケーション(バイナリ実行ファイル)はここに置いてあります。計算部はC++で適当・速攻で作り、(皮膚からの表面張力を働く)弾性・塑性的な性質を持つPartcleクラスを多数保持するBodyクラスにより、変形状態が計算される、という具合です。書き飛ばした部分を整理し、C++ Bodyクラスのソースも近々置いてくことにしようと思っています。
2008-06-01[n年前へ]
■(加速度センサ対応)体感・実感バストシミュレータのC++クラスソース
「(加速度センサ対応)体感・実感バストシミュレータを作る」のC++クラス・ソース(及びバイナリ)を置いておきました。本当に行き当たりばったりに書いたので、とても乱雑で汚く・遅い代物です。なお、使い方はこんな具合になります。
Body body;中身は、粒子郡を拘束力で適当に包むと同時に外力を与えているというようになっていて、金子さんの水粒子プログラムの単純版です。
body.move();
float *mesh=body.fMesh;
for(int y=-40;y<=40;y++)
for(int x=-40;x<=40;x++,mesh++)
//SurfacePlot(x, *mesh, y);
// この*meshに高さが入っている
2008-06-03[n年前へ]
■「GPUを使った物理計算プログラム」と「スクリプト言語」
日経エレクトロニクスを読んでいると、「GPUを使った並列計算で物理シミュレーションを高速化」という記事があった。PC用のグラフィックボードに搭載されている描画処理LSI(GPU)での物理計算の解説記事で、流体などの挙動を粒子群として計算するプロメテック・ソフトウェアの計算ソフトウェアを題材に、GPUで物理計算をする効果や注意点などを解説したものだった。そういえば、つい最近、「NVIDAがGPUベースのレンダリングソフトNVIDIA Gelato Proを無償提供開始」というニュースもあった。
ところで、GPUを使ったシェーダプログラム言語であるGLSL (OpenGL Shading Language)に触れたときに感じた新鮮さは、「GLSLで書かれたプログラムは、実行時にコンパイルされる」ということだった。シェーダのソースコードを書き換えると、そのシェーダを使ったアプリケーション実行すると、その実行時にシェーダプログラムがコンパイルされ動くのである。
その感覚はとても新鮮で、「C言語のようでCでない変なスクリプト言語」をいじっているような面白い感覚を味わった。また、自然に並列計算される具合が、何だか非同期で動くアプリケーションをスクリプト言語で書く感じに似ているのだろうか、と感じたりもした。
JavascriptやRubyや…といったスクリプト言語を使うプログラマが、GPUを使ったプログラムをいじってみると、これが結構ハマったり楽しむことができたりするものかもしれない。
2008-06-06[n年前へ]
■体感・実感バストシミュレータの内側(粒子群)を見る
「GPUを使った物理計算プログラム」と「スクリプト言語」で読んだ日経エレクトロニクスの、「粒子が動いて流体を表現するさまを示した図」が見ていて綺麗だったので、先日作ったプログラム、粒子法を使った(加速度センサ対応)体感・実感バストシミュレータにも表面レンダリングだけでなく粒子レンダリングの機能を付けてみました(バイナリはここに置いておきます)。
アプリケーションを実行させて、「皮膚」=表面層の内側を眺めたさまは下の動画のようになります。