質量の調整は、設定したいオブジェクトを選択した状態で
[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は全て一つのオブジェクトになっているので、個別のメッシュに分割する。
このままでは、オブジェクトの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]→[Type]→Passive
[Physics]→[Rigid Body]→ Dynamicのチェックを外す
オブジェクトのOrigin(オレンジ色の点)がシミュレーション時にオブジェクトの重心として計算されるため、Originをオブジェクトの中心にしておく。鎖を全て選択し、
[Ctrl + Alt + Shift + C]→ Origin to Geometry を選択

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で出力パスを指定

Blenderでhdrファイルを読み込んでEnvironmentに指定して背景を描画します。

pngの時はImg No Alphaをチェック


レンダリング時の注意として、pngで出力する場合、そのままだと(なぜか)背景が描画されません。jpegなどならちゃんと出力されます。
仕方がないので、Outputを指定し、Img No Alphaをチェックします。
http://vcg.isti.cnr.it/vcglib/trimesh__smooth_8cpp_source.html
VCG Libraryでスムージングするには、VertexCoordPasoDoble関数を使います。公式のサンプルにあるように
vcg::tri::Clean<MyMesh>::RemoveDuplicateVertex(mesh); vcg::tri::Clean<MyMesh>::RemoveUnreferencedVertex(mesh); vcg::tri::UpdateTopology<MyMesh>::VertexFace(mesh);
が必要です。
さらに、 VertexCoordPasoDoble 関数内で、
RequireVertexCompactness<MeshType>(m); RequireFaceCompactness<MeshType>(m); RequireEdgeCompactness<MeshType>(m); RequireTetraCompactness<MeshType>(m);
とチェックが入っているので、
vcg::tri::Allocator<MyMesh>::CompactVertexVector(mesh); vcg::tri::Allocator<MyMesh>::CompactEdgeVector(mesh);
等が必要になる場合があります
vcg::tri::Clean<MyMesh>::RemoveDuplicateVertex(mesh); vcg::tri::Clean<MyMesh>::RemoveUnreferencedVertex(mesh); vcg::tri::UpdateTopology<MyMesh>::VertexFace(mesh); vcg::tri::Allocator<MyMesh>::CompactVertexVector(mesh); vcg::tri::Allocator<MyMesh>::CompactEdgeVector(mesh); int Step = 2; int NormalSmoothStep=3; float Sigma=0.5; int FitStep=4; for (int i = 0; i < Step; ++i) { vcg::tri::UpdateNormal<MyMesh>::PerFaceNormalized(mesh); vcg::tri::Smooth<MyMesh>::VertexCoordPasoDoble( mesh, NormalSmoothStep, Sigma, FitStep ); }




VCG LibraryのBall Pivotingでメッシュ生成
VCG Library ターゲットの周辺のオブジェクトを取得
Unicodeはどんな文字でも対応してるからwstringをwcoutすれば何でも表示出来るはず
#include <iostream> #include <string> int main() { std::locale::global(std::locale("japanese"));// ① std::wstring hello = L"こんにちは"; std::wcout << hello; getchar(); return 0; }


なぜUnicodeなのにsetlocaleしなければ文字が出力出来ないか。
それは、
コマンドプロンプトがShift-JISしか表示出来ないため、
wcoutはShift-JISで文字列を出力せねばならず、
wcout自身は自分がどんな環境で動いているか関知していないので、
localeでShift-JIS環境だと教えてあげる必要がある
という理屈からだ。
自分が作ったアプリケーション内で、どのように文字列を処理しようがそれは作った者の自由だ。別にshift-jisやunicodeである必要はない。必要があれば自分定義した文字コードで書いたっていい(もの凄い労力だろうが)。
しかし、それを出力するなら、出力先の仕様に合わせる必要がある。出力先がどんな文字コードに対応しているかを教えるのがlocaleの役目となる。
#include <iostream> #include <string> #include <fstream> int main() { std::locale::global(std::locale("japanese"));// ① std::wstring hello = L"こんにちは"; std::wofstream wof(L"test.txt"); wof << hello; return 0; }

ファイル出力に関しても同様で、Lをつけてワイド文字指定しても、wofstreamが自動的にShift-JISへ変換して出力する。