Open3DでMesh Deformationを行ってみる
以下の動画のように、3次元メッシュモデルの一部をつまんで変形をさせる場合の代表的な手法としてAs-Rigid-As-Possible(ARAP)という制約を用いた方法がある。 As-Rigid-As-Possible Surface Modeling, EUROGRAPHICS/ACM SIGGRAPH Symposium on Geometry Processing 2007 この方法では、変形の前後で局所的な構造(各頂点の相対的な位置関係)を保つような制約を用いた最適化によって変形後の各頂点位置の算出を行っている。ARAPを用いた変形に関しては、 CGAL や libigl にも実装がされているが、 Open3D にも 0.9.0 から実装がされているのでこちらを試してみた。 #include <iostream> #include <string> #include <open3d/Open3D.h> int main(int argc, char** argv) { // モデルの読み込み open3d::geometry::TriangleMesh input_mesh; open3d::io::ReadTriangleMeshFromOBJ("../model/elefante.obj", input_mesh, true); // 変形後のモデル std::shared_ptr<open3d::geometry::TriangleMesh> output_mesh; // 制約を付加する点のIDと頂点位置 std::vector<int> constraint_idx; std::vector<Eigen::Vector3d> constraint_pos; int count = 0; for (size_t i = 0; i < input_mesh.vertices_.size(); ++i) { Eigen::Vector3d vtx = input_mesh.vertices_[i]; if (vtx.z()...