カテゴリー別アーカイブ: 計算

計算、物理シミュなどのプログラミング

骨付きSoftBodyによる挙動制御

SoftBodyである程度形状を保ったまま、柔らかい物体を表現するのは大変です。複雑な構造にしたり、拘束を強くするなどで形状を保てますが、そうすると柔らかさの調整が困難に、作成にも手間がかかり過ぎます。
この問題の解決方法として、SoftBody内部に剛体を配置、接続する「骨付きSoftBody」というものを考えました。

続きを読む 骨付きSoftBodyによる挙動制御

非圧縮性流体を使った SoftBodyの挙動制御

なんか難しそうなタイトルですが、ようするにSoftBody内部を水で満たすことで動きの制御を行う方法を考えてみました。と思ったら、すでにSoftBodyにその機能がありました。体積を一定に保つように全ノードに膨張または縮小させる力を働かせるための設定とパラメータが用意されています。
なので、その機能の説明と適用した場合の動きを紹介します。

SoftBodyを布に使ってみようとしていましたが、まったくうまくいかないので、本来のSoftBodyの使い方に戻します。何百回と形状やパラメータを調整してもダメでした(心が折れました)。

続きを読む 非圧縮性流体を使った SoftBodyの挙動制御

Bullet-SoftBody講座 基礎編

SoftBodyについての解説をあまり見かけないので、作ってみました。自分の理解を深めるために作った動画ですが、よかったら参考にしてください。


続きを読む Bullet-SoftBody講座 基礎編

BulletのSoftBodyでスカートを揺らしてみる

前回のぬいぐるみを作ってみるでは、モデル全体をSoftBodyで動かしていましたが、今回は部分的に動きを反映させてみます。ただし、通常のボーンとSoftBodyの動きを混ぜることはできません。完全に動きを分離できるものに限ります。その条件を満たしているオブジェクト(スカート、髪など)をSoftBodyで揺らし、それ以外はモーションデータで動かします。
部分的な反映はボーンによるスキン変形の仕組を利用しているので対応は簡単ですが、ボーンの動きにSoftBodyやコリジョン用剛体を追従させる処理が簡単ではないため、その方法を中心に解説します。

SoftBodyをスカートなどに
SoftBodyをスカートなどに

続きを読む BulletのSoftBodyでスカートを揺らしてみる

Bulletでぬいぐるみを作ってみる Part1 簡易形状によるスキニング

SoftBodyを使って、ぬいぐるみを再現しみます。SoftBodyのポリゴン数に制限があるようなので、ローポリモデルをソフトボディーで動かし、その動きをハイポリモデルに反映するという方法を採用します。これでSoftBodyの制限回避と計算負荷を軽減しつつ、見た目の良いハイポリモデルを動かすことが可能になります。
今回、解説動画を作成しました。大まかな説明は動画で行って、ここではローポリとハイポリモデルの連動について解説します。

SoftBodyぬいぐるみ
SoftBodyぬいぐるみ

続きを読む Bulletでぬいぐるみを作ってみる Part1 簡易形状によるスキニング

Bullet Physics ソフトボディーを使ってみる

Bullet PhysicsのSoftBodyが前から気になっていたので試してみます。ソフトボディーと聞いてまず”ぬいぐるみ”を思い浮かべたので、ぬいぐるみっぽい動きを実現することを目標にします。
まずは、任意形状のポリゴンモデルをSoftBody機能を使って動かすために必要な準備やパラメータ設定を調べ、実験用プログラムを作成します。

ソフトボディー(任意形状) GIFアニメ
ソフトボディー(任意形状) GIFアニメ

続きを読む Bullet Physics ソフトボディーを使ってみる

Bullet Physicsを使ってみる VS2013&DirectX11

Visual Studio 2013でBullet Physicsをビルド、環境構築してみます。それと、デバッグ表示(OpenGL)をDirectX11での表示に変更してみる。

Bullet Physics デバッグ表示
Bullet Physics デバッグ表示

続きを読む Bullet Physicsを使ってみる VS2013&DirectX11

ジオメトリシェーダで輪郭線表示

ジオメトリシェーダを使って輪郭線を表示してみます。方法は法線方向への拡大&裏面描画ではなく、ポリゴンエッジに輪郭線をつけるかどうか判定し、エッジ(辺)に沿ってラインを描画します。

ジオメトリシェーダで輪郭線
ジオメトリシェーダで輪郭線

続きを読む ジオメトリシェーダで輪郭線表示

位置を共有している頂点のマージアルゴリズム

3Dモデルデータの最適化のために、ほぼ同じ位置にある頂点データを1つにまとめる(マージする)処理を作成します。総当たりで近い位置にあるか比較していけば簡単に実装できると思っていました……
これまでの経験では数千頂点程度のマージ処理だったので、それほど実行速度を気にすることはありませんでした。が、今回約70000頂点のマージを総当たり比較で処理したところ、処理時間1分間以上。違う方法を考えなければ。

続きを読む 位置を共有している頂点のマージアルゴリズム

頂点シェーダでスキニングと頂点ブレンド 可変長の定数バッファ

頂点シェーダでスキニングと頂点ブレンドを行います。基本的な原理などは多くの場所で公開されているので省略、DirectX11での実装について説明します。
ボーンウエイト付のモデルデータは自作できないので、入手しやすいPMD/VMDファイルを使用します。

PMD/VMDの表示再生
PMD/VMDの表示再生

続きを読む 頂点シェーダでスキニングと頂点ブレンド 可変長の定数バッファ