[Rigid Body]→[Rigid Body Collisions]→Collision Margin→Margin の値を変更して、爆発の範囲を調整出来る。
爆発を大きくすると、大部分の破片が落下し、表示範囲の外に出てしまうが、レンダリング時にはそれらも計算されてしまい無駄になる。
により、余計な破片を一括で削除出来る。
Rock Pile (石の破片の山)を作るチュートリアルを試す(1)
Rock Pile (石の破片の山)を作るチュートリアルを試す(2)
[Shift+A]で Plane 及びIco shpereを配置。Planeは拡大する。
Ico shpereは大きさを維持し、位置を(0,0,1)に移動する。
[Ctrl+Alt+U]でUser Preferenceを表示し、"Cell Fracture"を検索、有効化する。
Ico Sphereのオブジェクトを選択した状態で、ToolsのCell Fractureボタンを押す。
Cell fracture selected mesh objectsを次のように設定
処理が終わると、隣のレイヤーに結果のオブジェクトが生成されている。
砕かれた破片が全て選択状態のままで、
[Physics]→Add Active をクリックする。
[Physics]→[Rigid Body]でRigidを追加。続いて
この設定を、Copy from Activeですべての破片へ適用する。
最初のレイヤーへ行き、Planeを選択。Rigid Body→Type:Passiveに設定。その後[M]でPlaneを隣のレイヤーへ移す。
[Ctrl+I]で選択状態を PlaneからIco Sphereの破片へ変更する。
Ico Sphereの破片がすべて選択されていることを確認し、[Pivot Point]の種類を"Indivisual Origins"に変更し、[S]でサイズを僅かに縮小する。
Rock Pile (石の破片の山)を作るチュートリアルを試す(1)
Rock Pile (石の破片の山)を作るチュートリアルを試す(2)
シミュレーションの速度が遅すぎるのはスケールの問題との事。しかしモデルの方を縮小するとBlenderがフリーズする可能性が高くなる。この動画では、スピードの変更でより自然な速度に近づけるという手段をとっている。
speedの数字を上げることで、アニメーションが高速になる。
他のソフトウェアへエクスポートする手段として、ベイクしてキーフレームに変換する。
物理シミュレーションしている全てのオブジェクトを選択し、Bake To Keyframesをクリックする。
ベイクするフレームの範囲を指定するダイアログが出てくるので、OKをクリックする。
全て選択せずにベイクするとこうなる
質量の調整は、設定したいオブジェクトを選択した状態で
[Physics]→[Rigid Body]→Mass から設定する。
初期状態で、球体のMassを30に設定すると、鎖がちぎれる。
この場合、全ての鎖のMassをある程度上げる。選択したオブジェクトの全てのMassを上げる場合、まずアクティブなオブジェクト(Originがオレンジ色)のMassを上げ、その後Copy from Activeを押して、他のOriginが赤い選択中のオブジェクトへ適用する。
[Shift+A]→[Mesh]→Cube でCubeを追加
CubeにArrayモディファイアを三つ追加する。上から、
Count : 8 , Relative Offset = (1.032 , 0 , 0)
Count : 8 , Relative Offset =( 0, 1.02, 0 )
Count : 5 , Relative Offset = ( 0 , 0 , 1.02 )
と設定し、全てApplyする。
ArrayをApplyした後のCubeは全て一つのオブジェクトになっているので、個別のメッシュに分割する。
1.Editモードへ行き、全て選択
2. [P] → By loose parts
このままでは、オブジェクトのOriginが全て一カ所に集まっている。Blenderの物理シミュレーションはOriginの位置を重心として扱うため、各キューブのOriginを各キューブの中心へ移動しなければ上手く動かない。
[Ctrl + Alt + Shift + C] → Origin to Geometry を適用する
Cube一つを選択状態にし、[Physics]→[Rigid Body]を有効にし、Massを0.1に設定する。
今設定した(青くなっている)Cubeを含め、他のCubeも全て選択し、Copy from Activeで全てのCubeに設定をコピーする
[Num+7]で上面からの図に切り替え、Editモードへ移行し、Torusを楕円にする。その後[Shift+D]で複製し、[R+Y]で90度回転する。
なお、動画で使っているのは[Shift+R]というリピート機能。ただしこの機能を使う場合、[Shift+D]をした後[ESC]すると[ESC]が最後の作業と見なされてしまうので、[Shift+D→ドラッグ]でなければならない。
鎖の一つを選択し、
[Physics]→[Rigid Body]→
[Rigid Body Collisions]→[Shape]
を"Mesh"に設定
Rigid Bodyを設定した鎖をアクティブにし、その他の鎖を選択する。
[Physics]→Copy from Active
で最初の鎖の設定を全てに反映
落下したときに落ちる地面を追加する。
[Physics]→[Rigid Body]→[Rigid Body]→[Type]→Passive
[Physics]→[Rigid Body]→ Dynamicのチェックを外す
オブジェクトのOrigin(オレンジ色の点)がシミュレーション時にオブジェクトの重心として計算されるため、Originをオブジェクトの中心にしておく。鎖を全て選択し、
[Ctrl + Alt + Shift + C]→ Origin to Geometry を選択
1.固定されている鎖(一番上)を選択
2.[Shift+S]→Cursor to Selected
3.[3D Cursor]を選択
4.全ての鎖を選択
5.[R]で回転
VCG LibraryのBall Pivotingを使用してみます
#include <vcg/complex/algorithms/create/ball_pivoting.h>
int X = 50; int Y = 50; auto itr = vcg::tri::Allocator<MyMesh>::AddVertices(mesh,X*Y); for (size_t x = 0; x < X; x++) { for (size_t y = 0; y < Y; y++) { double d1 = rand() % 100 / 2000.0; double d2 = rand() % 100 / 2000.0; double d3 = rand() % 100 / 7000.0; double dx = x / (double)X; // 0.0 ~ 1.0の範囲にする double dy = y / (double)Y; itr->P().X() = dx + d1; itr->P().Y() = dy + d2; itr->P().Z() = d3; ++itr; } }
double radius = 0.05; double clustering = 0.03; tri::BallPivoting<MyMesh> pivot(mesh, radius, clustering); pivot.BuildMesh();
BPAは既に存在する点群に対して実行します。
radiusはボール径です。radiusによって結果が大きく変わります
VCG LibraryのBall Pivotingでメッシュ生成
VCG Library ターゲットの周辺のオブジェクトを取得
#include <vcg/space/index/kdtree/kdtree.h>
auto itr = vcg::tri::Allocator<MyMesh>::AddVertices(mesh, 30000); for (size_t i = 0; i < 30000; i++) { double k1 = rand() / (double)RAND_MAX; double k2 = rand() / (double)RAND_MAX; double k3 = rand() / (double)RAND_MAX; itr[i].P() = vcg::Point3f(k1, k2, k3); itr[i].dist = 0.6; }
// 検索して得られた頂点IDを格納する std::vector<unsigned int> vpid; // 検索して得られた頂点の、指定した座標からの距離を格納する std::vector<float> vpdst;
vcg::VertexConstDataWrapper<MyMesh> ww(mesh); vcg::KdTree<float> tree(ww); //検索する座標 p を定義 vcg::Point3f p(0.5, 0.5, 0.5); double distance = 0.5; //検索 tree.doQueryDist(p, distance, vpid, vpdst);
//検索して得られた頂点に、pとの二乗距離を格納(distメンバ変数は自分で定義したもの) for(int i = 0; i < vpid.size();i++){ mesh.vert[ vpid[i] ].dist = vpdst[i]; }
doQueryDist(
const VectorType& queryPoint,
float dist,
std::vector& points,
std::vector& sqrareDists
)
距離計算に内部で使っているquaredNorm()関数の処理は、
/// Squared euclidian normal inline T SquaredNorm() const { return _v[0]*_v[0] + _v[1]*_v[1] + _v[2]*_v[2] + _v[3]*_v[3]; }
となっていますので、実際の距離を知りたい場合はsqrtする必要があります。
VCG LibraryのBall Pivotingでメッシュ生成
VCG Library ターゲットの周辺のオブジェクトを取得
VCG LibのFace-FaceやEdge-Faceなどの関連付け
HTMLはたまにしか使わないのでその度に忘れるのでメモ。
HTMLの<ul><li></li></ul>の、liの左のオフセットが広すぎてなんとかしたいとき。liではなく、ulのpaddingを設定します。
<html> <head> <style type="text/css"> <!-- div.box{ width:200px; height:200px; margin-left:50px; border:solid thin black; } ul{ border:solid thin blue; padding-left:0px; } li{ border:solid thin red; } --> </style> </head> <body> <div class="box"> <p>いろは</p> <ul> <li>こんにちは</li> <li>こんばんわ</li> </ul> </div> </body> </html>
①animation:Full Rangeを選択
②Renderボタンをクリック
③Outputで出力パスを指定